diff --git a/src/generated/resources/.cache/577536f6ebfcf295de7fbac0bb53580fb6178459 b/src/generated/resources/.cache/577536f6ebfcf295de7fbac0bb53580fb6178459 new file mode 100644 index 000000000..109b50586 --- /dev/null +++ b/src/generated/resources/.cache/577536f6ebfcf295de7fbac0bb53580fb6178459 @@ -0,0 +1,17 @@ +// 1.21.1 2025-04-04T15:18:11.251884 Superb Warfare Advancements +03d6ad4d0bdd3ba66b765dcae9705692070e7f94 data/superbwarfare/advancement/main/ancient_technology.json +d24849d7fc09d8cc9a27203e57f1fd42f72a27a7 data/superbwarfare/advancement/main/banzai.json +70bd4fa04553c415c80656c4b07cf3814a13110c data/superbwarfare/advancement/main/best_friend.json +a36b5cb81c0038d909b2b90da89abed15268e750 data/superbwarfare/advancement/main/blueprint.json +120bd3b36a2c561d4e54e860afa4a9900936129e data/superbwarfare/advancement/main/boomstick_melee.json +6be355a5d8c94c2638163394c48905365b8d4146 data/superbwarfare/advancement/main/cannon_blueprint.json +57bb19a6713a0da6c5b46ac13f603463a755ced5 data/superbwarfare/advancement/main/clean_energy.json +39d859d779a4807144ecb87c91e60ac193812133 data/superbwarfare/advancement/main/common_blueprint.json +c051b49513bac2be82c2c24e236734a5c3a358c8 data/superbwarfare/advancement/main/enclave.json +5ac1ed91c7e49a728ab0174e3b828998bfd94801 data/superbwarfare/advancement/main/epic_blueprint.json +47b2d8bd5335e224be175f09b49fcbd4aafa4cf6 data/superbwarfare/advancement/main/hammer.json +926900f8c598a039ffbf8cac552f397c522f82c7 data/superbwarfare/advancement/main/legendary_blueprint.json +52417b43fbf1ca3a41d95ee51eafdc4f734bfaa3 data/superbwarfare/advancement/main/physics_excalibur.json +392baba1930be09abc70836090c884ad4ada82e8 data/superbwarfare/advancement/main/rare_blueprint.json +2df388bd7a8e6d162d005aff3bd4892763549ccd data/superbwarfare/advancement/main/root.json +6855de73219722b4e44985c87f2d57d71cfd7e15 data/superbwarfare/advancement/main/super_container.json diff --git a/src/generated/resources/data/superbwarfare/advancement/main/ancient_technology.json b/src/generated/resources/data/superbwarfare/advancement/main/ancient_technology.json new file mode 100644 index 000000000..5903449c9 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/ancient_technology.json @@ -0,0 +1,34 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:ancient_cpu" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.ancient_technology.des" + }, + "frame": "goal", + "icon": { + "count": 1, + "id": "superbwarfare:ancient_cpu" + }, + "title": { + "translate": "superbwarfare.advancement.main.ancient_technology" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/banzai.json b/src/generated/resources/data/superbwarfare/advancement/main/banzai.json new file mode 100644 index 000000000..1f0587344 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/banzai.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:lunge_mine" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.banzai.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:lunge_mine" + }, + "title": { + "translate": "superbwarfare.advancement.main.banzai" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/best_friend.json b/src/generated/resources/data/superbwarfare/advancement/main/best_friend.json new file mode 100644 index 000000000..3e8c3e651 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/best_friend.json @@ -0,0 +1,34 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:claymore_mine" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.best_friend.des" + }, + "hidden": true, + "icon": { + "count": 1, + "id": "superbwarfare:claymore_mine" + }, + "title": { + "translate": "superbwarfare.advancement.main.best_friend" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/blueprint.json new file mode 100644 index 000000000..30de5304c --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:trachelium_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/boomstick_melee.json b/src/generated/resources/data/superbwarfare/advancement/main/boomstick_melee.json new file mode 100644 index 000000000..5c112e86c --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/boomstick_melee.json @@ -0,0 +1,28 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "trigger": "superbwarfare:rpg_melee_explosion" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.boomstick_melee.des" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "superbwarfare:rocket" + }, + "title": { + "translate": "superbwarfare.advancement.main.boomstick_melee" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/cannon_blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/cannon_blueprint.json new file mode 100644 index 000000000..9fd630cf6 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/cannon_blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/blueprint", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint/cannon" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.cannon_blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:mk_42_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.cannon_blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/clean_energy.json b/src/generated/resources/data/superbwarfare/advancement/main/clean_energy.json new file mode 100644 index 000000000..798ef5092 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/clean_energy.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/physics_excalibur", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:charging_station" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.clean_energy.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:charging_station" + }, + "title": { + "translate": "superbwarfare.advancement.main.clean_energy" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/common_blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/common_blueprint.json new file mode 100644 index 000000000..bfd997442 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/common_blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/blueprint", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint/common" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.common_blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:trachelium_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.common_blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/enclave.json b/src/generated/resources/data/superbwarfare/advancement/main/enclave.json new file mode 100644 index 000000000..7821758cd --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/enclave.json @@ -0,0 +1,34 @@ +{ + "parent": "superbwarfare:main/ancient_technology", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:reforging_table" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.enclave.des" + }, + "frame": "goal", + "icon": { + "count": 1, + "id": "superbwarfare:reforging_table" + }, + "title": { + "translate": "superbwarfare.advancement.main.enclave" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/epic_blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/epic_blueprint.json new file mode 100644 index 000000000..25d141a8c --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/epic_blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/rare_blueprint", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint/epic" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.epic_blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:trachelium_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.epic_blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/hammer.json b/src/generated/resources/data/superbwarfare/advancement/main/hammer.json new file mode 100644 index 000000000..f739c8f6b --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/hammer.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:hammer" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.hammer.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:hammer" + }, + "title": { + "translate": "superbwarfare.advancement.main.hammer" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/legendary_blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/legendary_blueprint.json new file mode 100644 index 000000000..97fc77004 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/legendary_blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/epic_blueprint", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint/legendary" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.legendary_blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:trachelium_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.legendary_blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/physics_excalibur.json b/src/generated/resources/data/superbwarfare/advancement/main/physics_excalibur.json new file mode 100644 index 000000000..2a41704e7 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/physics_excalibur.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/root", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:crowbar" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.physics_excalibur.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:crowbar" + }, + "title": { + "translate": "superbwarfare.advancement.main.physics_excalibur" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/rare_blueprint.json b/src/generated/resources/data/superbwarfare/advancement/main/rare_blueprint.json new file mode 100644 index 000000000..446f97f1a --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/rare_blueprint.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/common_blueprint", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "#superbwarfare:blueprint/rare" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.rare_blueprint.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:trachelium_blueprint" + }, + "title": { + "translate": "superbwarfare.advancement.main.rare_blueprint" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/root.json b/src/generated/resources/data/superbwarfare/advancement/main/root.json new file mode 100644 index 000000000..b9d536d92 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/root.json @@ -0,0 +1,28 @@ +{ + "criteria": { + "0": { + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "background": "superbwarfare:textures/block/sandbag.png", + "description": { + "translate": "superbwarfare.advancement.main.root.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:taser" + }, + "show_toast": false, + "title": { + "translate": "superbwarfare.advancement.main.root" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/advancement/main/super_container.json b/src/generated/resources/data/superbwarfare/advancement/main/super_container.json new file mode 100644 index 000000000..9d3d013e6 --- /dev/null +++ b/src/generated/resources/data/superbwarfare/advancement/main/super_container.json @@ -0,0 +1,33 @@ +{ + "parent": "superbwarfare:main/clean_energy", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": "superbwarfare:container" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "superbwarfare.advancement.main.super_container.des" + }, + "icon": { + "count": 1, + "id": "superbwarfare:container" + }, + "title": { + "translate": "superbwarfare.advancement.main.super_container" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/Mod.java b/src/main/java/com/atsuishio/superbwarfare/Mod.java index 56851bda4..c242616d0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/Mod.java +++ b/src/main/java/com/atsuishio/superbwarfare/Mod.java @@ -55,6 +55,7 @@ public class Mod { ModRecipes.RECIPE_SERIALIZERS.register(bus); ModArmorMaterials.MATERIALS.register(bus); ModAttributes.ATTRIBUTES.register(bus); + ModCriteriaTriggers.REGISTRY.register(bus); // bus.addListener(this::onCommonSetup); bus.addListener(this::onClientSetup); diff --git a/src/main/java/com/atsuishio/superbwarfare/advancement/criteria/RPGMeleeExplosionTrigger.java b/src/main/java/com/atsuishio/superbwarfare/advancement/criteria/RPGMeleeExplosionTrigger.java new file mode 100644 index 000000000..e6a346788 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/advancement/criteria/RPGMeleeExplosionTrigger.java @@ -0,0 +1,41 @@ +package com.atsuishio.superbwarfare.advancement.criteria; + +import com.atsuishio.superbwarfare.init.ModCriteriaTriggers; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +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 RPGMeleeExplosionTrigger extends SimpleCriterionTrigger { + + public void trigger(ServerPlayer pPlayer) { + this.trigger(pPlayer, instance -> true); + } + + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public record TriggerInstance( + Optional player) implements SimpleCriterionTrigger.SimpleInstance { + + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> + instance.group(EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player") + .forGetter(RPGMeleeExplosionTrigger.TriggerInstance::player)).apply(instance, TriggerInstance::new)); + + public static Criterion get() { + return ModCriteriaTriggers.RPG_MELEE_EXPLOSION.get().createCriterion(new TriggerInstance(Optional.empty())); + } + + @Override + public Optional player() { + return this.player; + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/DataGenerators.java b/src/main/java/com/atsuishio/superbwarfare/datagen/DataGenerators.java index dee870f08..81b30a4c5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/datagen/DataGenerators.java +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/DataGenerators.java @@ -28,6 +28,6 @@ public class DataGenerators { ModBlockTagProvider tagProvider = generator.addProvider(event.includeServer(), new ModBlockTagProvider(packOutput, lookupProvider, existingFileHelper)); generator.addProvider(event.includeServer(), new ModItemTagProvider(packOutput, lookupProvider, tagProvider.contentsGetter(), existingFileHelper)); generator.addProvider(event.includeServer(), new ModDamageTypeTagProvider(packOutput, lookupProvider, existingFileHelper)); -// generator.addProvider(event.includeServer(), new ModAdvancementProvider(packOutput, existingFileHelper)); + generator.addProvider(event.includeServer(), new ModAdvancementProvider(packOutput, lookupProvider, existingFileHelper)); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancement.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancement.java new file mode 100644 index 000000000..14c8fdd2c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancement.java @@ -0,0 +1,197 @@ +package com.atsuishio.superbwarfare.datagen; + +import com.atsuishio.superbwarfare.Mod; +import net.minecraft.ChatFormatting; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.*; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; + +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +/** + * Codes Based on @Create + */ +@SuppressWarnings("unused") +public class ModAdvancement { + + public static final ResourceLocation MAIN_BACKGROUND = Mod.loc("textures/block/sandbag.png"); + public static final ResourceLocation LEGENDARY_BACKGROUND = Mod.loc("textures/block/steel_block.png"); + + private final Advancement.Builder builder; + private ModAdvancement parent; + public AdvancementHolder result; + private final String id; + private final Group group; + + public ModAdvancement(String id, UnaryOperator b) { + this.builder = Advancement.Builder.advancement(); + this.id = id; + + Builder builtInBuilder = new Builder(); + b.apply(builtInBuilder); + this.group = builtInBuilder.group; + + Optional bg = Optional.empty(); + if (id.equals("root")) { + if (group == Group.MAIN) { + bg = Optional.of(MAIN_BACKGROUND); + } + if (group == Group.LEGENDARY) { + bg = Optional.of(LEGENDARY_BACKGROUND); + } + } + + builder.display(new DisplayInfo(builtInBuilder.icon, titleComponent(), + Component.translatable(description()), bg, + builtInBuilder.type.frame, builtInBuilder.type.toast, builtInBuilder.type.announce, builtInBuilder.type.hide)); + + ModAdvancementProvider.ADVANCEMENTS.add(this); + } + + private String title() { + return Mod.MODID + ".advancement." + group.path + "." + id; + } + + private Component titleComponent() { + if (this.group == Group.LEGENDARY && !this.id.equals("root")) { + return Component.translatable(title()).withStyle(ChatFormatting.GOLD); + } + return Component.translatable(title()); + } + + private String description() { + return title() + ".des"; + } + + public void save(Consumer t) { + if (parent != null) { + builder.parent(parent.result); + } + + AdvancementHolder advancementholder = builder.build(Mod.loc(group.path + "/" + id)); + t.accept(advancementholder); + result = advancementholder; + } + + enum Type { + DEFAULT(AdvancementType.TASK, true, true, false), + DEFAULT_NO_ANNOUNCE(AdvancementType.TASK, true, false, false), + DEFAULT_CHALLENGE(AdvancementType.CHALLENGE, true, true, false), + SILENT(AdvancementType.TASK, false, false, false), + GOAL(AdvancementType.GOAL, true, true, false), + SECRET(AdvancementType.TASK, true, true, true), + SECRET_CHALLENGE(AdvancementType.CHALLENGE, true, true, true); + + private final AdvancementType frame; + private final boolean toast; + private final boolean announce; + private final boolean hide; + + Type(AdvancementType frame, boolean toast, boolean announce, boolean hide) { + this.frame = frame; + this.toast = toast; + this.announce = announce; + this.hide = hide; + } + } + + enum Group { + MAIN("main"), + LEGENDARY("legendary"); + + public final String path; + + Group(String path) { + this.path = path; + } + } + + public class Builder { + + private Type type = Type.DEFAULT; + private int keyIndex; + private ItemStack icon; + private Group group = Group.MAIN; + + Builder type(Type type) { + this.type = type; + return this; + } + + Builder parent(ModAdvancement other) { + ModAdvancement.this.parent = other; + return this; + } + + Builder icon(ItemLike item) { + return icon(new ItemStack(item)); + } + + Builder icon(ItemStack stack) { + icon = stack; + return this; + } + + Builder whenBlockPlaced(Block block) { + return externalTrigger(ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(block)); + } + + Builder whenIconCollected() { + return externalTrigger(InventoryChangeTrigger.TriggerInstance.hasItems(icon.getItem())); + } + + Builder whenItemCollected(ItemLike itemProvider) { + return externalTrigger(InventoryChangeTrigger.TriggerInstance.hasItems(itemProvider)); + } + + Builder whenItemCollected(TagKey tag) { + return externalTrigger(InventoryChangeTrigger.TriggerInstance + .hasItems(ItemPredicate.Builder.item().of(tag).build())); + } + + Builder whenItemConsumed(ItemLike itemProvider) { + return externalTrigger(ConsumeItemTrigger.TriggerInstance.usedItem(itemProvider)); + } + + Builder whenIconConsumed() { + return externalTrigger(ConsumeItemTrigger.TriggerInstance.usedItem(icon.getItem())); + } + + Builder awardedForFree() { + return externalTrigger(InventoryChangeTrigger.TriggerInstance.hasItems(new ItemLike[]{})); + } + + Builder whenEffectChanged(MobEffectsPredicate.Builder predicate) { + return externalTrigger(EffectsChangedTrigger.TriggerInstance.hasEffects(predicate)); + } + + Builder externalTrigger(Criterion trigger) { + builder.addCriterion(String.valueOf(keyIndex), trigger); + keyIndex++; + return this; + } + + Builder requirement(AdvancementRequirements requirements) { + builder.requirements(requirements); + return this; + } + + Builder group(Group group) { + this.group = group; + return this; + } + + Builder rewardExp(int exp) { + builder.rewards(AdvancementRewards.Builder.experience(exp).build()); + return this; + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancementProvider.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancementProvider.java new file mode 100644 index 000000000..dbfdff626 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModAdvancementProvider.java @@ -0,0 +1,151 @@ +package com.atsuishio.superbwarfare.datagen; + +import com.atsuishio.superbwarfare.advancement.criteria.RPGMeleeExplosionTrigger; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModTags; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +/** + * Codes Based on @Create + */ +public class ModAdvancementProvider implements DataProvider { + + private final PackOutput packOutput; + private final ExistingFileHelper existingFileHelper; + private final CompletableFuture registries; + + public static final List ADVANCEMENTS = new ArrayList<>(); + + @SuppressWarnings("unused") + public static ModAdvancement START = null, + /** + * Main + */ + MAIN_ROOT = advancement("root", builder -> builder.icon(ModItems.TASER.get()) + .type(ModAdvancement.Type.SILENT) + .awardedForFree()), + + BEST_FRIEND = advancement("best_friend", builder -> builder.icon(ModItems.CLAYMORE_MINE.get()) + .whenIconCollected() + .type(ModAdvancement.Type.SECRET) + .parent(MAIN_ROOT)), + + BANZAI = advancement("banzai", builder -> builder.icon(ModItems.LUNGE_MINE.get()) + .whenIconCollected() + .parent(MAIN_ROOT)), + + HAMMER = advancement("hammer", builder -> builder.icon(ModItems.HAMMER.get()) + .whenIconCollected() + .parent(MAIN_ROOT)), + + PHYSICS_EXCALIBUR = advancement("physics_excalibur", builder -> builder.icon(ModItems.CROWBAR.get()) + .whenIconCollected() + .parent(MAIN_ROOT)), + + CLEAN_ENERGY = advancement("clean_energy", builder -> builder.icon(ModItems.CHARGING_STATION.get()) + .whenIconCollected() + .parent(PHYSICS_EXCALIBUR)), + + SUPER_CONTAINER = advancement("super_container", builder -> builder.icon(ModItems.CONTAINER.get()) + .whenIconCollected() + .parent(CLEAN_ENERGY)), + + // 蓝图 + BLUEPRINT = advancement("blueprint", builder -> builder.icon(ModItems.TRACHELIUM_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.BLUEPRINT) + .parent(MAIN_ROOT)), + + COMMON_BLUEPRINT = advancement("common_blueprint", builder -> builder.icon(ModItems.TRACHELIUM_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.COMMON_BLUEPRINT) + .parent(BLUEPRINT)), + + RARE_BLUEPRINT = advancement("rare_blueprint", builder -> builder.icon(ModItems.TRACHELIUM_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.RARE_BLUEPRINT) + .parent(COMMON_BLUEPRINT)), + + EPIC_BLUEPRINT = advancement("epic_blueprint", builder -> builder.icon(ModItems.TRACHELIUM_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.EPIC_BLUEPRINT) + .parent(RARE_BLUEPRINT)), + + LEGENDARY_BLUEPRINT = advancement("legendary_blueprint", builder -> builder.icon(ModItems.TRACHELIUM_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.LEGENDARY_BLUEPRINT) + .parent(EPIC_BLUEPRINT)), + + CANNON_BLUEPRINT = advancement("cannon_blueprint", builder -> builder.icon(ModItems.MK_42_BLUEPRINT.get()) + .whenItemCollected(ModTags.Items.CANNON_BLUEPRINT) + .parent(BLUEPRINT)), + + // 古代芯片 + ANCIENT_TECHNOLOGY = advancement("ancient_technology", builder -> builder.icon(ModItems.ANCIENT_CPU.get()) + .whenIconCollected() + .type(ModAdvancement.Type.GOAL) + .parent(MAIN_ROOT)), + + ENCLAVE = advancement("enclave", builder -> builder.icon(ModItems.REFORGING_TABLE.get()) + .whenIconCollected() + .type(ModAdvancement.Type.GOAL) + .parent(ANCIENT_TECHNOLOGY)), + + // 哑弹棒(?) + BOOMSTICK_MELEE = advancement("boomstick_melee", builder -> builder.icon(ModItems.ROCKET.get()) + .externalTrigger(RPGMeleeExplosionTrigger.TriggerInstance.get()) + .type(ModAdvancement.Type.SECRET_CHALLENGE) + .parent(MAIN_ROOT)), + + END = null; + + + public ModAdvancementProvider(PackOutput output, CompletableFuture lookupProvider, ExistingFileHelper existingFileHelper) { + this.packOutput = output; + this.existingFileHelper = existingFileHelper; + this.registries = lookupProvider; + } + + private static ModAdvancement advancement(String id, UnaryOperator b) { + return new ModAdvancement(id, b); + } + + @Override + public @NotNull CompletableFuture run(@NotNull CachedOutput output) { + List> futures = new ArrayList<>(); + PackOutput.PathProvider pathProvider = packOutput.createPathProvider(PackOutput.Target.DATA_PACK, "advancement"); + + return this.registries.thenCompose(provider -> { + Consumer consumer = advancementHolder -> { + ResourceLocation id = advancementHolder.id(); + if (existingFileHelper.exists(id, PackType.SERVER_DATA, ".json", "advancement")) { + throw new IllegalStateException("Duplicate advancement " + id); + } + Path path = pathProvider.json(advancementHolder.id()); + futures.add(DataProvider.saveStable(output, provider, Advancement.CODEC, advancementHolder.value(), path)); + }; + + for (ModAdvancement advancement : ADVANCEMENTS) { + advancement.save(consumer); + } + + return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); + }); + } + + @Override + public @NotNull String getName() { + return "Superb Warfare Advancements"; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModCriteriaTriggers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModCriteriaTriggers.java new file mode 100644 index 000000000..549093d31 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModCriteriaTriggers.java @@ -0,0 +1,16 @@ +package com.atsuishio.superbwarfare.init; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.advancement.criteria.RPGMeleeExplosionTrigger; +import net.minecraft.advancements.CriterionTrigger; +import net.minecraft.core.registries.Registries; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ModCriteriaTriggers { + + public static final DeferredRegister> REGISTRY = DeferredRegister.create(Registries.TRIGGER_TYPE, Mod.MODID); + + public static final Supplier RPG_MELEE_EXPLOSION = REGISTRY.register("rpg_melee_explosion", RPGMeleeExplosionTrigger::new); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModRecipes.java b/src/main/java/com/atsuishio/superbwarfare/init/ModRecipes.java index 6005e2913..85e67d5b1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModRecipes.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModRecipes.java @@ -12,7 +12,7 @@ import net.neoforged.neoforge.registries.DeferredRegister; @SuppressWarnings("unused") public class ModRecipes { - // TODO recipe serializer 为什么无效 + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, Mod.MODID); public static final DeferredHolder, RecipeSerializer> POTION_MORTAR_SHELL_SERIALIZER = @@ -22,5 +22,4 @@ public class ModRecipes { RECIPE_SERIALIZERS.register("ammo_box_add_ammo", () -> new SimpleCraftingRecipeSerializer<>(AmmoBoxAddAmmoRecipe::new)); public static final DeferredHolder, SimpleCraftingRecipeSerializer> AMMO_BOX_EXTRACT_AMMO_SERIALIZER = RECIPE_SERIALIZERS.register("ammo_box_extract_ammo", () -> new SimpleCraftingRecipeSerializer<>(AmmoBoxExtractAmmoRecipe::new)); - } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java index 9ab069ce6..c4864412e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.PoseTool; import com.atsuishio.superbwarfare.client.renderer.item.RocketItemRenderer; import com.atsuishio.superbwarfare.entity.projectile.RpgRocketEntity; +import com.atsuishio.superbwarfare.init.ModCriteriaTriggers; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.tools.ParticleTool; @@ -112,8 +113,7 @@ public class Rocket extends Item implements GeoItem, ProjectileItem { } if (source instanceof ServerPlayer player) { - // TODO criteria -// CriteriaRegister.RPG_MELEE_EXPLOSION.trigger(player); + ModCriteriaTriggers.RPG_MELEE_EXPLOSION.get().trigger(player); if (!player.isCreative()) { stack.shrink(1); }