diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 45d6aecf87..0af479eb2d 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -7,6 +7,12 @@ "advancements.anvilcraft.anvil_accelerator.title": "ɹoʇɐɹǝꞁǝɔɔɐ ꞁᴉʌuⱯ", "advancements.anvilcraft.anvilon.description": "uoꞁᴉʌuɐ pǝuᴉɟuoɔ ɟo ǝdʎʇ ʎuɐ ʇɟɐɹɔ oʇ uoᴉsᴉꞁꞁoɔ ꞁᴉʌuɐ ᵷuᴉs∩", "advancements.anvilcraft.anvilon.title": "uoꞁᴉʌuⱯ", + "advancements.anvilcraft.black_hole.description": "ǝꞁoɥ ʞɔɐꞁq ɐ oʇuᴉ ʇᴉ ǝsdɐꞁꞁoɔ puɐ puǝ ǝɥʇ oʇ uoᴉʇnꞁoʌǝ s,ɹɐʇs ɐ ǝʌᴉɹᗡ", + "advancements.anvilcraft.black_hole.title": "sǝdɐɔsƎ ʇɥᵷᴉꞀ uǝʌƎ ʇoN", + "advancements.anvilcraft.cannon_fodder.description": "ʇǝuɐꞁd ǝʞᴉꞀ-pꞁɹoʍɹǝʌO uɐ ǝpᴉsuᴉ ǝsdɐꞁꞁoɔ ʎɹɐʇǝuɐꞁd ɐ oʇ ǝᴉᗡ", + "advancements.anvilcraft.cannon_fodder.title": "ɹǝppoℲ uouuɐƆ", + "advancements.anvilcraft.come_at_night.description": "ɹɐʇs ɐ ʎq pǝꞁꞁᴉʞ ʇǝ⅁", + "advancements.anvilcraft.come_at_night.title": "ʇɥᵷᴉN ʇⱯ ǝɯoƆ pꞁnoɥS no⅄", "advancements.anvilcraft.crab_claw.description": "sʍɐꞁɔ qɐɹɔ uᴉɐʇqO", "advancements.anvilcraft.crab_claw.title": "ǝɔɐɹ uoᴉʇɔǝɹɹnsǝɹ ǝɥʇ ɟo ɟꞁɐɥ uᴉM", "advancements.anvilcraft.dang.description": "ᵷuᴉʇɟɐɹɔ ꞁᴉʌuɐ ʎuɐ ɯɹoɟɹǝԀ", @@ -15,6 +21,8 @@ "advancements.anvilcraft.devourer.title": "sɹǝʇsᴉʍʇ ǝnᵷuoʇ ʎuɐɯ oo⟘", "advancements.anvilcraft.durable_goods.description": "ǝpɐɹᵷ ꞁǝǝʇs ꞁɐʎoᴚ oʇ ꞁooʇ ʎuɐ ǝpɐɹᵷd∩", "advancements.anvilcraft.durable_goods.title": "spooᵷ ǝꞁqɐɹnᗡ", + "advancements.anvilcraft.efficiency.description": "ʇɹɐdɐ ʇǝuɐꞁd ǝɥʇ ʍoꞁq puɐ ɹoʇɐʌɐɔxǝ ʇǝuɐꞁd ǝɥʇ oʇuᴉ ɹǝsɐꞁ ɐɯɯɐᵷ ɐ pǝǝℲ", + "advancements.anvilcraft.efficiency.title": "ʎɔuǝᴉɔᴉɟɟǝ ˙˙˙ʇᴉ pǝꞁꞁɐɔ ǝM", "advancements.anvilcraft.electric_allergy.description": "ɯǝʇsʎs ɹǝʍod ʇnoɥʇᴉʍ ꞁᴉʌuɐ ᵷuᴉᵷɹoɟ ꞁɐᴉʇsǝꞁǝɔ uᴉɐʇqO", "advancements.anvilcraft.electric_allergy.title": "ʎᵷɹǝꞁꞁɐ ɔᴉɹʇɔǝꞁƎ", "advancements.anvilcraft.electric_filed_rhythm.description": "pᴉɹᵷ ɹǝʍod ǝɥʇ ɟo ǝdoɔs ǝɥʇ uᴉ dǝʇS", @@ -63,10 +71,14 @@ "advancements.anvilcraft.mining_void.title": "pᴉoʌ ᵷuᴉuᴉW", "advancements.anvilcraft.networking.description": "ǝꞁod uoᴉssᴉɯsuɐɹʇ ǝɔɐꞁd puɐ ʇɟɐɹƆ", "advancements.anvilcraft.networking.title": "ᵷuᴉʞɹoʍʇǝN", + "advancements.anvilcraft.neutron_star.description": "puᴉɥǝq ɹɐʇs uoɹʇnǝu ɐ ǝʌɐǝꞁ puɐ puǝ ǝɥʇ oʇ uoᴉʇnꞁoʌǝ s,ɹɐʇs ɐ ǝʌᴉɹᗡ", + "advancements.anvilcraft.neutron_star.title": "uᴉɐʇunoW ɐ sɥᵷᴉǝM uoodsɐǝ⟘ Ɐ", "advancements.anvilcraft.new_cycle.description": "ꞁᴉʌuⱯ ᵷuᴉᵷɹoℲ ꞁɐᴉʇsǝꞁǝƆ ǝɥʇ ɯoɹɟ ɹɐǝddɐsᴉp uoᴉʇɐzᴉꞁᴉʌᴉɔ ɐ ssǝuʇᴉM", "advancements.anvilcraft.new_cycle.title": "ǝꞁɔʎƆ ʍǝN Ɐ", "advancements.anvilcraft.new_matter.description": "ɹǝʇʇɐɯ ǝʌᴉʇɐᵷǝu ɹo ɹǝʇʇɐɯ ǝsɐɥdᴉʇꞁnɯ 'ɯnᴉuɐɹn ʇɟɐɹɔ oʇ uoᴉsᴉꞁꞁoɔ ꞁᴉʌuɐ ᵷuᴉs∩", "advancements.anvilcraft.new_matter.title": "ɹǝʇʇɐW ʍǝN", + "advancements.anvilcraft.no_remnant.description": "ʇuɐuɯǝɹ ou ǝʌɐǝꞁ ʇᴉ ɥɔʇɐʍ puɐ puǝ ǝɥʇ oʇ sꞁᴉʌuɐ ssɐɯ ߈9 ɥʇᴉʍ pǝᵷɹoɟ ʎpoq ꞁɐᴉʇsǝꞁǝɔ ɐ ǝʌꞁoʌƎ", + "advancements.anvilcraft.no_remnant.title": "puᴉɥǝᗺ ʇɟǝꞀ ᵷuᴉɥʇoN", "advancements.anvilcraft.noble_metal.description": "ꞁǝǝʇs ꞁɐʎoɹ ᵷuᴉʇꞁǝɯS", "advancements.anvilcraft.noble_metal.title": "ꞁɐʇǝɯ ǝꞁqoN", "advancements.anvilcraft.not_beacon.description": "ɹoʇɔǝꞁꞁoɔ ǝᵷɹɐɥɔ ɐ ǝɔɐꞁd puɐ ʇɟɐɹƆ", @@ -918,13 +930,16 @@ "config.waila.plugin_anvilcraft": "ʇɟɐɹƆ ꞁᴉʌuⱯ", "config.waila.plugin_anvilcraft.power_provider": "ɹǝʍoԀ ʇɟɐɹƆ ꞁᴉʌuⱯ", "config.waila.plugin_anvilcraft.warning_percent": "pꞁoɥsǝɹɥ⟘ ᵷuᴉuɹɐM", + "death.attack.anvilcraft.black_hole_contact": "ʇɥᵷᴉꞁ unɹʇno pꞁnoɔ ʎǝɥʇ ʇɥᵷnoɥʇ %1$s", "death.attack.anvilcraft.falling_giant_anvil": "suoᴉʇɐɹqᴉʌ punoɹᵷ ʎq pǝsnɐɔ ǝɔuɐuosǝɹ ɔᴉɯǝʇsʎs oʇ ǝnp pǝᴉp %1$s", "death.attack.anvilcraft.gamma_laser": "˙ɹǝuuɐᗺ ǝɔnɹᗺ ʇou s,ǝɥ ʇnq 'ʞꞁnH ǝq oʇ ʇuɐʍ %1$s", "death.attack.anvilcraft.heater_burn": "ɹǝʇɐǝɥ ǝɥʇ ʎq ǝuop ꞁꞁǝʍ sɐʍ %1$s", "death.attack.anvilcraft.laser": "ɹǝsɐꞁ ʎq pǝɔɹǝᴉd sɐʍ %1$s", "death.attack.anvilcraft.lost_in_time": "ǝɯᴉʇ ɟo ɹǝʌᴉɹ ǝɥʇ uᴉ ʇsoꞁ sɐʍ %1$s", + "death.attack.anvilcraft.planet_contact": "sǝɔǝᴉd uᴉ 'ʇᴉɯᴉꞁ ǝɥɔoᴚ ǝɥʇ pǝɹǝʌoɔsᴉp %1$s", "death.attack.anvilcraft.planetary_collapse": "ǝsdɐꞁꞁoɔ ʎɹɐʇǝuɐꞁd ʎq pǝɯnsuoɔ sɐʍ %1$s", "death.attack.anvilcraft.plasma_jets": "˙ʞɔɐq ǝʌᴉɟ-ɥᵷᴉɥ ʇou pᴉp ʎǝɥ⟘ ˙sʇǝɾ ɐɯsɐꞁd ǝɥʇ ǝʌᴉɟ-ɥᵷᴉɥ oʇ pǝᴉɹʇ %1$s", + "death.attack.anvilcraft.star_contact": "ɐuoɹoɔ ǝɥʇ ɟo ʇɹɐd ʍou sᴉ %1$s", "dimension.anvilcraft.mun": "unW", "effect.anvilcraft.invulnerable": "ǝꞁqɐɹǝuꞁnʌuI", "effect.anvilcraft.rage": "ǝᵷɐᴚ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index 552adec99c..66cce4219a 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -7,6 +7,12 @@ "advancements.anvilcraft.anvil_accelerator.title": "Anvil accelerator", "advancements.anvilcraft.anvilon.description": "Using anvil collision to craft any type of confined anvilon", "advancements.anvilcraft.anvilon.title": "Anvilon", + "advancements.anvilcraft.black_hole.description": "Drive a star's evolution to the end and collapse it into a black hole", + "advancements.anvilcraft.black_hole.title": "Not Even Light Escapes", + "advancements.anvilcraft.cannon_fodder.description": "Die to a planetary collapse inside an Overworld-Like planet", + "advancements.anvilcraft.cannon_fodder.title": "Cannon Fodder", + "advancements.anvilcraft.come_at_night.description": "Get killed by a star", + "advancements.anvilcraft.come_at_night.title": "You Should Come At Night", "advancements.anvilcraft.crab_claw.description": "Obtain crab claws", "advancements.anvilcraft.crab_claw.title": "Win half of the resurrection race", "advancements.anvilcraft.dang.description": "Perform any anvil crafting", @@ -15,6 +21,8 @@ "advancements.anvilcraft.devourer.title": "Too many tongue twisters", "advancements.anvilcraft.durable_goods.description": "Upgrade any tool to Royal steel grade", "advancements.anvilcraft.durable_goods.title": "Durable goods", + "advancements.anvilcraft.efficiency.description": "Feed a gamma laser into the planet excavator and blow the planet apart", + "advancements.anvilcraft.efficiency.title": "We called it... efficiency", "advancements.anvilcraft.electric_allergy.description": "Obtain celestial forging anvil without power system", "advancements.anvilcraft.electric_allergy.title": "Electric allergy", "advancements.anvilcraft.electric_filed_rhythm.description": "Step in the scope of the power grid", @@ -63,10 +71,14 @@ "advancements.anvilcraft.mining_void.title": "Mining void", "advancements.anvilcraft.networking.description": "Craft and place transmission pole", "advancements.anvilcraft.networking.title": "Networking", + "advancements.anvilcraft.neutron_star.description": "Drive a star's evolution to the end and leave a neutron star behind", + "advancements.anvilcraft.neutron_star.title": "A Teaspoon Weighs a Mountain", "advancements.anvilcraft.new_cycle.description": "Witness a civilization disappear from the Celestial Forging Anvil", "advancements.anvilcraft.new_cycle.title": "A New Cycle", "advancements.anvilcraft.new_matter.description": "Using anvil collision to craft uranium, multiphase matter or negative matter", "advancements.anvilcraft.new_matter.title": "New Matter", + "advancements.anvilcraft.no_remnant.description": "Evolve a celestial body forged with 64 mass anvils to the end and watch it leave no remnant", + "advancements.anvilcraft.no_remnant.title": "Nothing Left Behind", "advancements.anvilcraft.noble_metal.description": "Smelting royal steel", "advancements.anvilcraft.noble_metal.title": "Noble metal", "advancements.anvilcraft.not_beacon.description": "Craft and place a charge collector", @@ -918,13 +930,16 @@ "config.waila.plugin_anvilcraft": "Anvil Craft", "config.waila.plugin_anvilcraft.power_provider": "Anvil Craft Power", "config.waila.plugin_anvilcraft.warning_percent": "Warning Threshold", + "death.attack.anvilcraft.black_hole_contact": "%1$s thought they could outrun light", "death.attack.anvilcraft.falling_giant_anvil": "%1$s died due to systemic resonance caused by ground vibrations", "death.attack.anvilcraft.gamma_laser": "%1$s want to be Hulk, but he's not Bruce Banner.", "death.attack.anvilcraft.heater_burn": "%1$s was well done by the heater", "death.attack.anvilcraft.laser": "%1$s was pierced by laser", "death.attack.anvilcraft.lost_in_time": "%1$s was lost in the river of time", + "death.attack.anvilcraft.planet_contact": "%1$s discovered the Roche limit, in pieces", "death.attack.anvilcraft.planetary_collapse": "%1$s was consumed by planetary collapse", "death.attack.anvilcraft.plasma_jets": "%1$s tried to high-five the plasma jets. They did not high-five back.", + "death.attack.anvilcraft.star_contact": "%1$s is now part of the corona", "dimension.anvilcraft.mun": "Mun", "effect.anvilcraft.invulnerable": "Invulnerable", "effect.anvilcraft.rage": "Rage", diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/black_hole.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/black_hole.json new file mode 100644 index 0000000000..212c1088f0 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/black_hole.json @@ -0,0 +1,30 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "black_hole": { + "conditions": { + "terminal": "black_hole" + }, + "trigger": "anvilcraft:celestial_evolution" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.black_hole.description" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "anvilcraft:black_hole" + }, + "title": { + "translate": "advancements.anvilcraft.black_hole.title" + } + }, + "requirements": [ + [ + "black_hole" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/cannon_fodder.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/cannon_fodder.json new file mode 100644 index 0000000000..2267114d04 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/cannon_fodder.json @@ -0,0 +1,28 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "cannon_fodder": { + "trigger": "anvilcraft:planetary_collapse_death" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.cannon_fodder.description" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "minecraft:player_head" + }, + "title": { + "translate": "advancements.anvilcraft.cannon_fodder.title" + } + }, + "requirements": [ + [ + "cannon_fodder" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/come_at_night.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/come_at_night.json new file mode 100644 index 0000000000..dbeecc44ff --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/come_at_night.json @@ -0,0 +1,27 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "come_at_night": { + "trigger": "anvilcraft:star_contact_death" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.come_at_night.description" + }, + "hidden": true, + "icon": { + "count": 1, + "id": "anvilcraft:celestial_forging_anvil" + }, + "title": { + "translate": "advancements.anvilcraft.come_at_night.title" + } + }, + "requirements": [ + [ + "come_at_night" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json new file mode 100644 index 0000000000..53afd615ce --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json @@ -0,0 +1,28 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "efficiency": { + "trigger": "anvilcraft:planet_detonation" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.efficiency.description" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "anvilcraft:earth_core_shard" + }, + "title": { + "translate": "advancements.anvilcraft.efficiency.title" + } + }, + "requirements": [ + [ + "efficiency" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/neutron_star.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/neutron_star.json new file mode 100644 index 0000000000..c86057f832 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/neutron_star.json @@ -0,0 +1,30 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "neutron_star": { + "conditions": { + "terminal": "neutron_star" + }, + "trigger": "anvilcraft:celestial_evolution" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.neutron_star.description" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "anvilcraft:magnetar_coil_component" + }, + "title": { + "translate": "advancements.anvilcraft.neutron_star.title" + } + }, + "requirements": [ + [ + "neutron_star" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/no_remnant.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/no_remnant.json new file mode 100644 index 0000000000..229a2c4004 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/no_remnant.json @@ -0,0 +1,31 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "no_remnant": { + "conditions": { + "mass_anvils": 64 + }, + "trigger": "anvilcraft:celestial_evolution" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.no_remnant.description" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "anvilcraft:stellar_evolution_accelerator_component" + }, + "title": { + "translate": "advancements.anvilcraft.no_remnant.title" + } + }, + "requirements": [ + [ + "no_remnant" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/damage_type/black_hole_contact.json b/src/generated/resources/data/anvilcraft/damage_type/black_hole_contact.json new file mode 100644 index 0000000000..f5c9d67d27 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/damage_type/black_hole_contact.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "anvilcraft.black_hole_contact", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/damage_type/planet_contact.json b/src/generated/resources/data/anvilcraft/damage_type/planet_contact.json new file mode 100644 index 0000000000..5bcb8fbe25 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/damage_type/planet_contact.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "anvilcraft.planet_contact", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/damage_type/star_contact.json b/src/generated/resources/data/anvilcraft/damage_type/star_contact.json new file mode 100644 index 0000000000..c2564afa83 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/damage_type/star_contact.json @@ -0,0 +1,6 @@ +{ + "effects": "burning", + "exhaustion": 0.1, + "message_id": "anvilcraft.star_contact", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json index d24ca5d339..d5c4776ec9 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -7,6 +7,10 @@ { "id": "anvilcraft:planetary_collapse", "required": false + }, + { + "id": "anvilcraft:black_hole_contact", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json index d24ca5d339..d5c4776ec9 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json @@ -7,6 +7,10 @@ { "id": "anvilcraft:planetary_collapse", "required": false + }, + { + "id": "anvilcraft:black_hole_contact", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json b/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json new file mode 100644 index 0000000000..4bbb509cb5 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "anvilcraft:planet_contact", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json b/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json index da7f5824e6..cac15a386b 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json @@ -11,6 +11,10 @@ { "id": "anvilcraft:laser", "required": false + }, + { + "id": "anvilcraft:star_contact", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json b/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json index 8a6d443a87..8372e5fe22 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json @@ -11,6 +11,10 @@ { "id": "anvilcraft:planetary_collapse", "required": false + }, + { + "id": "anvilcraft:black_hole_contact", + "required": false } ] } \ No newline at end of file diff --git a/src/generated/resources/data/neoforge/tags/damage_type/is_magic.json b/src/generated/resources/data/neoforge/tags/damage_type/is_magic.json index 0ccc6bb9cb..96728815f9 100644 --- a/src/generated/resources/data/neoforge/tags/damage_type/is_magic.json +++ b/src/generated/resources/data/neoforge/tags/damage_type/is_magic.json @@ -3,6 +3,10 @@ { "id": "anvilcraft:lost_in_time", "required": false + }, + { + "id": "anvilcraft:black_hole_contact", + "required": false } ] } \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java new file mode 100644 index 0000000000..17733153e4 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java @@ -0,0 +1,54 @@ +package dev.dubhe.anvilcraft.advancements.criterion; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.dubhe.anvilcraft.block.entity.celestial.StellarTerminal; +import dev.dubhe.anvilcraft.init.ModCriterionTriggers; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.server.level.ServerPlayer; + +import java.util.Optional; + +public class CelestialEvolutionTrigger extends SimpleCriterionTrigger { + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public void trigger(ServerPlayer player, int massAnvils, StellarTerminal.Kind terminal) { + this.trigger(player, (instance) -> instance.matches(massAnvils, terminal)); + } + + public record TriggerInstance( + Optional player, + Optional massAnvils, + Optional terminal + ) implements SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player), + MinMaxBounds.Ints.CODEC.optionalFieldOf("mass_anvils").forGetter(TriggerInstance::massAnvils), + StellarTerminal.Kind.CODEC.optionalFieldOf("terminal").forGetter(TriggerInstance::terminal) + ).apply(instance, TriggerInstance::new)); + + public static Criterion evolved(MinMaxBounds.Ints massAnvils) { + return ModCriterionTriggers.CELESTIAL_EVOLUTION.get().createCriterion( + new TriggerInstance(Optional.empty(), Optional.of(massAnvils), Optional.empty()) + ); + } + + public static Criterion evolved(StellarTerminal.Kind terminal) { + return ModCriterionTriggers.CELESTIAL_EVOLUTION.get().createCriterion( + new TriggerInstance(Optional.empty(), Optional.empty(), Optional.of(terminal)) + ); + } + + public boolean matches(int massAnvils, StellarTerminal.Kind terminal) { + if (this.massAnvils.isPresent() && !this.massAnvils.get().matches(massAnvils)) return false; + return this.terminal.isEmpty() || this.terminal.get() == terminal; + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetDetonationTrigger.java b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetDetonationTrigger.java new file mode 100644 index 0000000000..e585eb62b4 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetDetonationTrigger.java @@ -0,0 +1,39 @@ +package dev.dubhe.anvilcraft.advancements.criterion; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.dubhe.anvilcraft.init.ModCriterionTriggers; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.server.level.ServerPlayer; + +import java.util.Optional; + +public class PlanetDetonationTrigger extends SimpleCriterionTrigger { + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public void trigger(ServerPlayer player) { + this.trigger(player, TriggerInstance::matches); + } + + public record TriggerInstance(Optional player) implements SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player) + ).apply(instance, TriggerInstance::new)); + + public static Criterion detonated() { + return ModCriterionTriggers.PLANET_DETONATION.get().createCriterion( + new TriggerInstance(Optional.empty()) + ); + } + + public boolean matches() { + return true; + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetaryCollapseDeathTrigger.java b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetaryCollapseDeathTrigger.java new file mode 100644 index 0000000000..251ae2a59b --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetaryCollapseDeathTrigger.java @@ -0,0 +1,39 @@ +package dev.dubhe.anvilcraft.advancements.criterion; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.dubhe.anvilcraft.init.ModCriterionTriggers; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.server.level.ServerPlayer; + +import java.util.Optional; + +public class PlanetaryCollapseDeathTrigger extends SimpleCriterionTrigger { + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public void trigger(ServerPlayer player) { + this.trigger(player, TriggerInstance::matches); + } + + public record TriggerInstance(Optional player) implements SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player) + ).apply(instance, TriggerInstance::new)); + + public static Criterion died() { + return ModCriterionTriggers.PLANETARY_COLLAPSE_DEATH.get().createCriterion( + new TriggerInstance(Optional.empty()) + ); + } + + public boolean matches() { + return true; + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/StarContactDeathTrigger.java b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/StarContactDeathTrigger.java new file mode 100644 index 0000000000..90495d7071 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/StarContactDeathTrigger.java @@ -0,0 +1,39 @@ +package dev.dubhe.anvilcraft.advancements.criterion; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.dubhe.anvilcraft.init.ModCriterionTriggers; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.server.level.ServerPlayer; + +import java.util.Optional; + +public class StarContactDeathTrigger extends SimpleCriterionTrigger { + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public void trigger(ServerPlayer player) { + this.trigger(player, TriggerInstance::matches); + } + + public record TriggerInstance(Optional player) implements SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player) + ).apply(instance, TriggerInstance::new)); + + public static Criterion died() { + return ModCriterionTriggers.STAR_CONTACT_DEATH.get().createCriterion( + new TriggerInstance(Optional.empty()) + ); + } + + public boolean matches() { + return true; + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java index 4cd1720965..d6c31d2fb7 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java @@ -8,6 +8,7 @@ import dev.dubhe.anvilcraft.advancements.criterion.AnvilLootingTrigger; import dev.dubhe.anvilcraft.advancements.criterion.AnvilOnGroundTrigger; import dev.dubhe.anvilcraft.advancements.criterion.BlockComparatorTurnOverTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.CelestialEvolutionTrigger; import dev.dubhe.anvilcraft.advancements.criterion.ConvertBeaconTrigger; import dev.dubhe.anvilcraft.advancements.criterion.DevourerDevourTrigger; import dev.dubhe.anvilcraft.advancements.criterion.DispenserRepairIronGolem; @@ -23,10 +24,14 @@ import dev.dubhe.anvilcraft.advancements.criterion.PipeConnectContainersTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlacerPlaceTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlacerShuttleTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.PlanetDetonationTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.PlanetaryCollapseDeathTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerKilledEntityByAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerWearAnvilHammerTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.StarContactDeathTrigger; import dev.dubhe.anvilcraft.advancements.criterion.UseItemTrigger; import dev.dubhe.anvilcraft.advancements.criterion.VoidEnergyCollectorWorkingTrigger; +import dev.dubhe.anvilcraft.block.entity.celestial.StellarTerminal; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementRequirements; @@ -683,6 +688,26 @@ public AdvancementHelper multiBlockForm(String key) { return this.addCriterion(key, MultiBlockFormTrigger.TriggerInstance.form()); } + public AdvancementHelper celestialEvolution(String key, MinMaxBounds.Ints massAnvils) { + return this.addCriterion(key, CelestialEvolutionTrigger.TriggerInstance.evolved(massAnvils)); + } + + public AdvancementHelper celestialEvolution(String key, StellarTerminal.Kind terminal) { + return this.addCriterion(key, CelestialEvolutionTrigger.TriggerInstance.evolved(terminal)); + } + + public AdvancementHelper planetDetonation(String key) { + return this.addCriterion(key, PlanetDetonationTrigger.TriggerInstance.detonated()); + } + + public AdvancementHelper planetaryCollapseDeath(String key) { + return this.addCriterion(key, PlanetaryCollapseDeathTrigger.TriggerInstance.died()); + } + + public AdvancementHelper starContactDeath(String key) { + return this.addCriterion(key, StarContactDeathTrigger.TriggerInstance.died()); + } + public AdvancementHolder build(String id) { ResourceLocation location = ResourceLocation.fromNamespaceAndPath(this.lineHelper.modId, this.lineHelper.modId + "/" + id); AdvancementHolder holder = this.current.build(location); diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/CfaGravityController.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/CfaGravityController.java index 0bc449116e..dbe69eb100 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/CfaGravityController.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/CfaGravityController.java @@ -133,12 +133,12 @@ private static void applyCelestialDamage( ) { if (body instanceof StarData star) { if (star.bodyClass() == CelestialBodyClass.BLACK_HOLE) { - living.hurt(ModDamageTypes.lostInTime(level), Float.MAX_VALUE); + living.hurt(ModDamageTypes.blackHoleContact(level), Float.MAX_VALUE); } else { - living.hurt(level.damageSources().inFire(), STAR_CONTACT_DAMAGE); + living.hurt(ModDamageTypes.starContact(level), STAR_CONTACT_DAMAGE); } } else { - living.hurt(level.damageSources().fall(), PLANET_CONTACT_DAMAGE); + living.hurt(ModDamageTypes.planetContact(level), PLANET_CONTACT_DAMAGE); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/AcceleratorHandler.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/AcceleratorHandler.java index f53f79ee3a..66c3d355cc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/AcceleratorHandler.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/AcceleratorHandler.java @@ -17,6 +17,7 @@ import dev.dubhe.anvilcraft.block.entity.celestial.StellarVisualState; import dev.dubhe.anvilcraft.init.ModMegastructures; import dev.dubhe.anvilcraft.network.QuenchedOutMusicPacket; +import dev.dubhe.anvilcraft.util.TriggerUtil; import lombok.Getter; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -596,6 +597,7 @@ private void completeEvolution(CelestialForgingAnvilBlockEntity be) { // KEEP 的冷却外观继续从快照采样。 } } + TriggerUtil.celestialEvolution(be.getLevel(), be.getBlockPos(), evolutionState.initialMass(), terminal.kind()); finishAccelerator(be); syncToClient(be); } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/ExcavatorHandler.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/ExcavatorHandler.java index 1aaea4c52c..e44c962fc8 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/ExcavatorHandler.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/ExcavatorHandler.java @@ -9,6 +9,7 @@ import dev.dubhe.anvilcraft.block.entity.celestial.ShatteredPlanet; import dev.dubhe.anvilcraft.block.entity.celestial.SpecialCelestialBodyData; import dev.dubhe.anvilcraft.util.BreakBlockUtil; +import dev.dubhe.anvilcraft.util.TriggerUtil; import dev.dubhe.anvilcraft.worldgen.OverworldLikeResetManager; import lombok.Getter; import net.minecraft.core.HolderLookup; @@ -162,6 +163,7 @@ private boolean tryShatterPlanet( be.setPlanetaryResourceSet(ShatteredPlanet.createResources()); be.setAgeAnvilCount(ShatteredPlanet.AGE_ANVIL_COUNT); be.setStellarMass(ShatteredPlanet.MASS_ANVIL_COUNT); + TriggerUtil.planetDetonation(be.getLevel(), be.getBlockPos()); be.setChanged(); be.getLevel().sendBlockUpdated(be.getBlockPos(), be.getBlockState(), be.getBlockState(), Block.UPDATE_ALL); be.getLevel().explode( diff --git a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java index c3d612bd9a..760c9600fc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -6,6 +6,7 @@ import dev.dubhe.anvilcraft.advancements.criterion.AnvilHammerHurtEntityTrigger; import dev.dubhe.anvilcraft.api.advancement.AdvancementLineHelper; import dev.dubhe.anvilcraft.block.entity.HeatCollectorBlockEntity; +import dev.dubhe.anvilcraft.block.entity.celestial.StellarTerminal; import dev.dubhe.anvilcraft.constant.SharedTextures; import dev.dubhe.anvilcraft.init.block.ModBlockTags; import dev.dubhe.anvilcraft.init.block.ModBlocks; @@ -435,6 +436,30 @@ public static void init(RegistrumAdvancementProvider provider) { .challenge(ModBlocks.CELESTIAL_FORGING_ANVIL, "the_start") .hasItems("has_celestial_forging_anvil", ModBlocks.CELESTIAL_FORGING_ANVIL) .save("the_start"); + industrialLine.createBranch().next() + .challenge(ModItems.EARTH_CORE_SHARD, "efficiency", true) + .planetDetonation("efficiency") + .save("efficiency"); + industrialLine.createBranch().next() + .challenge(Items.PLAYER_HEAD, "cannon_fodder", true) + .planetaryCollapseDeath("cannon_fodder") + .save("cannon_fodder"); + industrialLine.createBranch().next() + .challenge(ModBlocks.BLACK_HOLE, "black_hole") + .celestialEvolution("black_hole", StellarTerminal.Kind.BLACK_HOLE) + .save("black_hole"); + industrialLine.createBranch().next() + .challenge(ModItems.MAGNETAR_COIL_COMPONENT, "neutron_star") + .celestialEvolution("neutron_star", StellarTerminal.Kind.NEUTRON_STAR) + .save("neutron_star"); + industrialLine.createBranch().next() + .task(ModBlocks.CELESTIAL_FORGING_ANVIL, "come_at_night", true) + .starContactDeath("come_at_night") + .save("come_at_night"); + industrialLine.next() + .challenge(ModItems.STELLAR_EVOLUTION_ACCELERATOR_COMPONENT, "no_remnant", true) + .celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) + .save("no_remnant"); industrialLine.next() .challenge(ModItems.CIVILIZATION_CATALYST, "new_cycle", true) .addCriterion("new_cycle", CriteriaTriggers.IMPOSSIBLE.createCriterion(new ImpossibleTrigger.TriggerInstance())) diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java index 7d285a7705..fa3234cd15 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java @@ -156,6 +156,23 @@ public static void init(RegistrumLangProvider provider) { provider.add("advancements.anvilcraft.the_start.title", "The start"); provider.add("advancements.anvilcraft.the_start.description", "Obtain celestial forging anvil"); + provider.add("advancements.anvilcraft.no_remnant.title", "Nothing Left Behind"); + provider.add("advancements.anvilcraft.no_remnant.description", "Evolve a celestial body forged with 64 mass anvils to the end and watch it leave no remnant"); + + provider.add("advancements.anvilcraft.efficiency.title", "We called it... efficiency"); + provider.add("advancements.anvilcraft.efficiency.description", "Feed a gamma laser into the planet excavator and blow the planet apart"); + + provider.add("advancements.anvilcraft.cannon_fodder.title", "Cannon Fodder"); + provider.add("advancements.anvilcraft.cannon_fodder.description", "Die to a planetary collapse inside an Overworld-Like planet"); + + provider.add("advancements.anvilcraft.come_at_night.title", "You Should Come At Night"); + provider.add("advancements.anvilcraft.come_at_night.description", "Get killed by a star"); + + provider.add("advancements.anvilcraft.black_hole.title", "Not Even Light Escapes"); + provider.add("advancements.anvilcraft.black_hole.description", "Drive a star's evolution to the end and collapse it into a black hole"); + + provider.add("advancements.anvilcraft.neutron_star.title", "A Teaspoon Weighs a Mountain"); + provider.add("advancements.anvilcraft.neutron_star.description", "Drive a star's evolution to the end and leave a neutron star behind"); provider.add("advancements.anvilcraft.new_cycle.title", "A New Cycle"); provider.add("advancements.anvilcraft.new_cycle.description", "Witness a civilization disappear from the Celestial Forging Anvil"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/OtherLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/OtherLang.java index c71caff52a..305dea9bfd 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/OtherLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/OtherLang.java @@ -57,6 +57,12 @@ public static void init(RegistrumLangProvider provider) { provider.add("death.attack.anvilcraft.heater_burn", "%1$s was well done by the heater"); provider.add("death.attack.anvilcraft.plasma_jets", "%1$s tried to high-five the plasma jets. They did not high-five back."); provider.add("death.attack.anvilcraft.planetary_collapse", "%1$s was consumed by planetary collapse"); + provider.add("death.attack.anvilcraft.star_contact", + "%1$s is now part of the corona"); + provider.add("death.attack.anvilcraft.planet_contact", + "%1$s discovered the Roche limit, in pieces"); + provider.add("death.attack.anvilcraft.black_hole_contact", + "%1$s thought they could outrun light"); provider.add("item.anvilcraft.pill.tooltip", "Pills made together with potion to achieve corresponding effects, can be taken quickly"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/tags/DamageTypeTagLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/tags/DamageTypeTagLoader.java index 4e5e8c610a..4bf28b73dc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/tags/DamageTypeTagLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/tags/DamageTypeTagLoader.java @@ -48,13 +48,17 @@ public static void init(RegistrumTagsProvider provider) { provider.addTag(ModDamageTypeTags.IS_FALLING_GIANT_ANVIL) .addOptional(ModDamageTypes.FALLING_GIANT_ANVIL.location()); + /// 天体接触伤害换用独立类型以显示专属死亡提示,因此需要各自继承被替换原版类型的标签, + /// 否则护符(红宝石=火焰、羽毛=摔落)与抗性提升等无法再规避这些伤害。 provider.addTag(DamageTypeTags.BYPASSES_ARMOR) .addOptional(ModDamageTypes.LOST_IN_TIME.location()) - .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()); + .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()) + .addOptional(ModDamageTypes.BLACK_HOLE_CONTACT.location()); provider.addTag(DamageTypeTags.BYPASSES_RESISTANCE) .addOptional(ModDamageTypes.LOST_IN_TIME.location()) - .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()); + .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()) + .addOptional(ModDamageTypes.BLACK_HOLE_CONTACT.location()); provider.addTag(DamageTypeTags.BYPASSES_SHIELD) .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()); @@ -74,14 +78,20 @@ public static void init(RegistrumTagsProvider provider) { provider.addTag(DamageTypeTags.NO_KNOCKBACK) .addOptional(ModDamageTypes.LOST_IN_TIME.location()) .addOptional(ModDamageTypes.HEATER_BURN.location()) - .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()); + .addOptional(ModDamageTypes.PLANETARY_COLLAPSE.location()) + .addOptional(ModDamageTypes.BLACK_HOLE_CONTACT.location()); provider.addTag(Tags.DamageTypes.IS_MAGIC) - .addOptional(ModDamageTypes.LOST_IN_TIME.location()); + .addOptional(ModDamageTypes.LOST_IN_TIME.location()) + .addOptional(ModDamageTypes.BLACK_HOLE_CONTACT.location()); provider.addTag(DamageTypeTags.IS_FIRE) .addOptional(ModDamageTypes.HEATER_BURN.location()) .addOptional(ModDamageTypes.PLASMA_JET.location()) - .addOptional(ModDamageTypes.LASER.location()); + .addOptional(ModDamageTypes.LASER.location()) + .addOptional(ModDamageTypes.STAR_CONTACT.location()); + + provider.addTag(DamageTypeTags.IS_FALL) + .addOptional(ModDamageTypes.PLANET_CONTACT.location()); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java index 2942217e2c..18a03f1702 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java @@ -2,12 +2,14 @@ import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.init.entity.ModDamageTypes; +import dev.dubhe.anvilcraft.util.TriggerUtil; import dev.dubhe.anvilcraft.worldgen.OverworldLikeGenerationBootstrap; import dev.dubhe.anvilcraft.worldgen.OverworldLikeResetManager; import net.minecraft.server.level.ServerPlayer; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.server.ServerStoppedEvent; @@ -49,6 +51,22 @@ public static void keepPlanetaryCollapseUnavoidable(LivingIncomingDamageEvent ev } } + @SubscribeEvent + public static void onPlanetaryCollapseDeath(LivingDeathEvent event) { + if (!event.getSource().is(ModDamageTypes.PLANETARY_COLLAPSE)) return; + if (event.getEntity() instanceof ServerPlayer player) { + TriggerUtil.planetaryCollapseDeath(player); + } + } + + @SubscribeEvent + public static void onStarContactDeath(LivingDeathEvent event) { + if (!event.getSource().is(ModDamageTypes.STAR_CONTACT)) return; + if (event.getEntity() instanceof ServerPlayer player) { + TriggerUtil.starContactDeath(player); + } + } + @SubscribeEvent public static void onServerStopped(ServerStoppedEvent event) { OverworldLikeGenerationBootstrap.clear(event.getServer()); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java index e294b7b79b..77a6a092cb 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java @@ -7,6 +7,7 @@ import dev.dubhe.anvilcraft.advancements.criterion.AnvilLootingTrigger; import dev.dubhe.anvilcraft.advancements.criterion.AnvilOnGroundTrigger; import dev.dubhe.anvilcraft.advancements.criterion.BlockComparatorTurnOverTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.CelestialEvolutionTrigger; import dev.dubhe.anvilcraft.advancements.criterion.ConvertBeaconTrigger; import dev.dubhe.anvilcraft.advancements.criterion.DevourerDevourTrigger; import dev.dubhe.anvilcraft.advancements.criterion.DispenserRepairIronGolem; @@ -22,8 +23,11 @@ import dev.dubhe.anvilcraft.advancements.criterion.PipeConnectContainersTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlacerPlaceTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlacerShuttleTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.PlanetDetonationTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.PlanetaryCollapseDeathTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerKilledEntityByAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerWearAnvilHammerTrigger; +import dev.dubhe.anvilcraft.advancements.criterion.StarContactDeathTrigger; import dev.dubhe.anvilcraft.advancements.criterion.UseItemTrigger; import dev.dubhe.anvilcraft.advancements.criterion.VoidEnergyCollectorWorkingTrigger; import net.minecraft.advancements.CriterionTrigger; @@ -139,6 +143,18 @@ public class ModCriterionTriggers { public static final DeferredHolder, MultiBlockFormTrigger> MULTI_BLOCK_FORM = REGISTER.register("multi_block_form", MultiBlockFormTrigger::new); + public static final DeferredHolder, CelestialEvolutionTrigger> CELESTIAL_EVOLUTION = + REGISTER.register("celestial_evolution", CelestialEvolutionTrigger::new); + + public static final DeferredHolder, PlanetDetonationTrigger> PLANET_DETONATION = + REGISTER.register("planet_detonation", PlanetDetonationTrigger::new); + + public static final DeferredHolder, PlanetaryCollapseDeathTrigger> PLANETARY_COLLAPSE_DEATH = + REGISTER.register("planetary_collapse_death", PlanetaryCollapseDeathTrigger::new); + + public static final DeferredHolder, StarContactDeathTrigger> STAR_CONTACT_DEATH = + REGISTER.register("star_contact_death", StarContactDeathTrigger::new); + public static void register(IEventBus eventBus) { REGISTER.register(eventBus); } diff --git a/src/main/java/dev/dubhe/anvilcraft/init/entity/ModDamageTypes.java b/src/main/java/dev/dubhe/anvilcraft/init/entity/ModDamageTypes.java index 5ebdd13a99..1dacad2f46 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/entity/ModDamageTypes.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/entity/ModDamageTypes.java @@ -47,6 +47,18 @@ public class ModDamageTypes { Registries.DAMAGE_TYPE, AnvilCraft.of("planetary_collapse") ); + public static final ResourceKey STAR_CONTACT = ResourceKey.create( + Registries.DAMAGE_TYPE, + AnvilCraft.of("star_contact") + ); + public static final ResourceKey PLANET_CONTACT = ResourceKey.create( + Registries.DAMAGE_TYPE, + AnvilCraft.of("planet_contact") + ); + public static final ResourceKey BLACK_HOLE_CONTACT = ResourceKey.create( + Registries.DAMAGE_TYPE, + AnvilCraft.of("black_hole_contact") + ); @ApiStatus.Internal public static void bootstrap(BootstrapContext ctx) { @@ -66,6 +78,10 @@ public static void bootstrap(BootstrapContext ctx) { DeathMessageType.DEFAULT ) ); + /// 天体接触伤害沿用被替换的原版伤害表现(恒星=燃烧、行星=摔落),只换死亡提示。 + ctx.register(STAR_CONTACT, new DamageType("anvilcraft.star_contact", 0.1f, DamageEffects.BURNING)); + ctx.register(PLANET_CONTACT, new DamageType("anvilcraft.planet_contact", 0.0f, DamageEffects.HURT)); + ctx.register(BLACK_HOLE_CONTACT, new DamageType("anvilcraft.black_hole_contact", 0.1f)); } public static DamageSource laser(Level level) { @@ -104,6 +120,18 @@ public static DamageSource planetaryCollapse(Level level) { return ModDamageTypes.source(ModDamageTypes.PLANETARY_COLLAPSE, level); } + public static DamageSource starContact(Level level) { + return ModDamageTypes.source(ModDamageTypes.STAR_CONTACT, level); + } + + public static DamageSource planetContact(Level level) { + return ModDamageTypes.source(ModDamageTypes.PLANET_CONTACT, level); + } + + public static DamageSource blackHoleContact(Level level) { + return ModDamageTypes.source(ModDamageTypes.BLACK_HOLE_CONTACT, level); + } + private static DamageSource source(ResourceKey key, LevelReader level) { Registry registry = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE); return new DamageSource(registry.getHolderOrThrow(key)); diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/PlayerHitEntityMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/PlayerHitEntityMixin.java index 265eb67291..49bd890ce1 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/PlayerHitEntityMixin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/PlayerHitEntityMixin.java @@ -1,6 +1,7 @@ package dev.dubhe.anvilcraft.mixin; import dev.anvilcraft.lib.v2.util.Util; +import dev.dubhe.anvilcraft.init.entity.ModDamageTypes; import dev.dubhe.anvilcraft.init.item.ModItems; import dev.dubhe.anvilcraft.item.AnvilHammerItem; import net.minecraft.server.level.ServerPlayer; @@ -57,7 +58,9 @@ private void onFlyingHitBlock(DamageSource source, float amount, CallbackInfoRet cir.setReturnValue(false); cir.cancel(); } else { - if (source.type().equals(level().damageSources().fall().type())) { + /// 行星接触伤害原为原版摔落类型,改用专属类型后仍需在此保持相同表现。 + if (source.type().equals(level().damageSources().fall().type()) + || source.is(ModDamageTypes.PLANET_CONTACT)) { for (LivingEntity entity : entities) { entity.hurt(damageSources().playerAttack(thiS), hurtAmount); anvilcraft$damageItem(thiS, this.getItemBySlot(EquipmentSlot.HEAD)); diff --git a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index 4729459006..e783ec27d7 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java @@ -1,5 +1,6 @@ package dev.dubhe.anvilcraft.util; +import dev.dubhe.anvilcraft.block.entity.celestial.StellarTerminal; import dev.dubhe.anvilcraft.init.ModCriterionTriggers; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; @@ -206,4 +207,31 @@ public static void multiBlockForm(Level level, BlockPos pos) { } } } + + /** 演化终局伴随超新星爆发,玩家多在爆炸范围外观察,因此搜索半径对齐震屏半径。 */ + public static void celestialEvolution(Level level, BlockPos pos, int massAnvils, StellarTerminal.Kind terminal) { + if (!level.isClientSide) { + for (ServerPlayer player : PlayerUtil.searchPlayerByPos(level, pos, 32)) { + ModCriterionTriggers.CELESTIAL_EVOLUTION.get().trigger(player, massAnvils, terminal); + } + } + } + + public static void planetDetonation(Level level, BlockPos pos) { + if (!level.isClientSide) { + for (ServerPlayer player : PlayerUtil.searchPlayerByPos(level, pos, 7)) { + ModCriterionTriggers.PLANET_DETONATION.get().trigger(player); + } + } + } + + /** 死亡事件只涉及当事玩家,不需要按位置搜索。 */ + public static void planetaryCollapseDeath(ServerPlayer player) { + ModCriterionTriggers.PLANETARY_COLLAPSE_DEATH.get().trigger(player); + } + + /** 死亡事件只涉及当事玩家,不需要按位置搜索。 */ + public static void starContactDeath(ServerPlayer player) { + ModCriterionTriggers.STAR_CONTACT_DEATH.get().trigger(player); + } }