diff --git a/src/generated/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json b/src/generated/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json index 8f9ec57f..0b9418ae 100644 --- a/src/generated/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json +++ b/src/generated/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json @@ -1,8 +1,8 @@ { "entries": [ "werewolves:inject/chests/stronghold_corridor", - "werewolves:inject/chests/desert_pyramid", "werewolves:inject/chests/jungle_temple", + "werewolves:inject/chests/desert_pyramid", "werewolves:inject/entity/entities/skeleton", "werewolves:inject/entity/entities/villager", "werewolves:hunter_liver", diff --git a/src/generated/resources/data/werewolves/advancement/another_one_bites_the_dust.json b/src/generated/resources/data/werewolves/advancement/another_one_bites_the_dust.json new file mode 100644 index 00000000..79a41964 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/another_one_bites_the_dust.json @@ -0,0 +1,49 @@ +{ + "parent": "werewolves:thick_fur_coat", + "criteria": { + "devour": { + "conditions": { + "killing_blow": { + "tags": [ + { + "expected": true, + "id": "werewolves:bite" + } + ] + } + }, + "trigger": "minecraft:player_killed_entity" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.another_one_bites_the_dust.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:werewolf_tooth" + }, + "title": { + "translate": "advancements.werewolves.another_one_bites_the_dust" + } + }, + "requirements": [ + [ + "faction" + ], + [ + "devour" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/bad_moon_rising.json b/src/generated/resources/data/werewolves/advancement/bad_moon_rising.json new file mode 100644 index 00000000..b7efa012 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/bad_moon_rising.json @@ -0,0 +1,42 @@ +{ + "parent": "werewolves:teen_wolf", + "criteria": { + "action": { + "conditions": { + "action": "transform_full_moon" + }, + "trigger": "werewolves:werewolf_action" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.bad_moon_rising.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:werewolf_minion_charm" + }, + "title": { + "translate": "advancements.werewolves.bad_moon_rising" + } + }, + "requirements": [ + [ + "action" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/beast_of_gevauden.json b/src/generated/resources/data/werewolves/advancement/beast_of_gevauden.json new file mode 100644 index 00000000..5d8eb365 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/beast_of_gevauden.json @@ -0,0 +1,43 @@ +{ + "parent": "werewolves:little_red_riding_hood", + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + }, + "village": { + "conditions": { + "action": "village_conquered" + }, + "trigger": "werewolves:werewolf_action" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.beast_of_gevauden.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "werewolves:pelt_helmet" + }, + "title": { + "translate": "advancements.werewolves.beast_of_gevauden" + } + }, + "requirements": [ + [ + "faction" + ], + [ + "village" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/bite_the_evil_in_the_bud.json b/src/generated/resources/data/werewolves/advancement/bite_the_evil_in_the_bud.json new file mode 100644 index 00000000..cea4c3cc --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/bite_the_evil_in_the_bud.json @@ -0,0 +1,40 @@ +{ + "parent": "werewolves:standing_here_i_realize", + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + }, + "killed": { + "trigger": "vampirism:mother_win" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.bite_the_evil_in_the_bud.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "vampirism:mother_core" + }, + "title": { + "translate": "advancements.werewolves.bite_the_evil_in_the_bud" + } + }, + "requirements": [ + [ + "killed" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/dog_soldiers.json b/src/generated/resources/data/werewolves/advancement/dog_soldiers.json new file mode 100644 index 00000000..6ded0042 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/dog_soldiers.json @@ -0,0 +1,39 @@ +{ + "parent": "werewolves:hairy_situation", + "criteria": { + "forest": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "location": { + "biomes": "werewolves:werewolf_heaven" + } + } + } + ] + }, + "trigger": "minecraft:location" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.dog_soldiers.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:magic_sapling" + }, + "title": { + "translate": "advancements.werewolves.dog_soldiers" + } + }, + "requirements": [ + [ + "forest" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/dont_touch_that.json b/src/generated/resources/data/werewolves/advancement/dont_touch_that.json new file mode 100644 index 00000000..82487734 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/dont_touch_that.json @@ -0,0 +1,42 @@ +{ + "parent": "werewolves:howling_moon", + "criteria": { + "action": { + "conditions": { + "action": "touch_silver" + }, + "trigger": "werewolves:werewolf_action" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.dont_touch_that.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:silver_ingot" + }, + "title": { + "translate": "advancements.werewolves.dont_touch_that" + } + }, + "requirements": [ + [ + "action" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/hairy_situation.json b/src/generated/resources/data/werewolves/advancement/hairy_situation.json new file mode 100644 index 00000000..60160004 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/hairy_situation.json @@ -0,0 +1,55 @@ +{ + "parent": "werewolves:teen_wolf", + "criteria": { + "dark_pelt": { + "conditions": { + "items": [ + { + "items": "werewolves:dark_pelt" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "pelt": { + "conditions": { + "items": [ + { + "items": "werewolves:pelt" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "white_pelt": { + "conditions": { + "items": [ + { + "items": "werewolves:white_pelt" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.hairy_situation.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:pelt" + }, + "title": { + "translate": "advancements.werewolves.hairy_situation" + } + }, + "requirements": [ + [ + "pelt", + "dark_pelt", + "white_pelt" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/howling_moon.json b/src/generated/resources/data/werewolves/advancement/howling_moon.json new file mode 100644 index 00000000..b53ff5c4 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/howling_moon.json @@ -0,0 +1,42 @@ +{ + "parent": "werewolves:bad_moon_rising", + "criteria": { + "action": { + "conditions": { + "action": "howling" + }, + "trigger": "werewolves:werewolf_action" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.howling_moon.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:werewolf_minion_upgrade_special" + }, + "title": { + "translate": "advancements.werewolves.howling_moon" + } + }, + "requirements": [ + [ + "action" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/insatiable_beast.json b/src/generated/resources/data/werewolves/advancement/insatiable_beast.json new file mode 100644 index 00000000..529681b2 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/insatiable_beast.json @@ -0,0 +1,243 @@ +{ + "parent": "werewolves:beast_of_gevauden", + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + }, + "minecraft:beef": { + "conditions": { + "item": { + "items": "minecraft:beef" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:chicken": { + "conditions": { + "item": { + "items": "minecraft:chicken" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cod": { + "conditions": { + "item": { + "items": "minecraft:cod" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_beef": { + "conditions": { + "item": { + "items": "minecraft:cooked_beef" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_chicken": { + "conditions": { + "item": { + "items": "minecraft:cooked_chicken" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_cod": { + "conditions": { + "item": { + "items": "minecraft:cooked_cod" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_mutton": { + "conditions": { + "item": { + "items": "minecraft:cooked_mutton" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_porkchop": { + "conditions": { + "item": { + "items": "minecraft:cooked_porkchop" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_rabbit": { + "conditions": { + "item": { + "items": "minecraft:cooked_rabbit" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:cooked_salmon": { + "conditions": { + "item": { + "items": "minecraft:cooked_salmon" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:mutton": { + "conditions": { + "item": { + "items": "minecraft:mutton" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:porkchop": { + "conditions": { + "item": { + "items": "minecraft:porkchop" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:pufferfish": { + "conditions": { + "item": { + "items": "minecraft:pufferfish" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:rabbit": { + "conditions": { + "item": { + "items": "minecraft:rabbit" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:rotten_flesh": { + "conditions": { + "item": { + "items": "minecraft:rotten_flesh" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:salmon": { + "conditions": { + "item": { + "items": "minecraft:salmon" + } + }, + "trigger": "minecraft:consume_item" + }, + "minecraft:tropical_fish": { + "conditions": { + "item": { + "items": "minecraft:tropical_fish" + } + }, + "trigger": "minecraft:consume_item" + }, + "vampirism:human_heart": { + "conditions": { + "item": { + "items": "vampirism:human_heart" + } + }, + "trigger": "minecraft:consume_item" + }, + "werewolves:liver": { + "conditions": { + "item": { + "items": "werewolves:liver" + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.insatiable_beast.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "werewolves:liver" + }, + "title": { + "translate": "advancements.werewolves.insatiable_beast" + } + }, + "requirements": [ + [ + "faction" + ], + [ + "minecraft:beef" + ], + [ + "minecraft:cooked_beef" + ], + [ + "minecraft:porkchop" + ], + [ + "minecraft:cooked_porkchop" + ], + [ + "minecraft:chicken" + ], + [ + "minecraft:cooked_chicken" + ], + [ + "minecraft:mutton" + ], + [ + "minecraft:cooked_mutton" + ], + [ + "minecraft:rabbit" + ], + [ + "minecraft:cooked_rabbit" + ], + [ + "minecraft:cod" + ], + [ + "minecraft:cooked_cod" + ], + [ + "minecraft:salmon" + ], + [ + "minecraft:cooked_salmon" + ], + [ + "minecraft:pufferfish" + ], + [ + "minecraft:tropical_fish" + ], + [ + "minecraft:rotten_flesh" + ], + [ + "vampirism:human_heart" + ], + [ + "werewolves:liver" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/little_pigs.json b/src/generated/resources/data/werewolves/advancement/little_pigs.json new file mode 100644 index 00000000..ccd963c1 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/little_pigs.json @@ -0,0 +1,50 @@ +{ + "parent": "werewolves:dont_touch_that", + "criteria": { + "action": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "minecraft:hoglin" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.little_pigs.desc" + }, + "icon": { + "count": 1, + "id": "minecraft:porkchop" + }, + "title": { + "translate": "advancements.werewolves.little_pigs" + } + }, + "requirements": [ + [ + "action" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/little_red_riding_hood.json b/src/generated/resources/data/werewolves/advancement/little_red_riding_hood.json new file mode 100644 index 00000000..51f10d25 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/little_red_riding_hood.json @@ -0,0 +1,51 @@ +{ + "parent": "werewolves:little_pigs", + "criteria": { + "action": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "#vampirism:hunter" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.little_red_riding_hood.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "vampirism:hunter_axe_normal" + }, + "title": { + "translate": "advancements.werewolves.little_red_riding_hood" + } + }, + "requirements": [ + [ + "action" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/lord_of_the_hunt.json b/src/generated/resources/data/werewolves/advancement/lord_of_the_hunt.json new file mode 100644 index 00000000..7f744d96 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/lord_of_the_hunt.json @@ -0,0 +1,34 @@ +{ + "parent": "werewolves:unrivaled_predator", + "criteria": { + "faction": { + "conditions": { + "type": "lord", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 5 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.lord_of_the_hunt.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "werewolves:white_pelt_upgrade_smithing_template" + }, + "title": { + "translate": "advancements.werewolves.lord_of_the_hunt" + } + }, + "requirements": [ + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/natural_succession.json b/src/generated/resources/data/werewolves/advancement/natural_succession.json new file mode 100644 index 00000000..8da06a88 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/natural_succession.json @@ -0,0 +1,38 @@ +{ + "parent": "werewolves:dog_soldiers", + "criteria": { + "killed": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "werewolves:alpha_werewolf" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.natural_succession.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "werewolves:wolfsbane" + }, + "title": { + "translate": "advancements.werewolves.natural_succession" + } + }, + "requirements": [ + [ + "killed" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/silver_hand.json b/src/generated/resources/data/werewolves/advancement/silver_hand.json new file mode 100644 index 00000000..4b63b650 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/silver_hand.json @@ -0,0 +1,51 @@ +{ + "parent": "werewolves:natural_succession", + "criteria": { + "killed": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "vampirism:faction", + "faction": { + "id": "werewolves:werewolf" + } + } + } + } + ], + "killing_blow": { + "direct_entity": { + "equipment": { + "mainhand": { + "items": "#werewolves:type/silver" + } + } + } + } + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.silver_hand.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:silver_sword" + }, + "title": { + "translate": "advancements.werewolves.silver_hand" + } + }, + "requirements": [ + [ + "killed" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/standing_here_i_realize.json b/src/generated/resources/data/werewolves/advancement/standing_here_i_realize.json new file mode 100644 index 00000000..99e9d886 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/standing_here_i_realize.json @@ -0,0 +1,43 @@ +{ + "parent": "werewolves:insatiable_beast", + "criteria": { + "armor": { + "conditions": { + "action": "armor_partial" + }, + "trigger": "werewolves:werewolf_action" + }, + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.standing_here_i_realize.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "minecraft:netherite_block" + }, + "title": { + "translate": "advancements.werewolves.standing_here_i_realize" + } + }, + "requirements": [ + [ + "faction" + ], + [ + "armor" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/teen_wolf.json b/src/generated/resources/data/werewolves/advancement/teen_wolf.json new file mode 100644 index 00000000..7f9d47f6 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/teen_wolf.json @@ -0,0 +1,34 @@ +{ + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "announce_to_chat": false, + "background": "werewolves:textures/block/stripped_jacaranda_log.png", + "description": { + "translate": "advancements.werewolves.teen_wolf.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:dark_pelt_helmet" + }, + "title": { + "translate": "advancements.werewolves" + } + }, + "requirements": [ + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/thick_fur_coat.json b/src/generated/resources/data/werewolves/advancement/thick_fur_coat.json new file mode 100644 index 00000000..79b9f692 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/thick_fur_coat.json @@ -0,0 +1,56 @@ +{ + "parent": "werewolves:bite_the_evil_in_the_bud", + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 1 + }, + "trigger": "vampirism:faction" + }, + "pelt_helmet": { + "conditions": { + "items": [ + { + "items": "werewolves:white_pelt_helmet" + }, + { + "items": "werewolves:white_pelt_chestplate" + }, + { + "items": "werewolves:white_pelt_leggings" + }, + { + "items": "werewolves:white_pelt_boots" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.thick_fur_coat.desc" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "werewolves:white_pelt_chestplate" + }, + "title": { + "translate": "advancements.werewolves.thick_fur_coat" + } + }, + "requirements": [ + [ + "pelt_helmet" + ], + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/advancement/unrivaled_predator.json b/src/generated/resources/data/werewolves/advancement/unrivaled_predator.json new file mode 100644 index 00000000..5f3fc583 --- /dev/null +++ b/src/generated/resources/data/werewolves/advancement/unrivaled_predator.json @@ -0,0 +1,33 @@ +{ + "parent": "werewolves:little_red_riding_hood", + "criteria": { + "faction": { + "conditions": { + "type": "level", + "faction": { + "id": "werewolves:werewolf" + }, + "level": 14 + }, + "trigger": "vampirism:faction" + } + }, + "display": { + "description": { + "translate": "advancements.werewolves.unrivaled_predator.desc" + }, + "icon": { + "count": 1, + "id": "werewolves:cracked_bone" + }, + "title": { + "translate": "advancements.werewolves.unrivaled_predator" + } + }, + "requirements": [ + [ + "faction" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/tags/damage_type/bite.json b/src/generated/resources/data/werewolves/tags/damage_type/bite.json new file mode 100644 index 00000000..cdcb60a8 --- /dev/null +++ b/src/generated/resources/data/werewolves/tags/damage_type/bite.json @@ -0,0 +1,5 @@ +{ + "values": [ + "werewolves:bite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/tags/item/cooked_food.json b/src/generated/resources/data/werewolves/tags/item/cooked_food.json new file mode 100644 index 00000000..9281070b --- /dev/null +++ b/src/generated/resources/data/werewolves/tags/item/cooked_food.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#c:cookedmeats", + "#werewolves:cooked_fish" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/werewolves/tags/item/werewolf_food.json b/src/generated/resources/data/werewolves/tags/item/werewolf_food.json index 288114b1..db0ce4a2 100644 --- a/src/generated/resources/data/werewolves/tags/item/werewolf_food.json +++ b/src/generated/resources/data/werewolves/tags/item/werewolf_food.json @@ -1,5 +1,7 @@ { "values": [ + "#werewolves:raw_food", + "#werewolves:cooked_fish", "#minecraft:meat", "werewolves:wolf_berries", "minecraft:sweet_berries", diff --git a/src/main/java/de/teamlapen/werewolves/advancements/criterion/WerewolfActionCriterionTrigger.java b/src/main/java/de/teamlapen/werewolves/advancements/criterion/WerewolfActionCriterionTrigger.java new file mode 100644 index 00000000..e80350ba --- /dev/null +++ b/src/main/java/de/teamlapen/werewolves/advancements/criterion/WerewolfActionCriterionTrigger.java @@ -0,0 +1,62 @@ +package de.teamlapen.werewolves.advancements.criterion; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import de.teamlapen.werewolves.core.ModAdvancements; +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 net.minecraft.util.StringRepresentable; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class WerewolfActionCriterionTrigger extends SimpleCriterionTrigger { + + public void trigger(@NotNull ServerPlayer player, WerewolfActionCriterionTrigger.Action action) { + this.trigger(player, (instance) -> instance.matches(action)); + } + + @Override + public @NotNull Codec codec() { + return TriggerInstance.CODEC; + } + + public enum Action implements StringRepresentable { + HOWLING("howling"), + TRANSFORM_FULL_MOON("transform_full_moon"), + TOUCH_SILVER("touch_silver"), + VILLAGE_CONQUERED("village_conquered"), + ARMOR_PARTIAL("armor_partial"), + ; + + private final String name; + + Action(String name) { + this.name = name; + } + + @Override + public @NotNull String getSerializedName() { + return this.name; + } + } + + public record TriggerInstance(@NotNull Optional player, @NotNull Action action) implements SimpleCriterionTrigger.SimpleInstance { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player), + StringRepresentable.fromEnum(Action::values).fieldOf("action").forGetter(TriggerInstance::action) + ).apply(inst, TriggerInstance::new)); + + public static @NotNull Criterion of(@NotNull Action action) { + return ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().createCriterion(new TriggerInstance(Optional.empty(), action)); + } + + + boolean matches(Action action) { + return this.action == action; + } + } +} diff --git a/src/main/java/de/teamlapen/werewolves/core/ModAdvancements.java b/src/main/java/de/teamlapen/werewolves/core/ModAdvancements.java new file mode 100644 index 00000000..80234a54 --- /dev/null +++ b/src/main/java/de/teamlapen/werewolves/core/ModAdvancements.java @@ -0,0 +1,20 @@ +package de.teamlapen.werewolves.core; + +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; +import de.teamlapen.werewolves.util.REFERENCE; +import net.minecraft.advancements.CriterionTrigger; +import net.minecraft.core.registries.Registries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModAdvancements { + private static final DeferredRegister> TRIGGERS = DeferredRegister.create(Registries.TRIGGER_TYPE, REFERENCE.MODID); + + public static final DeferredHolder, WerewolfActionCriterionTrigger> TRIGGER_VAMPIRE_ACTION = TRIGGERS.register("werewolf_action", WerewolfActionCriterionTrigger::new); + + static void register(IEventBus bus) { + TRIGGERS.register(bus); + } + +} diff --git a/src/main/java/de/teamlapen/werewolves/core/ModTags.java b/src/main/java/de/teamlapen/werewolves/core/ModTags.java index c2e44721..35b1dd5f 100644 --- a/src/main/java/de/teamlapen/werewolves/core/ModTags.java +++ b/src/main/java/de/teamlapen/werewolves/core/ModTags.java @@ -52,6 +52,7 @@ public static class Items extends de.teamlapen.vampirism.core.ModTags.Items { public static final TagKey RAW_FISH = werewolves("raw_fish"); public static final TagKey COOKED_FISH = werewolves("cooked_fish"); public static final TagKey RAW_FOOD = werewolves("raw_food"); + public static final TagKey COOKED_FOOD = werewolves("cooked_food"); public static final TagKey WEREWOLF_FOOD = werewolves("werewolf_food"); public static final TagKey SILVER_TOOL = werewolves("tools/silver"); public static final TagKey SILVER_ARMOR = werewolves("armor/silver"); @@ -133,6 +134,7 @@ public static class Professions { public static class DamageTypes { public static final TagKey WEREWOLF_FUR_IMMUNE = tag("werewolf_fur_immune"); public static final TagKey WEREWOLF_ARMOR_REDUCTION = tag("werewolf_armor_reduction"); + public static final TagKey BITE = tag("bite"); private static @NotNull TagKey tag(@NotNull String name) { return TagKey.create(Registries.DAMAGE_TYPE, WResourceLocation.mod(name)); diff --git a/src/main/java/de/teamlapen/werewolves/core/RegistryManager.java b/src/main/java/de/teamlapen/werewolves/core/RegistryManager.java index 4e47ae06..189cfa41 100644 --- a/src/main/java/de/teamlapen/werewolves/core/RegistryManager.java +++ b/src/main/java/de/teamlapen/werewolves/core/RegistryManager.java @@ -31,6 +31,7 @@ public static void setupRegistries(IEventBus bus) { ModWorld.register(bus); ModAttachments.register(bus); ModArmorMaterials.register(bus); + ModAdvancements.register(bus); } public RegistryManager(IEventBus modEventBus) { diff --git a/src/main/java/de/teamlapen/werewolves/data/AdvancementProvider.java b/src/main/java/de/teamlapen/werewolves/data/AdvancementProvider.java new file mode 100644 index 00000000..e6c9b00d --- /dev/null +++ b/src/main/java/de/teamlapen/werewolves/data/AdvancementProvider.java @@ -0,0 +1,191 @@ +package de.teamlapen.werewolves.data; + +import de.teamlapen.vampirism.advancements.critereon.FactionCriterionTrigger; +import de.teamlapen.vampirism.advancements.critereon.FactionSubPredicate; +import de.teamlapen.vampirism.advancements.critereon.VampireActionCriterionTrigger; +import de.teamlapen.vampirism.core.ModAdvancements; +import de.teamlapen.vampirism.core.ModTags; +import de.teamlapen.vampirism.data.provider.TagProvider; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; +import de.teamlapen.werewolves.api.WReference; +import de.teamlapen.werewolves.api.WResourceLocation; +import de.teamlapen.werewolves.core.*; +import de.teamlapen.werewolves.util.REFERENCE; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.*; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.biome.Biome; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.internal.NeoForgeAdvancementProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.stream.Stream; + +public class AdvancementProvider extends net.neoforged.neoforge.common.data.AdvancementProvider { + + + /** + * Constructs an advancement provider using the generators to write the + * advancements to a file. + * + * @param output the target directory of the data generator + * @param registries a future of a lookup for registries and their objects + * @param existingFileHelper a helper used to find whether a file exists + */ + public AdvancementProvider(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper) { + super(output, registries, existingFileHelper, List.of(new ModAdvancementGenerator())); + } + + private static class ModAdvancementGenerator implements AdvancementGenerator { + + @Override + public void generate(HolderLookup.@NotNull Provider registries, @NotNull Consumer saver, @NotNull ExistingFileHelper existingFileHelper) { + var teen_wolf = Advancement.Builder.advancement() + .display(ModItems.DARK_PELT_HELMET.get(), Component.translatable("advancements.werewolves"), Component.translatable("advancements.werewolves.teen_wolf.desc"), WResourceLocation.mod("textures/block/stripped_jacaranda_log.png"), AdvancementType.TASK, true, false, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("teen_wolf"), existingFileHelper); + + var bad_moon_rising = Advancement.Builder.advancement() + .parent(teen_wolf) + .display(ModItems.WEREWOLF_MINION_CHARM.get(), Component.translatable("advancements.werewolves.bad_moon_rising"), Component.translatable("advancements.werewolves.bad_moon_rising.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("action", WerewolfActionCriterionTrigger.TriggerInstance.of(WerewolfActionCriterionTrigger.Action.TRANSFORM_FULL_MOON)) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("bad_moon_rising"), existingFileHelper); + + var howling_moon = Advancement.Builder.advancement() + .parent(bad_moon_rising) + .display(ModItems.WEREWOLF_MINION_UPGRADE_SPECIAL.get(), Component.translatable("advancements.werewolves.howling_moon"), Component.translatable("advancements.werewolves.howling_moon.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("action", WerewolfActionCriterionTrigger.TriggerInstance.of(WerewolfActionCriterionTrigger.Action.HOWLING)) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("howling_moon"), existingFileHelper); + + var dont_touch_that = Advancement.Builder.advancement() + .parent(howling_moon) + .display(ModItems.SILVER_INGOT.get(), Component.translatable("advancements.werewolves.dont_touch_that"), Component.translatable("advancements.werewolves.dont_touch_that.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("action", WerewolfActionCriterionTrigger.TriggerInstance.of(WerewolfActionCriterionTrigger.Action.TOUCH_SILVER)) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("dont_touch_that"), existingFileHelper); + + var little_pigs = Advancement.Builder.advancement() + .parent(dont_touch_that) + .display(Items.PORKCHOP, Component.translatable("advancements.werewolves.little_pigs"), Component.translatable("advancements.werewolves.little_pigs.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("action", KilledTrigger.TriggerInstance.playerKilledEntity(new EntityPredicate.Builder().entityType(EntityTypePredicate.of(EntityType.HOGLIN)))) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("little_pigs"), existingFileHelper); + + var little_red_riding_hood = Advancement.Builder.advancement() + .parent(little_pigs) + .display(de.teamlapen.vampirism.core.ModItems.HUNTER_AXE_NORMAL.get(), Component.translatable("advancements.werewolves.little_red_riding_hood"), Component.translatable("advancements.werewolves.little_red_riding_hood.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("action", KilledTrigger.TriggerInstance.playerKilledEntity(new EntityPredicate.Builder().entityType(EntityTypePredicate.of(ModTags.Entities.HUNTER)))) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("little_red_riding_hood"), existingFileHelper); + + var unrivaled_predator = Advancement.Builder.advancement() + .parent(little_red_riding_hood) + .display(ModItems.CRACKED_BONE.get(), Component.translatable("advancements.werewolves.unrivaled_predator"), Component.translatable("advancements.werewolves.unrivaled_predator.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, REFERENCE.HIGHEST_WEREWOLF_LEVEL)) + .save(saver, WResourceLocation.mod("unrivaled_predator"), existingFileHelper); + + var lord_of_the_hunt = Advancement.Builder.advancement() + .parent(unrivaled_predator) + .display(ModItems.WHITE_PELT_UPGRADE_SMITHING_TEMPLATE.get(), Component.translatable("advancements.werewolves.lord_of_the_hunt"), Component.translatable("advancements.werewolves.lord_of_the_hunt.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.lord(WReference.WEREWOLF_FACTION, REFERENCE.HIGHEST_WEREWOLF_LORD_LEVEL)) + .save(saver, WResourceLocation.mod("lord_of_the_hunt"), existingFileHelper); + + + var beast_of_gevauden = Advancement.Builder.advancement() + .parent(little_red_riding_hood) + .display(ModItems.PELT_HELMET.get(), Component.translatable("advancements.werewolves.beast_of_gevauden"), Component.translatable("advancements.werewolves.beast_of_gevauden.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .addCriterion("village", WerewolfActionCriterionTrigger.TriggerInstance.of(WerewolfActionCriterionTrigger.Action.VILLAGE_CONQUERED)) + .save(saver, WResourceLocation.mod("beast_of_gevauden"), existingFileHelper); + + var insatiable_beast = addAllMeats(Advancement.Builder.advancement() + .parent(beast_of_gevauden) + .display(ModItems.LIVER.get(), Component.translatable("advancements.werewolves.insatiable_beast"), Component.translatable("advancements.werewolves.insatiable_beast.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1))) + .save(saver, WResourceLocation.mod("insatiable_beast"), existingFileHelper); + + var standing_here_i_realize = Advancement.Builder.advancement() + .parent(insatiable_beast) + .display(Items.NETHERITE_BLOCK, Component.translatable("advancements.werewolves.standing_here_i_realize"), Component.translatable("advancements.werewolves.standing_here_i_realize.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .addCriterion("armor", WerewolfActionCriterionTrigger.TriggerInstance.of(WerewolfActionCriterionTrigger.Action.ARMOR_PARTIAL)) + .save(saver, WResourceLocation.mod("standing_here_i_realize"), existingFileHelper); + + var bite_the_evil_in_the_bud = Advancement.Builder.advancement() + .parent(standing_here_i_realize) + .display(de.teamlapen.vampirism.core.ModItems.MOTHER_CORE.get(), Component.translatable("advancements.werewolves.bite_the_evil_in_the_bud"), Component.translatable("advancements.werewolves.bite_the_evil_in_the_bud.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("killed", ModAdvancements.TRIGGER_MOTHER_WIN.get().createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty()))) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("bite_the_evil_in_the_bud"), existingFileHelper); + + var thick_fur_coat = Advancement.Builder.advancement() + .parent(bite_the_evil_in_the_bud) + .display(ModItems.WHITE_PELT_CHESTPLATE.get(), Component.translatable("advancements.werewolves.thick_fur_coat"), Component.translatable("advancements.werewolves.thick_fur_coat.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("pelt_helmet", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.WHITE_PELT_HELMET, ModItems.WHITE_PELT_CHESTPLATE, ModItems.WHITE_PELT_LEGGINGS, ModItems.WHITE_PELT_BOOTS)) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .save(saver, WResourceLocation.mod("thick_fur_coat"), existingFileHelper); + + var another_one_bites_the_dust = Advancement.Builder.advancement() + .parent(thick_fur_coat) + .display(ModItems.WEREWOLF_TOOTH.get(), Component.translatable("advancements.werewolves.another_one_bites_the_dust"), Component.translatable("advancements.werewolves.another_one_bites_the_dust.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("faction", FactionCriterionTrigger.TriggerInstance.level(WReference.WEREWOLF_FACTION, 1)) + .addCriterion("devour", KilledTrigger.TriggerInstance.playerKilledEntity(Optional.empty(), new DamageSourcePredicate.Builder().tag(TagPredicate.is(de.teamlapen.werewolves.core.ModTags.DamageTypes.BITE)))) + .save(saver, WResourceLocation.mod("another_one_bites_the_dust"), existingFileHelper); + + var hairy_situation = Advancement.Builder.advancement() + .parent(teen_wolf) + .display(ModItems.PELT.get(), Component.translatable("advancements.werewolves.hairy_situation"), Component.translatable("advancements.werewolves.hairy_situation.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("pelt", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.PELT)) + .addCriterion("dark_pelt", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.DARK_PELT)) + .addCriterion("white_pelt", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.WHITE_PELT)) + .requirements(AdvancementRequirements.Strategy.OR) + .save(saver, WResourceLocation.mod("hairy_situation"), existingFileHelper); + + HolderLookup.RegistryLookup biomeRegistryLookup = registries.lookupOrThrow(Registries.BIOME); + + var dog_soldiers = Advancement.Builder.advancement() + .parent(hairy_situation) + .display(ModBlocks.MAGIC_SAPLING.get(), Component.translatable("advancements.werewolves.dog_soldiers"), Component.translatable("advancements.werewolves.dog_soldiers.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("forest", PlayerTrigger.TriggerInstance.located(LocationPredicate.Builder.inBiome(biomeRegistryLookup.getOrThrow(ModBiomes.WEREWOLF_FOREST)))) + .save(saver, WResourceLocation.mod("dog_soldiers"), existingFileHelper); + + var natural_succession = Advancement.Builder.advancement() + .parent(dog_soldiers) + .display(ModBlocks.WOLFSBANE.get(), Component.translatable("advancements.werewolves.natural_succession"), Component.translatable("advancements.werewolves.natural_succession.desc"), null, AdvancementType.CHALLENGE, true, true, false) + .addCriterion("killed", KilledTrigger.TriggerInstance.playerKilledEntity(new EntityPredicate.Builder().entityType(EntityTypePredicate.of(ModEntities.ALPHA_WEREWOLF.get())))) + .save(saver, WResourceLocation.mod("natural_succession"), existingFileHelper); + + var silver_hand = Advancement.Builder.advancement() + .parent(natural_succession) + .display(ModItems.SILVER_SWORD.get(), Component.translatable("advancements.werewolves.silver_hand"), Component.translatable("advancements.werewolves.silver_hand.desc"), null, AdvancementType.TASK, true, true, false) + .addCriterion("killed", KilledTrigger.TriggerInstance.playerKilledEntity(new EntityPredicate.Builder().subPredicate(FactionSubPredicate.faction(WReference.WEREWOLF_FACTION)), new DamageSourcePredicate.Builder().direct(new EntityPredicate.Builder().equipment(new EntityEquipmentPredicate.Builder().mainhand(ItemPredicate.Builder.item().of(de.teamlapen.werewolves.core.ModTags.Items.SILVER_ITEM)))))) + .save(saver, WResourceLocation.mod("silver_hand"), existingFileHelper); + + } + + private Advancement.Builder addAllMeats(Advancement.Builder builder) { + Stream meat = Stream.of(Items.BEEF, Items.COOKED_BEEF, Items.PORKCHOP, Items.COOKED_PORKCHOP, Items.CHICKEN, Items.COOKED_CHICKEN, Items.MUTTON, Items.COOKED_MUTTON, Items.RABBIT, Items.COOKED_RABBIT, + Items.COD, Items.COOKED_COD, Items.SALMON, Items.COOKED_SALMON, Items.PUFFERFISH, Items.TROPICAL_FISH, + Items.ROTTEN_FLESH, ModItems.V.HUMAN_HEART.get(), ModItems.LIVER.get()); + meat.forEach(item -> builder.addCriterion(BuiltInRegistries.ITEM.getKey(item).toString(), ConsumeItemTrigger.TriggerInstance.usedItem(item))); + return builder; + } + } +} diff --git a/src/main/java/de/teamlapen/werewolves/data/DataGeneration.java b/src/main/java/de/teamlapen/werewolves/data/DataGeneration.java index 3658b981..5ca0aad6 100644 --- a/src/main/java/de/teamlapen/werewolves/data/DataGeneration.java +++ b/src/main/java/de/teamlapen/werewolves/data/DataGeneration.java @@ -44,6 +44,7 @@ public static void gatherData(final GatherDataEvent event) { generator.addProvider(event.includeClient(), new ItemModelGenerator(packOutput, existingFileHelper)); generator.addProvider(event.includeClient(), new BlockStateGenerator(packOutput, existingFileHelper)); generator.addProvider(event.includeServer(), new SkillTreeProvider(packOutput, lookupProvider)); + generator.addProvider(event.includeClient(), new AdvancementProvider(packOutput, lookupProvider, existingFileHelper)); } private static CompletableFuture addVampirismRegistries(CompletableFuture lookupProvider, PackOutput packOutput) { diff --git a/src/main/java/de/teamlapen/werewolves/data/ModTagsProvider.java b/src/main/java/de/teamlapen/werewolves/data/ModTagsProvider.java index 4260c241..7da60b58 100644 --- a/src/main/java/de/teamlapen/werewolves/data/ModTagsProvider.java +++ b/src/main/java/de/teamlapen/werewolves/data/ModTagsProvider.java @@ -158,7 +158,8 @@ protected void addTags(HolderLookup.@NotNull Provider holderProvider) { this.tag(ModTags.Items.SILVER_ARMOR).add(ModItems.SILVER_CHESTPLATE.get(), ModItems.SILVER_HELMET.get(), ModItems.SILVER_LEGGINGS.get(), ModItems.SILVER_BOOTS.get()); this.tag(ModTags.Items.SILVER_ITEM).addTags(ModTags.Items.SILVER_INGOT, ModTags.Items.SILVER_TOOL, ModTags.Items.SILVER_NUGGET, ModTags.Items.RAW_MATERIALS_SILVER, ModTags.Items.STORAGE_BLOCKS_RAW_SILVER, ModTags.Items.STORAGE_BLOCKS_SILVER, ModTags.Items.SILVER_ARMOR); this.tag(ModTags.Items.RAW_FOOD).addTags(ModTags.Items.RAW_MEAT, ModTags.Items.RAW_FISH); - this.tag(ModTags.Items.WEREWOLF_FOOD).addTag(ItemTags.MEAT).add(ModItems.WOLF_BERRIES.get(), Items.SWEET_BERRIES, Items.GLOW_BERRIES); + this.tag(ModTags.Items.COOKED_FOOD).addTags(ModTags.Items.COOKED_MEAT, ModTags.Items.COOKED_FISH); + this.tag(ModTags.Items.WEREWOLF_FOOD).addTags(ModTags.Items.RAW_FOOD, ModTags.Items.COOKED_FISH).addTag(ItemTags.MEAT).add(ModItems.WOLF_BERRIES.get(), Items.SWEET_BERRIES, Items.GLOW_BERRIES); this.tag(ItemTags.SWORDS).add(ModItems.SILVER_SWORD.get()); this.tag(ItemTags.AXES).add(ModItems.SILVER_AXE.get()); this.tag(ItemTags.PICKAXES).add(ModItems.SILVER_PICKAXE.get()); @@ -251,6 +252,7 @@ protected void addTags(HolderLookup.@NotNull Provider pProvider) { this.tag(DamageTypeTags.WITCH_RESISTANT_TO).add(ModDamageTypes.BLOOD_LOSS); this.tag(DamageTypeTags.BYPASSES_ARMOR).add(ModDamageTypes.BLOOD_LOSS); this.tag(ModTags.DamageTypes.WEREWOLF_ARMOR_REDUCTION).addTag(DamageTypeTags.IS_PLAYER_ATTACK).add(ModDamageTypes.BITE); + this.tag(ModTags.DamageTypes.BITE).add(ModDamageTypes.BITE); } } diff --git a/src/main/java/de/teamlapen/werewolves/entities/player/ModPlayerEventHandler.java b/src/main/java/de/teamlapen/werewolves/entities/player/ModPlayerEventHandler.java index 40c2b7db..9e67e0fd 100644 --- a/src/main/java/de/teamlapen/werewolves/entities/player/ModPlayerEventHandler.java +++ b/src/main/java/de/teamlapen/werewolves/entities/player/ModPlayerEventHandler.java @@ -5,6 +5,7 @@ import de.teamlapen.vampirism.entity.factions.FactionPlayerHandler; import de.teamlapen.vampirism.entity.player.actions.ActionHandler; import de.teamlapen.vampirism.items.VampirismItemBloodFoodItem; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; import de.teamlapen.werewolves.api.WReference; import de.teamlapen.werewolves.api.entities.player.IWerewolfPlayer; import de.teamlapen.werewolves.api.entities.werewolf.WerewolfForm; @@ -18,6 +19,7 @@ import de.teamlapen.werewolves.mixin.LivingEntityAccessor; import de.teamlapen.werewolves.util.Helper; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageTypes; @@ -26,6 +28,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.Equipable; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; @@ -95,6 +98,9 @@ public void onEquipmentChange(LivingEquipmentChangeEvent event) { if (event.getSlot() == EquipmentSlot.MAINHAND && event.getEntity() instanceof Player player) { WerewolfPlayer.get(player).checkToolDamage(event.getFrom(), event.getTo(), false); } + if (event.getEntity() instanceof ServerPlayer serverPlayer && WerewolfPlayer.get(serverPlayer) instanceof WerewolfPlayer werewolfPlayer && werewolfPlayer.getForm() == WerewolfForm.HUMAN && event.getTo().getItem() instanceof ArmorItem) { + ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().trigger(serverPlayer, WerewolfActionCriterionTrigger.Action.ARMOR_PARTIAL); + } } @SubscribeEvent @@ -262,11 +268,17 @@ public void isCorrectToolForDrop(PlayerEvent.HarvestCheck event) { @SubscribeEvent public void tickTool(PlayerTickEvent.Post event) { if (Helper.isWerewolf(event.getEntity())) { + boolean applies = false; if ((Helper.isSilverItem(event.getEntity().getMainHandItem())) || Helper.isSilverItem(event.getEntity().getOffhandItem()) && event.getEntity().level().getGameTime() % 10 == 0) { event.getEntity().addEffect(SilverEffect.createSilverEffect(event.getEntity(), 20, 1, true)); + applies = true; } if (StreamSupport.stream(event.getEntity().getArmorSlots().spliterator(), false).anyMatch(Helper::isSilverItem)) { event.getEntity().addEffect(SilverEffect.createSilverEffect(event.getEntity(), 20, 1, true)); + applies = true; + } + if (applies && event.getEntity() instanceof ServerPlayer serverPlayer) { + ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().trigger(serverPlayer, WerewolfActionCriterionTrigger.Action.TOUCH_SILVER); } } } diff --git a/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/HowlingAction.java b/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/HowlingAction.java index 35e8db14..fd5d19c8 100644 --- a/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/HowlingAction.java +++ b/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/HowlingAction.java @@ -1,6 +1,7 @@ package de.teamlapen.werewolves.entities.player.werewolf.actions; import de.teamlapen.lib.lib.util.UtilLib; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; import de.teamlapen.werewolves.api.entities.player.IWerewolfPlayer; import de.teamlapen.werewolves.api.entities.player.action.IActionCooldownMenu; import de.teamlapen.werewolves.config.WerewolvesConfig; @@ -9,6 +10,7 @@ import de.teamlapen.werewolves.util.Helper; import de.teamlapen.werewolves.util.WUtils; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; @@ -39,6 +41,10 @@ protected boolean activate(IWerewolfPlayer werewolfPlayer, ActivationContext con applyHowling(werewolfPlayer); spawnWolves(werewolfPlayer); + if (werewolfPlayer.asEntity() instanceof ServerPlayer serverPlayer) { + ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().trigger(serverPlayer, WerewolfActionCriterionTrigger.Action.HOWLING); + } + return true; } diff --git a/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/WerewolfFormAction.java b/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/WerewolfFormAction.java index 836625c7..5203570c 100644 --- a/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/WerewolfFormAction.java +++ b/src/main/java/de/teamlapen/werewolves/entities/player/werewolf/actions/WerewolfFormAction.java @@ -4,13 +4,11 @@ import de.teamlapen.vampirism.api.entity.player.actions.ILastingAction; import de.teamlapen.vampirism.api.entity.player.skills.ISkill; import de.teamlapen.vampirism.entity.player.actions.ActionHandler; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; import de.teamlapen.werewolves.api.entities.player.IWerewolfPlayer; import de.teamlapen.werewolves.api.entities.werewolf.WerewolfForm; import de.teamlapen.werewolves.config.WerewolvesConfig; -import de.teamlapen.werewolves.core.ModActions; -import de.teamlapen.werewolves.core.ModBiomes; -import de.teamlapen.werewolves.core.ModRefinements; -import de.teamlapen.werewolves.core.ModSkills; +import de.teamlapen.werewolves.core.*; import de.teamlapen.werewolves.entities.player.werewolf.WerewolfPlayer; import de.teamlapen.werewolves.util.FormHelper; import de.teamlapen.werewolves.util.Helper; @@ -125,6 +123,10 @@ protected boolean activate(IWerewolfPlayer werewolf, ActivationContext context) this.checkDayNightModifier(werewolf); player.setHealth(player.getMaxHealth() * healthPerc); player.refreshDisplayName(); + + if (player instanceof ServerPlayer serverPlayer && getForm() != WerewolfForm.NONE && getForm() != WerewolfForm.HUMAN && Helper.isFullMoon(serverPlayer.level())) { + ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().trigger(serverPlayer, WerewolfActionCriterionTrigger.Action.TRANSFORM_FULL_MOON); + } return true; } diff --git a/src/main/java/de/teamlapen/werewolves/items/SilverArmorItem.java b/src/main/java/de/teamlapen/werewolves/items/SilverArmorItem.java index 25aab30b..c1cffb0d 100644 --- a/src/main/java/de/teamlapen/werewolves/items/SilverArmorItem.java +++ b/src/main/java/de/teamlapen/werewolves/items/SilverArmorItem.java @@ -1,9 +1,12 @@ package de.teamlapen.werewolves.items; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; import de.teamlapen.werewolves.api.items.ISilverItem; +import de.teamlapen.werewolves.core.ModAdvancements; import de.teamlapen.werewolves.core.ModArmorMaterials; import de.teamlapen.werewolves.effects.SilverEffect; import de.teamlapen.werewolves.util.Helper; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ArmorItem; diff --git a/src/main/java/de/teamlapen/werewolves/items/WolfPeltArmorItem.java b/src/main/java/de/teamlapen/werewolves/items/WolfPeltArmorItem.java index d9356fc2..45ef6f14 100644 --- a/src/main/java/de/teamlapen/werewolves/items/WolfPeltArmorItem.java +++ b/src/main/java/de/teamlapen/werewolves/items/WolfPeltArmorItem.java @@ -39,7 +39,11 @@ public class WolfPeltArmorItem extends ArmorItem implements IFactionExclusiveIte private final @NotNull TIER tier; public WolfPeltArmorItem(Holder material, Type pType, TIER tier) { - super(material, pType, new Properties()); + super(material, pType, new Properties().durability(pType.getDurability(switch (tier) { + case NORMAL -> 15; + case ENHANCED -> 20; + case ULTIMATE -> 25; + }))); this.tier = tier; } diff --git a/src/main/java/de/teamlapen/werewolves/util/Helper.java b/src/main/java/de/teamlapen/werewolves/util/Helper.java index a405ee32..cde81008 100644 --- a/src/main/java/de/teamlapen/werewolves/util/Helper.java +++ b/src/main/java/de/teamlapen/werewolves/util/Helper.java @@ -87,7 +87,7 @@ public static boolean canWerewolfPlayerEatItem(Player player, ItemStack stack) { } public static boolean isMeat(@Nullable LivingEntity entity, ItemStack stack) { - return stack.getFoodProperties(entity) != null && (stack.is(ItemTags.MEAT) || stack.is(ModTags.Items.WEREWOLF_FOOD) || WerewolvesConfig.SERVER.isCustomMeatItems(stack.getItem())); + return stack.getFoodProperties(entity) != null && (stack.is(ModTags.Items.WEREWOLF_FOOD) || WerewolvesConfig.SERVER.isCustomMeatItems(stack.getItem())); } @Deprecated @@ -109,7 +109,7 @@ public static boolean isRawMeat(ItemStack stack) { * Otherwise use {@link #isRawMeat(net.minecraft.world.entity.LivingEntity, net.minecraft.world.item.ItemStack)} */ public static boolean isRawMeatSkipMeat(ItemStack stack) { - return stack.is(ModTags.Items.RAW_MEAT); + return stack.is(ModTags.Items.RAW_FOOD); } public static boolean canEat(LivingEntity entity, ItemStack stack) { diff --git a/src/main/java/de/teamlapen/werewolves/world/ModWorldEventHandler.java b/src/main/java/de/teamlapen/werewolves/world/ModWorldEventHandler.java index 301972fc..49cb4e76 100644 --- a/src/main/java/de/teamlapen/werewolves/world/ModWorldEventHandler.java +++ b/src/main/java/de/teamlapen/werewolves/world/ModWorldEventHandler.java @@ -3,14 +3,19 @@ import de.teamlapen.vampirism.api.entity.CaptureEntityEntry; import de.teamlapen.vampirism.api.entity.factions.IFaction; import de.teamlapen.vampirism.api.event.VampirismVillageEvent; +import de.teamlapen.werewolves.advancements.criterion.WerewolfActionCriterionTrigger; import de.teamlapen.werewolves.api.WReference; import de.teamlapen.werewolves.api.entities.werewolf.IVillagerTransformable; import de.teamlapen.werewolves.api.entities.werewolf.TransformType; import de.teamlapen.werewolves.api.entities.werewolf.WerewolfTransformable; +import de.teamlapen.werewolves.core.ModAdvancements; +import de.teamlapen.werewolves.util.Helper; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.util.random.WeightedRandom; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.bus.api.SubscribeEvent; @@ -44,6 +49,18 @@ public void onVillageCaptureFinish(VampirismVillageEvent.VillagerCaptureFinish.P } } + @SubscribeEvent + public void onVillageCaptureFinish(VampirismVillageEvent.VillagerCaptureFinish.Post event) { + if (event.getCapturingFaction() == WReference.WEREWOLF_FACTION) { + var entities = event.getWorld().getEntitiesOfClass(ServerPlayer.class, event.getVillageArea()); + for (ServerPlayer entity : entities) { + if (Helper.isWerewolf(entity)) { + ModAdvancements.TRIGGER_VAMPIRE_ACTION.get().trigger(entity, WerewolfActionCriterionTrigger.Action.VILLAGE_CONQUERED); + } + } + } + } + @SubscribeEvent public void onVillageSpawnNewVillager(VampirismVillageEvent.SpawnNewVillager event) { if (event.getControllingFaction() == WReference.WEREWOLF_FACTION) { diff --git a/src/main/resources/assets/werewolves/lang/en_us.json b/src/main/resources/assets/werewolves/lang/en_us.json index aaaf7e67..dfa26a5e 100644 --- a/src/main/resources/assets/werewolves/lang/en_us.json +++ b/src/main/resources/assets/werewolves/lang/en_us.json @@ -411,5 +411,44 @@ "death.attack.werewolves.blood_loss.player": "%1$s bled to death after being bitten by %2$s", "__comment": "command", "command.werewolves.argument.form.notfound": "%s not found", - "command.werewolves.argument.form.not_supported": "%s is not allowed here" + "command.werewolves.argument.form.not_supported": "%s is not allowed here", + "__comment": "advancements", + "advancements.werewolves": "Werewolves", + "advancements.werewolves.desc": "Getting started with Werewolves", + "advancements.werewolves.bad_moon_rising": "Bad Moon Rising", + "advancements.werewolves.bad_moon_rising.desc": "Experience your first werewolf transformation during a full moon", + "advancements.werewolves.howling_moon": "Howling Moon", + "advancements.werewolves.howling_moon.desc": "A man-wolf like creature howling to the moon.. It's almost as if you have done this in the past.", + "advancements.werewolves.dont_touch_that": "Don't touch that", + "advancements.werewolves.dont_touch_that.desc": "Get in contact with any silver item", + "advancements.werewolves.dog_soldiers": "Dog Soldiers", + "advancements.werewolves.dog_soldiers.desc": "Enter a werewolf forest", + "advancements.werewolves.insatiable_beast": "Insatiable Beast", + "advancements.werewolves.insatiable_beast.desc": "Eat all of the types of meat", + "advancements.werewolves.beast_of_gevauden": "The Beast of Gevaudan", + "advancements.werewolves.beast_of_gevauden.desc": "Successfully terrorize and conquer a local village as a werewolf", + "advancements.werewolves.standing_here_i_realize": "Standing here I realize", + "advancements.werewolves.standing_here_i_realize.desc": "Wearing armor on partial turn brings some bad flashbacks, doesn't it?", + "advancements.werewolves.hairy_situation": "Hairy Situation", + "advancements.werewolves.hairy_situation.desc": "Obtain a werewolf pelt", + "advancements.werewolves.silver_hand": "Silver Hand", + "advancements.werewolves.silver_hand.desc": "Bring death to a werewolf using their biggest weakness", + "advancements.werewolves.natural_succession": "Natural Succession", + "advancements.werewolves.natural_succession.desc": "Slay the alpha of a werewolf pack", + "advancements.werewolves.teen_wolf": "Teen Wolf", + "advancements.werewolves.teen_wolf.desc": "Get turned into a werewolf", + "advancements.werewolves.thick_fur_coat": "Thick Fur Coat", + "advancements.werewolves.thick_fur_coat.desc": "Make yourself a full armor of white pelt", + "advancements.werewolves.bite_the_evil_in_the_bud": "Bite The Evil In The Bud", + "advancements.werewolves.bite_the_evil_in_the_bud.desc": "Destroy the ancient mother vampire power right in the roots.", + "advancements.werewolves.lord_of_the_hunt": "Lord of the Hunt", + "advancements.werewolves.lord_of_the_hunt.desc": "Reach the highest Werewolf Lord level", + "advancements.werewolves.unrivaled_predator": "Unrivaled Predator", + "advancements.werewolves.unrivaled_predator.desc": "Reach the highest Werewolf level", + "advancements.werewolves.little_pigs": "Little Pigs", + "advancements.werewolves.little_pigs.desc": "Where is your brick house now?", + "advancements.werewolves.little_red_riding_hood": "Little Red Riding Hood", + "advancements.werewolves.little_red_riding_hood.desc": "Not quite the fairy tale ending, huh?", + "advancements.werewolves.another_one_bites_the_dust": "Another One Bites The Dust", + "advancements.werewolves.another_one_bites_the_dust.desc": "Devour a creature" }