From 2c5495349d20cf6065476668ce1ab992952ff399 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 14:54:14 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat(advancement):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=A9=E4=BD=93=E8=BF=9B=E5=8C=96=E6=8C=91=E6=88=98=E6=88=90?= =?UTF-8?q?=E5=B0=B1=E5=8F=8A=E8=A7=A6=E5=8F=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 CelestialEvolutionTrigger 用于天体质量进化判定 - 在触发 util 中添加 celestialEvolution 方法,触发成就判定 - 在加速器逻辑中调用触发方法进行成就检测 - 添加无残留(no_remnant)挑战成就,要求64质量铁砧的天体进化至终局 - 将成就文本翻译添加至英文语言文件和特殊字符文件 - 在成就数据中注册无残留成就及其触发条件 --- .../assets/anvilcraft/lang/en_ud.json | 2 + .../assets/anvilcraft/lang/en_us.json | 2 + .../advancement/anvilcraft/no_remnant.json | 31 +++++++++++++ .../criterion/CelestialEvolutionTrigger.java | 43 +++++++++++++++++++ .../advancement/AdvancementLineHelper.java | 5 +++ .../megastructure/AcceleratorHandler.java | 2 + .../advancement/AnvilCraftAdvancement.java | 4 ++ .../anvilcraft/data/lang/AdvancementLang.java | 3 ++ .../anvilcraft/init/ModCriterionTriggers.java | 4 ++ .../dubhe/anvilcraft/util/TriggerUtil.java | 9 ++++ 10 files changed, 105 insertions(+) create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/no_remnant.json create mode 100644 src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index aa30f3f482..0b93ecc95e 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -65,6 +65,8 @@ "advancements.anvilcraft.networking.title": "ᵷuᴉʞɹoʍʇǝ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ɐ ʇɟɐɹƆ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index 3a6e505c8f..b95f210390 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -65,6 +65,8 @@ "advancements.anvilcraft.networking.title": "Networking", "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", 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/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..473ca6b9a2 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java @@ -0,0 +1,43 @@ +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.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) { + this.trigger(player, (instance) -> instance.matches(massAnvils)); + } + + public record TriggerInstance( + Optional player, Optional massAnvils + ) 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) + ).apply(instance, TriggerInstance::new)); + + public static Criterion evolved(MinMaxBounds.Ints massAnvils) { + return ModCriterionTriggers.CELESTIAL_EVOLUTION.get().createCriterion( + new TriggerInstance(Optional.empty(), Optional.of(massAnvils)) + ); + } + + public boolean matches(int massAnvils) { + return this.massAnvils.isEmpty() || this.massAnvils.get().matches(massAnvils); + } + } +} 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..ad7b05b9b3 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; @@ -683,6 +684,10 @@ 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 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/megastructure/AcceleratorHandler.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/megastructure/AcceleratorHandler.java index f53f79ee3a..0597e99e10 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()); finishAccelerator(be); syncToClient(be); } 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 206e526cea..9c4ff4881e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -431,5 +431,9 @@ 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.next() + .challenge(ModItems.STELLAR_EVOLUTION_ACCELERATOR_COMPONENT, "no_remnant", true) + .celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) + .save("no_remnant"); } } 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 0a45ae3e3f..7e9ef9c00f 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,9 @@ 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.nuclear_power_10a.title", "Nuclear power, piece of cake!"); provider.add("advancements.anvilcraft.nuclear_power_10a.description", "Using heat collector to collect overheated blocks' heat"); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java index e294b7b79b..496fbcb685 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; @@ -139,6 +140,9 @@ 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 void register(IEventBus eventBus) { REGISTER.register(eventBus); } diff --git a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index a0b25201e7..4014387098 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java @@ -200,4 +200,13 @@ public static void multiBlockForm(Level level, BlockPos pos) { } } } + + /** 演化终局伴随超新星爆发,玩家多在爆炸范围外观察,因此搜索半径对齐震屏半径。 */ + public static void celestialEvolution(Level level, BlockPos pos, int massAnvils) { + if (!level.isClientSide) { + for (ServerPlayer player : PlayerUtil.searchPlayerByPos(level, pos, 32)) { + ModCriterionTriggers.CELESTIAL_EVOLUTION.get().trigger(player, massAnvils); + } + } + } } From 7c3bb6ec03210c2a61c3b5e7c19a8e519172b5e1 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 15:15:49 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat(advancement):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=A1=8C=E6=98=9F=E6=AF=81=E7=81=AD=E6=88=90=E5=B0=B1=E5=8F=8A?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=99=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增PlanetDetonationTrigger用于行星毁灭事件的判定 - 在ExcavatorHandler中增加触发行星毁灭触发器的逻辑 - 在AdvancementLineHelper中集成planetDetonation方法方便创建该成就 - 在AnvilCraftAdvancement中添加efficiency成就分支,绑定行星毁灭触发器 - 更新语言文件,添加行星毁灭成就的标题与描述 - 注册PlanetDetonationTrigger触发器并完善其触发实现 - 新增efficiency成就JSON配置文件,定义触发条件及显示信息 --- .../assets/anvilcraft/lang/en_ud.json | 2 + .../assets/anvilcraft/lang/en_us.json | 2 + .../advancement/anvilcraft/efficiency.json | 27 +++++++++++++ .../criterion/PlanetDetonationTrigger.java | 39 +++++++++++++++++++ .../advancement/AdvancementLineHelper.java | 5 +++ .../megastructure/ExcavatorHandler.java | 2 + .../advancement/AnvilCraftAdvancement.java | 4 ++ .../anvilcraft/data/lang/AdvancementLang.java | 3 ++ .../anvilcraft/init/ModCriterionTriggers.java | 4 ++ .../dubhe/anvilcraft/util/TriggerUtil.java | 8 ++++ 10 files changed, 96 insertions(+) create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json create mode 100644 src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetDetonationTrigger.java diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 0b93ecc95e..c4b257f4ca 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -15,6 +15,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", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index b95f210390..366358552d 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -15,6 +15,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", 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..cd0965b4a9 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json @@ -0,0 +1,27 @@ +{ + "parent": "anvilcraft:anvilcraft/the_start", + "criteria": { + "efficiency": { + "trigger": "anvilcraft:planet_detonation" + } + }, + "display": { + "description": { + "translate": "advancements.anvilcraft.efficiency.description" + }, + "frame": "challenge", + "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/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/api/advancement/AdvancementLineHelper.java b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java index ad7b05b9b3..93159a3c62 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java @@ -24,6 +24,7 @@ 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.PlayerKilledEntityByAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerWearAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.UseItemTrigger; @@ -688,6 +689,10 @@ public AdvancementHelper celestialEvolution(String key, MinMaxBounds.Ints massAn return this.addCriterion(key, CelestialEvolutionTrigger.TriggerInstance.evolved(massAnvils)); } + public AdvancementHelper planetDetonation(String key) { + return this.addCriterion(key, PlanetDetonationTrigger.TriggerInstance.detonated()); + } + 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/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 9c4ff4881e..5a7163720a 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -431,6 +431,10 @@ 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") + .planetDetonation("efficiency") + .save("efficiency"); industrialLine.next() .challenge(ModItems.STELLAR_EVOLUTION_ACCELERATOR_COMPONENT, "no_remnant", true) .celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) 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 7e9ef9c00f..6002e79b95 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java @@ -159,6 +159,9 @@ public static void init(RegistrumLangProvider provider) { 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.nuclear_power_10a.title", "Nuclear power, piece of cake!"); provider.add("advancements.anvilcraft.nuclear_power_10a.description", "Using heat collector to collect overheated blocks' heat"); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java index 496fbcb685..deb5df8bed 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java @@ -23,6 +23,7 @@ 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.PlayerKilledEntityByAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.PlayerWearAnvilHammerTrigger; import dev.dubhe.anvilcraft.advancements.criterion.UseItemTrigger; @@ -143,6 +144,9 @@ public class ModCriterionTriggers { 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 void register(IEventBus eventBus) { REGISTER.register(eventBus); } diff --git a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index 4014387098..c4b4daba11 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java @@ -209,4 +209,12 @@ public static void celestialEvolution(Level level, BlockPos pos, int massAnvils) } } } + + 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); + } + } + } } From 515b3f37bc6a25318fc6ae1c5f36fed33e2fe9ef Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 15:30:39 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat(advancement):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=9B=A0=E8=A1=8C=E6=98=9F=E5=9D=8D=E7=BC=A9=E6=AD=BB=E4=BA=A1?= =?UTF-8?q?=E7=9A=84=E6=88=90=E5=B0=B1=E8=A7=A6=E5=8F=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了 PlanetaryCollapseDeathTrigger 触发器类及其数据结构 - 在 ModCriterionTriggers 中注册 planetary_collapse_death 触发器 - 在 AdvancementLineHelper 中新增 planetaryCollapseDeath 方法便于调用 - 在 AnvilCraftAdvancement 中添加 Cannon Fodder 成就,绑定行星坍缩死亡触发器 - 在语言文件中添加 Cannon Fodder 成就标题与描述的多语言支持 - 在 OverworldLikeEventListener 中监听行星坍缩死亡事件并触发相应成就 - 在 TriggerUtil 中实现 planetaryCollapseDeath 方法来触发成就判定 - 新增 Cannon Fodder 成就的 JSON 配置文件,包含父级与图标等信息 - 修改效率成就添加隐藏属性,改善游戏内成就展示体验 --- .../assets/anvilcraft/lang/en_ud.json | 2 + .../assets/anvilcraft/lang/en_us.json | 2 + .../advancement/anvilcraft/cannon_fodder.json | 28 +++++++++++++ .../advancement/anvilcraft/efficiency.json | 1 + .../PlanetaryCollapseDeathTrigger.java | 39 +++++++++++++++++++ .../advancement/AdvancementLineHelper.java | 5 +++ .../advancement/AnvilCraftAdvancement.java | 6 ++- .../anvilcraft/data/lang/AdvancementLang.java | 3 ++ .../event/OverworldLikeEventListener.java | 10 +++++ .../anvilcraft/init/ModCriterionTriggers.java | 4 ++ .../dubhe/anvilcraft/util/TriggerUtil.java | 5 +++ 11 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/cannon_fodder.json create mode 100644 src/main/java/dev/dubhe/anvilcraft/advancements/criterion/PlanetaryCollapseDeathTrigger.java diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index c4b257f4ca..02b3da34c5 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -7,6 +7,8 @@ "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.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.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ɟɹǝԀ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index 366358552d..22c21fbf5f 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -7,6 +7,8 @@ "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.cannon_fodder.description": "Die to a planetary collapse inside an Overworld-Like planet", + "advancements.anvilcraft.cannon_fodder.title": "Cannon Fodder", "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", 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/efficiency.json b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json index cd0965b4a9..53afd615ce 100644 --- a/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json +++ b/src/generated/resources/data/anvilcraft/advancement/anvilcraft/efficiency.json @@ -10,6 +10,7 @@ "translate": "advancements.anvilcraft.efficiency.description" }, "frame": "challenge", + "hidden": true, "icon": { "count": 1, "id": "anvilcraft:earth_core_shard" 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/api/advancement/AdvancementLineHelper.java b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java index 93159a3c62..e3f23d2025 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java @@ -25,6 +25,7 @@ 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.UseItemTrigger; @@ -693,6 +694,10 @@ 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 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/data/advancement/AnvilCraftAdvancement.java b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java index 5a7163720a..73c4f68da3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -432,9 +432,13 @@ public static void init(RegistrumAdvancementProvider provider) { .hasItems("has_celestial_forging_anvil", ModBlocks.CELESTIAL_FORGING_ANVIL) .save("the_start"); industrialLine.createBranch().next() - .challenge(ModItems.EARTH_CORE_SHARD, "efficiency") + .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.next() .challenge(ModItems.STELLAR_EVOLUTION_ACCELERATOR_COMPONENT, "no_remnant", true) .celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) 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 6002e79b95..2cb7a87358 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java @@ -162,6 +162,9 @@ public static void init(RegistrumLangProvider provider) { 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.nuclear_power_10a.title", "Nuclear power, piece of cake!"); provider.add("advancements.anvilcraft.nuclear_power_10a.description", "Using heat collector to collect overheated blocks' heat"); diff --git a/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java index 2942217e2c..36fda7f9b3 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,14 @@ 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 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 deb5df8bed..8aaa4dc4ac 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java @@ -24,6 +24,7 @@ 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.UseItemTrigger; @@ -147,6 +148,9 @@ public class ModCriterionTriggers { 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 void register(IEventBus eventBus) { REGISTER.register(eventBus); } diff --git a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index c4b4daba11..c80527d42e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java @@ -217,4 +217,9 @@ public static void planetDetonation(Level level, BlockPos pos) { } } } + + /** 死亡事件只涉及当事玩家,不需要按位置搜索。 */ + public static void planetaryCollapseDeath(ServerPlayer player) { + ModCriterionTriggers.PLANETARY_COLLAPSE_DEATH.get().trigger(player); + } } From eb4602eebb8a62080e3cfd23259cc891df7a3bd9 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 15:51:38 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat(advancement):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=BB=91=E6=B4=9E=E5=92=8C=E4=B8=AD=E5=AD=90=E6=98=9F=E7=BB=88?= =?UTF-8?q?=E5=B1=80=E6=98=9F=E4=BD=93=E6=88=90=E5=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TriggerUtil新增支持根据StellarTerminal.Kind触发星体演化成就 - CelestialEvolutionTrigger增加对终局类型的判定和对应触发方法 - AdvancementLineHelper新增celestialEvolution重载方法支持终局类型参数 - AnvilCraftAdvancement中增加黑洞和中子星分支成就定义和保存 - AdvancementLang添加黑洞与中子星成就名称及描述多语言支持 - 语言文件(en_us, en_ud)增加对应成就的描述和标题 - 新增黑洞和中子星成就JSON数据文件,定义触发条件和显示信息 --- .../assets/anvilcraft/lang/en_ud.json | 4 +++ .../assets/anvilcraft/lang/en_us.json | 4 +++ .../advancement/anvilcraft/black_hole.json | 30 +++++++++++++++++++ .../advancement/anvilcraft/neutron_star.json | 30 +++++++++++++++++++ .../criterion/CelestialEvolutionTrigger.java | 25 +++++++++++----- .../advancement/AdvancementLineHelper.java | 5 ++++ .../megastructure/AcceleratorHandler.java | 2 +- .../advancement/AnvilCraftAdvancement.java | 9 ++++++ .../anvilcraft/data/lang/AdvancementLang.java | 6 ++++ .../dubhe/anvilcraft/util/TriggerUtil.java | 5 ++-- 10 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/black_hole.json create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/neutron_star.json diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 02b3da34c5..6cd2907cf5 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -7,6 +7,8 @@ "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.crab_claw.description": "sʍɐꞁɔ qɐɹɔ uᴉɐʇqO", @@ -67,6 +69,8 @@ "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_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ʌƎ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index 22c21fbf5f..0d15665572 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -7,6 +7,8 @@ "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.crab_claw.description": "Obtain crab claws", @@ -67,6 +69,8 @@ "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_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", 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/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/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java index 473ca6b9a2..17733153e4 100644 --- a/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java +++ b/src/main/java/dev/dubhe/anvilcraft/advancements/criterion/CelestialEvolutionTrigger.java @@ -2,6 +2,7 @@ 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; @@ -18,26 +19,36 @@ public Codec codec() { return TriggerInstance.CODEC; } - public void trigger(ServerPlayer player, int massAnvils) { - this.trigger(player, (instance) -> instance.matches(massAnvils)); + 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 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) + 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)) + new TriggerInstance(Optional.empty(), Optional.of(massAnvils), Optional.empty()) ); } - public boolean matches(int massAnvils) { - return this.massAnvils.isEmpty() || this.massAnvils.get().matches(massAnvils); + 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/api/advancement/AdvancementLineHelper.java b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java index e3f23d2025..27770b2e20 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java @@ -30,6 +30,7 @@ import dev.dubhe.anvilcraft.advancements.criterion.PlayerWearAnvilHammerTrigger; 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; @@ -690,6 +691,10 @@ public AdvancementHelper celestialEvolution(String key, MinMaxBounds.Ints massAn 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()); } 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 0597e99e10..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 @@ -597,7 +597,7 @@ private void completeEvolution(CelestialForgingAnvilBlockEntity be) { // KEEP 的冷却外观继续从快照采样。 } } - TriggerUtil.celestialEvolution(be.getLevel(), be.getBlockPos(), evolutionState.initialMass()); + TriggerUtil.celestialEvolution(be.getLevel(), be.getBlockPos(), evolutionState.initialMass(), terminal.kind()); finishAccelerator(be); syncToClient(be); } 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 73c4f68da3..896f3aa543 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -5,6 +5,7 @@ import dev.dubhe.anvilcraft.AnvilCraft; 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; @@ -439,6 +440,14 @@ public static void init(RegistrumAdvancementProvider provider) { .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.next() .challenge(ModItems.STELLAR_EVOLUTION_ACCELERATOR_COMPONENT, "no_remnant", true) .celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) 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 2cb7a87358..7c53668cb0 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java @@ -165,6 +165,12 @@ public static void init(RegistrumLangProvider provider) { 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.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.nuclear_power_10a.title", "Nuclear power, piece of cake!"); provider.add("advancements.anvilcraft.nuclear_power_10a.description", "Using heat collector to collect overheated blocks' heat"); diff --git a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index c80527d42e..9f182273d7 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; @@ -202,10 +203,10 @@ public static void multiBlockForm(Level level, BlockPos pos) { } /** 演化终局伴随超新星爆发,玩家多在爆炸范围外观察,因此搜索半径对齐震屏半径。 */ - public static void celestialEvolution(Level level, BlockPos pos, int massAnvils) { + 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); + ModCriterionTriggers.CELESTIAL_EVOLUTION.get().trigger(player, massAnvils, terminal); } } } From 53afb6cbddfd296b60bd51116df0ca71a6328f42 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 16:27:13 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat(damage):=20=E6=96=B0=E5=A2=9E=E5=A4=A9?= =?UTF-8?q?=E4=BD=93=E6=8E=A5=E8=A7=A6=E4=BC=A4=E5=AE=B3=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=8A=E7=8B=AC=E7=AB=8B=E6=A0=87=E7=AD=BE=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加黑洞接触、恒星接触及行星接触三种新伤害类型 - 天体接触伤害采用独立类型以实现专属死亡提示 - 更新伤害标签,支持新伤害类型绕过护甲、抗性、击退等效果 - 修改重力控制器中伤害来源,替换为对应新天体接触伤害类型 - 保持星体及行星接触伤害原版燃烧和摔落效果表现不变 - 增加对应的语言文本显示新伤害的死亡描述信息 - 修正玩家攻击混入对行星接触伤害的判定,保持原摔落伤害一致性 - 新增相关资源数据文件,完善伤害类型和标签配置 --- .../assets/anvilcraft/lang/en_ud.json | 3 ++ .../assets/anvilcraft/lang/en_us.json | 3 ++ .../damage_type/black_hole_contact.json | 5 ++++ .../damage_type/planet_contact.json | 5 ++++ .../anvilcraft/damage_type/star_contact.json | 6 ++++ .../tags/damage_type/bypasses_armor.json | 4 +++ .../tags/damage_type/bypasses_resistance.json | 4 +++ .../minecraft/tags/damage_type/is_fall.json | 8 ++++++ .../minecraft/tags/damage_type/is_fire.json | 4 +++ .../tags/damage_type/no_knockback.json | 4 +++ .../neoforge/tags/damage_type/is_magic.json | 4 +++ .../block/entity/CfaGravityController.java | 6 ++-- .../dubhe/anvilcraft/data/lang/OtherLang.java | 6 ++++ .../data/tags/DamageTypeTagLoader.java | 20 +++++++++---- .../init/entity/ModDamageTypes.java | 28 +++++++++++++++++++ .../mixin/PlayerHitEntityMixin.java | 5 +++- 16 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 src/generated/resources/data/anvilcraft/damage_type/black_hole_contact.json create mode 100644 src/generated/resources/data/anvilcraft/damage_type/planet_contact.json create mode 100644 src/generated/resources/data/anvilcraft/damage_type/star_contact.json create mode 100644 src/generated/resources/data/minecraft/tags/damage_type/is_fall.json diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 6cd2907cf5..bfe12a27b0 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -926,13 +926,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 0d15665572..6741a5c014 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -926,13 +926,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/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/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/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/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)); From 0a7df346592dd01d04dc7bc4552033b62c1f7ae5 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 16:38:28 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat(advancement):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E2=80=9C=E5=A4=9C=E6=99=9A=E6=9D=A5=E8=AE=BF=E2=80=9D=E6=98=9F?= =?UTF-8?q?=E6=8E=A5=E8=A7=A6=E6=AD=BB=E4=BA=A1=E8=BF=9B=E5=BA=A6=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 StarContactDeathTrigger 实现星接触死亡触发器 - 注册并初始化星接触死亡触发条件 ModCriterionTriggers.STAR_CONTACT_DEATH - AdvancementLineHelper 新增 starContactDeath 方法支持该触发器 - AnvilCraftAdvancement 新增“come_at_night”任务,使用星接触死亡触发器 - AdvancementLang 中添加“come_at_night”进度名称及描述文本 - OverworldLikeEventListener 监听星接触死亡事件触发进度 - TriggerUtil 新增 starContactDeath 方法简化触发调用 --- .../criterion/StarContactDeathTrigger.java | 39 +++++++++++++++++++ .../advancement/AdvancementLineHelper.java | 5 +++ .../advancement/AnvilCraftAdvancement.java | 4 ++ .../anvilcraft/data/lang/AdvancementLang.java | 3 ++ .../event/OverworldLikeEventListener.java | 8 ++++ .../anvilcraft/init/ModCriterionTriggers.java | 4 ++ .../dubhe/anvilcraft/util/TriggerUtil.java | 5 +++ 7 files changed, 68 insertions(+) create mode 100644 src/main/java/dev/dubhe/anvilcraft/advancements/criterion/StarContactDeathTrigger.java 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 27770b2e20..d6c31d2fb7 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/advancement/AdvancementLineHelper.java @@ -28,6 +28,7 @@ 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; @@ -703,6 +704,10 @@ 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/data/advancement/AnvilCraftAdvancement.java b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java index 896f3aa543..74d6423987 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/advancement/AnvilCraftAdvancement.java @@ -448,6 +448,10 @@ public static void init(RegistrumAdvancementProvider provider) { .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)) 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 7c53668cb0..0b7d631707 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/AdvancementLang.java @@ -165,6 +165,9 @@ public static void init(RegistrumLangProvider provider) { 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"); diff --git a/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java index 36fda7f9b3..18a03f1702 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/OverworldLikeEventListener.java @@ -59,6 +59,14 @@ public static void onPlanetaryCollapseDeath(LivingDeathEvent event) { } } + @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 8aaa4dc4ac..77a6a092cb 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModCriterionTriggers.java @@ -27,6 +27,7 @@ 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; @@ -151,6 +152,9 @@ public class ModCriterionTriggers { 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/util/TriggerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java index 9f182273d7..826657187d 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/TriggerUtil.java @@ -223,4 +223,9 @@ public static void planetDetonation(Level level, BlockPos pos) { 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); + } } From b96b72b4ccf650884f02d4710e0acef1d48461c9 Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 16:38:39 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat(locale):=20=E6=B7=BB=E5=8A=A0=E2=80=9C?= =?UTF-8?q?come=5Fat=5Fnight=E2=80=9D=E6=88=90=E5=B0=B1=E7=9A=84=E4=B8=AD?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增“advancements.anvilcraft.come_at_night”标题的本地化文本 - 新增“advancements.anvilcraft.come_at_night”描述的本地化文本 - 中文描述内容为“被星光笼罩” - 英文标题内容为“Showdown at Night”倒转样式 --- src/generated/resources/assets/anvilcraft/lang/en_ud.json | 2 ++ src/generated/resources/assets/anvilcraft/lang/en_us.json | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index bfe12a27b0..9d2fa8eb0e 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -11,6 +11,8 @@ "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ɟɹǝԀ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index 6741a5c014..0159cb7814 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -11,6 +11,8 @@ "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", From 26bba56c5c2377b7281483fa2a4560e984923c5f Mon Sep 17 00:00:00 2001 From: Pigeon_Nian Date: Fri, 2 Oct 2026 16:42:45 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat(advancement):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E2=80=9Ccome=5Fat=5Fnight=E2=80=9D=E9=9A=90=E8=97=8F=E6=88=90?= =?UTF-8?q?=E5=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建新的隐藏成就“come_at_night” - 设置成就触发器为“star_contact_death” - 指定成就图标为“celestial_forging_anvil” - 定义成就的父级为“the_start” - 启用成就的遥测事件发送 --- .../advancement/anvilcraft/come_at_night.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/generated/resources/data/anvilcraft/advancement/anvilcraft/come_at_night.json 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