From 7d48d9b21b028b3efb13eba25cd8306cd30907a1 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 8 Mar 2025 13:43:13 +0900 Subject: [PATCH 001/101] Initial Commit --- gm4_reeling_rods/README.md | 13 ++ gm4_reeling_rods/beet.yaml | 38 +++++ .../gm4_reeling_rods/enchantment/reeling.json | 22 +++ .../empty_container_entity.mcfunction | 36 +++++ .../function/fishing/allay/action.mcfunction | 8 + .../fishing/end_crystal/action.mcfunction | 6 + .../fishing/glow_item_frame/action.mcfunction | 10 ++ .../fishing/item_frame/action.mcfunction | 10 ++ .../fishing/leash_knot/action.mcfunction | 13 ++ .../leash_knot/change_leader.mcfunction | 7 + .../leash_knot/leaded_by_knot.mcfunction | 6 + .../function/fishing/owns_bobber.mcfunction | 6 + .../fishing/painting/action.mcfunction | 8 + .../function/get_lookup.mcfunction | 5 + .../function/get_motion_to_player.mcfunction | 44 +++++ .../gm4_reeling_rods/function/init.mcfunction | 12 ++ .../function/separate.mcfunction | 13 ++ .../function/store_player_pos.mcfunction | 9 ++ .../function/summon_entity.mcfunction | 5 + .../function/summon_item.mcfunction | 4 + .../tags/entity_type/leashable.json | 50 ++++++ .../tags/enchantment/non_treasure.json | 5 + gm4_reeling_rods/generate_files.py | 151 ++++++++++++++++++ 23 files changed, 481 insertions(+) create mode 100644 gm4_reeling_rods/README.md create mode 100644 gm4_reeling_rods/beet.yaml create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json create mode 100644 gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json create mode 100644 gm4_reeling_rods/generate_files.py diff --git a/gm4_reeling_rods/README.md b/gm4_reeling_rods/README.md new file mode 100644 index 0000000000..cd7081bc0d --- /dev/null +++ b/gm4_reeling_rods/README.md @@ -0,0 +1,13 @@ +# Reeling Rods + +Reel in more than just fish with these rods! Yoink the chest from the chest boat and more! + +### Features +Fishing Rods can now yoink many more things! +- Pull Paintings off walls +- Reel in items from Item Frames +- Snatch leashed mobs from leash knots +- Try and fail to pull in an end crystal +Adds a new enchantment for fishing rods to take your yoinking up a notch! With it you can +- Separate chest boats and all minecart variants +- Steal items from allays diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml new file mode 100644 index 0000000000..eda3748229 --- /dev/null +++ b/gm4_reeling_rods/beet.yaml @@ -0,0 +1,38 @@ +id: gm4_reeling_rods +name: Reeling Rods +version: 1.0.X + +data_pack: + load: . + overlays: + - formats: + min_inclusive: 61 + max_inclusive: 61 + directory: since_61 + +pipeline: + - generate_files + - gm4.plugins.extend.module + +meta: + gm4: + versioning: + schedule_loops: [] + website: + description: Reel in more than just fish with these rods! Yoink the chest from the chest boat and more! + recommended: + - gm4_end_fishing + notes: [] + #modrinth: + #project_id: + #smithed: + #pack_id: + #planetminecraft: + #uid: + video: null + wiki: https://wiki.gm4.co/wiki/Reeling_Rods + credits: + Creator: + - runcows + #Icon Design: + #- runcows diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json new file mode 100644 index 0000000000..d5ab45c12a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json @@ -0,0 +1,22 @@ +{ + "description":{ + "text": "Reeling" + }, + "supported_items": "minecraft:fishing_rod", + "primary_items": "minecraft:fishing_rod", + "weight": 3, + "max_level": 1, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 55, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "any" + ], + "effects": {} +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction new file mode 100644 index 0000000000..e4481ae697 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction @@ -0,0 +1,36 @@ +# Loops through Items[] and creates an item entity for each item, setting a slightly random motion +# @s = entity with an Items[] tag +# at @s +# run from separate + +# Assumptions + # storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player + # in storage gm4_reeling_rods:temp entity_data is an Items[] array of item data objects + +# pull item data to be processed +data modify storage gm4_reeling_rods:temp item_data.Item set from storage gm4_reeling_rods:temp entity_data.Items[0] + +# randomize motion slightly.... + # this is the complicated bit +execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[0] 100 +execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[1] 100 +execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[2] 100 +execute store result score $randomX gm4_reeling_rods.math run random value -10..10 +execute store result score $randomY gm4_reeling_rods.math run random value 0..10 +execute store result score $randomZ gm4_reeling_rods.math run random value -10..10 +execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.006 run \ + scoreboard players operation $motionX gm4_reeling_rods.math += $randomX gm4_reeling_rods.math +execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.006 run \ + scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math +execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.006 run \ + scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math +# scale 0.01 for same magnitude as main item + +# summon item with data +function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp + +# remove processed item +data remove storage gm4_reeling_rods:temp entity_data.Items[0] + +# run again if needed +execute if data storage gm4_reeling_rods:temp entity_data.Items[] run function gm4_reeling_rods:empty_container_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction new file mode 100644 index 0000000000..3ad4f4422a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction @@ -0,0 +1,8 @@ +# Action for reeled allay +# @s = allay +# at @s +# run from gm4_reeling_rods:fishing/allay/adv + +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +data remove entity @s HandItems[0] +execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction new file mode 100644 index 0000000000..36fa31748e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction @@ -0,0 +1,6 @@ +# Action for reeled end crystal +# @s = end_crystal +# at @s +# run from gm4_reeling_rods:fishing/end_crystal/adv + +damage @s 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction new file mode 100644 index 0000000000..62fa7d6ba5 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction @@ -0,0 +1,10 @@ +# Action for reeled glow item frame +# @s = glow item frame +# at @s +# run from gm4_reeling_rods:fishing/glow_item_frame/adv + +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:glow_item_frame",count:1} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item +execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute unless data entity @s Item run return run kill @s +data remove entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction new file mode 100644 index 0000000000..65e1b5e8ce --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction @@ -0,0 +1,10 @@ +# Action for reeled item frame +# @s = item frame +# at @s +# run from gm4_reeling_rods:fishing/item_frame/adv + +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:item_frame",count:1} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item +execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute unless data entity @s Item run return run kill @s +data remove entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction new file mode 100644 index 0000000000..f9e8e13369 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction @@ -0,0 +1,13 @@ +# Action for reeled leash knot +# @s = leash knot +# at @s +# run from gm4_reeling_rods:fishing/leash_knot/adv + +tag @s add gm4_reeling_rods.leash_knot + +execute as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ + if function gm4_reeling_rods:fishing/leash_knot/leaded_by_knot \ + run function gm4_reeling_rods:fishing/leash_knot/change_leader + + +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction new file mode 100644 index 0000000000..254d0ffcdb --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction @@ -0,0 +1,7 @@ +# Changes a leashed entities leader from a leash knot to a tagged player +# @s = entity leaded to leash knot +# at leash knot +# run from fishing/leash_knot/action + +data remove entity @s leash +data modify entity @s leash.UUID set from entity @e[type=player,tag=gm4_reeling_rods.player,distance=..45,limit=1] UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction new file mode 100644 index 0000000000..efbe8444c5 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction @@ -0,0 +1,6 @@ +# Checks if an entity is leashed by the knot in question +# @s = a leashable entity +# at owner +# run from fishing/leash_knot/action + +return run execute on leasher if entity @s[tag=gm4_reeling_rods.leash_knot] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction new file mode 100644 index 0000000000..9e97065849 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction @@ -0,0 +1,6 @@ +# Checks if a fishing bobber belongs to the targeted owner +# @s = a fishing bobber +# at owner +# run from fishing/{entity}/adv + +return run execute on origin if entity @s[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction new file mode 100644 index 0000000000..266b7dbfc6 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction @@ -0,0 +1,8 @@ +# Action for reeled painting +# @s = painting +# at @s +# run from gm4_reeling_rods:fishing/painting/adv + +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} +execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction new file mode 100644 index 0000000000..274d5f13b9 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction @@ -0,0 +1,5 @@ +# Adds a value from the lookup table to Y motion +# with (lookup_key) +# run from get_motion_to_player + +$scoreboard players operation $motionY gm4_reeling_rods.math += $$(lookup_key) gm4_reeling_rods.lookup diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction new file mode 100644 index 0000000000..833856cc8f --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -0,0 +1,44 @@ +# Gets motion vector to launch item to player +# run from separate + + +data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] + +# Store item pos +data modify storage gm4_reeling_rods:temp item_data.Pos set from entity @s Pos +execute store result score $itemX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[0] 1 +execute store result score $itemY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[1] 1 +execute store result score $itemZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[2] 1 + +# Player postion is stored in $motionX... ect from store_player_pos.mcfunction + +# Get delta from item to player +scoreboard players operation $motionX gm4_reeling_rods.math -= $itemX gm4_reeling_rods.math +scoreboard players operation $motionY gm4_reeling_rods.math -= $itemY gm4_reeling_rods.math +scoreboard players operation $motionZ gm4_reeling_rods.math -= $itemZ gm4_reeling_rods.math + + +# store Motion, y to be edited after +execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.1 run scoreboard players get $motionX gm4_reeling_rods.math +execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.1 run scoreboard players get $motionY gm4_reeling_rods.math +execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.1 run scoreboard players get $motionZ gm4_reeling_rods.math + +# Square +scoreboard players operation $motionX gm4_reeling_rods.math *= $motionX gm4_reeling_rods.math +scoreboard players operation $motionY gm4_reeling_rods.math *= $motionY gm4_reeling_rods.math +scoreboard players operation $motionZ gm4_reeling_rods.math *= $motionZ gm4_reeling_rods.math + +# Add the squares +scoreboard players operation $lookup_key gm4_reeling_rods.math = $motionX gm4_reeling_rods.math +scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionY gm4_reeling_rods.math +execute store result storage gm4_reeling_rods:temp lookup_key int 1 \ + run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math + +# store motion Y, scaled up +execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100 + +# Add looked up value +function gm4_reeling_rods:get_lookup with storage gm4_reeling_rods:temp + +# Store the Completed YMotion +execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.01 run scoreboard players get $motionY gm4_reeling_rods.math diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction new file mode 100644 index 0000000000..36500c6f3a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -0,0 +1,12 @@ +execute unless score reeling_rods gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Reeling Rods"} +execute unless score reeling_rods gm4_earliest_version < reeling_rods gm4_modules run scoreboard players operation reeling_rods gm4_earliest_version = reeling_rods gm4_modules +scoreboard players set reeling_rods gm4_modules 1 + + +scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" +scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" + +# set_lookup_table generated in generate_files.py +function gm4_reeling_rods:set_lookup_table + +# no main function diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction new file mode 100644 index 0000000000..801cf2ad0d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction @@ -0,0 +1,13 @@ +# Separates an entity that needs it +# @s = entity to be separated +# at @s +# run from fishing/{entity}/action + +function gm4_reeling_rods:get_motion_to_player +function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp + +# return if no items +execute unless data entity @s Items[] run return 0 + +data modify storage gm4_reeling_rods:temp motion_vector set from storage gm4_reeling_rods:temp entity_data.Motion +function gm4_reeling_rods:empty_container_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction new file mode 100644 index 0000000000..cdbac992cb --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction @@ -0,0 +1,9 @@ +# stores players postion +# @s = Player +# at @s +# run from fishing/{entity}/adv + +data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos +execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 +execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 +execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction new file mode 100644 index 0000000000..d53b8adb37 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction @@ -0,0 +1,5 @@ +# Summons a generic entity with data +# with {entity_data} +# run from fishing/{entity}/action + +$summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction new file mode 100644 index 0000000000..cf8001d5b6 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction @@ -0,0 +1,4 @@ +# Summons item with data +# run from separate and empty_container_entity + +$summon minecraft:item ~ ~ ~ $(item_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json new file mode 100644 index 0000000000..ae13a5bfeb --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -0,0 +1,50 @@ +{ + "values": [ + "#minecraft:boat", + "minecraft:acacia_chest_boat", + "minecraft:oak_chest_boat", + "minecraft:cherry_chest_boat", + "minecraft:birch_chest_boat", + "minecraft:bamboo_chest_raft", + "minecraft:jungle_chest_boat", + "minecraft:spruce_chest_boat", + "minecraft:dark_oak_chest_boat", + "minecraft:mangrove_chest_boat", + "minecraft:mangrove_chest_boat", + "minecraft:skeleton_horse", + "minecraft:zombie_horse", + "minecraft:horse", + "minecraft:allay", + "minecraft:armadillo", + "minecraft:axolotl", + "minecraft:bee", + "minecraft:camel", + "minecraft:cat", + "minecraft:chicken", + "minecraft:cow", + "minecraft:dolphin", + "minecraft:donkey", + "minecraft:fox", + "minecraft:frog", + "minecraft:glow_squid", + "minecraft:goat", + "minecraft:hoglin", + "minecraft:iron_golem", + "minecraft:llama", + "minecraft:mooshroom", + "minecraft:mule", + "minecraft:ocelot", + "minecraft:parrot", + "minecraft:pig", + "minecraft:polar_bear", + "minecraft:rabbit", + "minecraft:sheep", + "minecraft:sniffer", + "minecraft:snow_golem", + "minecraft:squid", + "minecraft:strider", + "minecraft:trader_llama", + "minecraft:wolf", + "minecraft:zoglin" + ] +} diff --git a/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json b/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json new file mode 100644 index 0000000000..fdf6328f6d --- /dev/null +++ b/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gm4_reeling_rods:reeling" + ] +} diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py new file mode 100644 index 0000000000..410641d597 --- /dev/null +++ b/gm4_reeling_rods/generate_files.py @@ -0,0 +1,151 @@ +from typing import List +from beet import Context, Advancement, Function +from beet.contrib.vanilla import Vanilla +import math + +class Entity: + def __init__(self, entity_type: str, vertical_displacement: str, needs_enchantment: bool): + self.entity_type = entity_type + self.vertical_displacement = vertical_displacement + self.needs_enchantment = needs_enchantment + +def beet_default(ctx: Context): + """generates the advancements, the subsequent functions for handling reeling, and set_lookup_table.mcfunction + NOTE: Only generates action functions for minecarts and chest boats. Others will have to be defined manually""" + + vanilla = ctx.inject(Vanilla) + vanilla.minecraft_version = '1.21.4' + + def create_files(entities: List[Entity]): + for entity in entities: + since_61 = "pale_oak" in entity.entity_type + output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data + entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv"] = Function([ + f"# Initial Logic for rod reeling {entity_type_no_prefix}", + "# @s = player who fished", + "# at @s", + f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}", + f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}", + "\nfunction gm4_reeling_rods:store_player_pos", + "\ntag @s add gm4_reeling_rods.player\n", + "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", + "\tif function gm4_reeling_rods:fishing/owns_bobber \\", + f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", + f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", + "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", + f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", + "\ntag @s remove gm4_reeling_rods.player" + ]) + if entity.needs_enchantment: + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement({ + "criteria":{ + "fishing_rod_hooked":{ + "trigger": "minecraft:fishing_rod_hooked", + "conditions": { + "rod": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:reeling" + } + ] + } + }, + "entity": { + "type": entity.entity_type + } + } + } + }, + "rewards": { + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" + } + }) + else: + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement({ + "criteria":{ + "fishing_rod_hooked":{ + "trigger":"minecraft:fishing_rod_hooked", + "conditions":{ + "entity":{ + "type": entity.entity_type + } + } + } + }, + "rewards":{ + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" + } + }) + if not ("minecart" in entity.entity_type or "chest" in entity.entity_type): # Other entity types need to have actions defined manually + continue + if "minecart" in entity.entity_type: # minecart types + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", + "function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + continue + if "chest" in entity.entity_type: # chest boats / raft + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + continue + + def create_lookup_file(): + lookup_keys = [0] + for dx in range(0,34): + for dy in range(0,34): + for dz in range(0,34): + potenital_key = (dx * dx) + (dy * dy) + (dz * dz) + if (math.sqrt(potenital_key) > 33): # ignore values out of fishing bobber range + continue + if potenital_key in lookup_keys: # ignore if already found + continue + lookup_keys.append(potenital_key) + lookup_keys.sort() + strList: List[str] = [] + for key in lookup_keys: + value = math.floor(100*(0.08*math.sqrt(math.sqrt(key)))) + strList.append(f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}") + ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) + + entity_list: List[Entity] = [] + + entity_list.append(Entity("minecraft:painting","-0.4",False)) + entity_list.append(Entity("minecraft:item_frame","-0.4",False)) + entity_list.append(Entity("minecraft:glow_item_frame","-0.4",False)) + entity_list.append(Entity("minecraft:leash_knot","-0.4",False)) + entity_list.append(Entity("minecraft:allay","-0.48",True)) + entity_list.append(Entity("minecraft:chest_minecart","-0.55999",True)) + entity_list.append(Entity("minecraft:furnace_minecart","-0.55999", True)) + entity_list.append(Entity("minecraft:hopper_minecart","-0.55999", True)) + entity_list.append(Entity("minecraft:tnt_minecart","-0.55999",True)) + entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) + + item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags + for chest_boat in item_tags["minecraft:chest_boats"].data['values']: + entity_list.append(Entity(chest_boat,"-0.45",True)) + + create_files(entity_list) + create_lookup_file() + \ No newline at end of file From 0e7c7311ad5c65b5d49bc1677a8de07c55070af0 Mon Sep 17 00:00:00 2001 From: runcows Date: Sun, 9 Mar 2025 01:28:55 +0900 Subject: [PATCH 002/101] Fix Version Compat --- .../advancement/fishing/chest_boat.json | 25 ++++++++++ .../fishing/chest_boat/action.mcfunction | 12 +++++ .../fishing/chest_boat/adv.mcfunction | 19 +++++++ .../tags/entity_type/leashable.json | 41 +++++++++++++++ gm4_reeling_rods/beet.yaml | 8 +++ .../tags/entity_type/leashable.json | 1 - gm4_reeling_rods/generate_files.py | 7 +-- .../tags/entity_type/leashable.json | 50 +++++++++++++++++++ 8 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json create mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction create mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction create mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json create mode 100644 gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json new file mode 100644 index 0000000000..e5fb7a17f8 --- /dev/null +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json @@ -0,0 +1,25 @@ +{ + "criteria": { + "fishing_rod_hooked": { + "trigger": "minecraft:fishing_rod_hooked", + "conditions": { + "rod": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:reeling" + } + ] + } + }, + "entity": { + "type": "minecraft:chest_boat" + } + } + } + }, + "rewards": { + "function": "gm4_reeling_rods:fishing/chest_boat/adv" + } + } + \ No newline at end of file diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction new file mode 100644 index 0000000000..787ca611cb --- /dev/null +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction @@ -0,0 +1,12 @@ +# Action for reeled chest_boat +# @s = chest_boat +# at @s +# run from gm4_reeling_rods:fishing/chest_boat/adv + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate +tp @s ~ -1000 ~ +data remove storage gm4_reeling_rods:temp entity_data.UUID +data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:boat" +function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction new file mode 100644 index 0000000000..2aeb6802b4 --- /dev/null +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction @@ -0,0 +1,19 @@ +# Initial Logic for rod reeling chest_boat +# @s = player who fished +# at @s +# run from advancement gm4_reeling_rods:fishing/chest_boat + +advancement revoke @s only gm4_reeling_rods:fishing/chest_boat + +function gm4_reeling_rods:store_player_pos + +tag @s add gm4_reeling_rods.player + +execute as @e[type=minecraft:fishing_bobber,distance=..33] \ + if function gm4_reeling_rods:fishing/owns_bobber \ + at @s positioned ~ ~-0.45 ~ \ + as @e[type=minecraft:chest_boat,distance=..0.00001,limit=1] \ + unless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \ + run function gm4_reeling_rods:fishing/chest_boat/action + +tag @s remove gm4_reeling_rods.player diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json new file mode 100644 index 0000000000..4a06361e37 --- /dev/null +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -0,0 +1,41 @@ +{ + "values": [ + "minecraft:boat", + "minecraft:chest_boat", + "minecraft:skeleton_horse", + "minecraft:zombie_horse", + "minecraft:horse", + "minecraft:allay", + "minecraft:armadillo", + "minecraft:axolotl", + "minecraft:bee", + "minecraft:camel", + "minecraft:cat", + "minecraft:chicken", + "minecraft:cow", + "minecraft:dolphin", + "minecraft:donkey", + "minecraft:fox", + "minecraft:frog", + "minecraft:glow_squid", + "minecraft:goat", + "minecraft:hoglin", + "minecraft:iron_golem", + "minecraft:llama", + "minecraft:mooshroom", + "minecraft:mule", + "minecraft:ocelot", + "minecraft:parrot", + "minecraft:pig", + "minecraft:polar_bear", + "minecraft:rabbit", + "minecraft:sheep", + "minecraft:sniffer", + "minecraft:snow_golem", + "minecraft:squid", + "minecraft:strider", + "minecraft:trader_llama", + "minecraft:wolf", + "minecraft:zoglin" + ] +} diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index eda3748229..5801549d49 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -9,6 +9,14 @@ data_pack: min_inclusive: 61 max_inclusive: 61 directory: since_61 + - formats: + min_inclusive: 57 + max_inclusive: 61 + directory: since_57 + - formats: + min_inclusive: 48 + max_inclusive: 48 + directory: backport_48 pipeline: - generate_files diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json index ae13a5bfeb..d4a2d4449f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -10,7 +10,6 @@ "minecraft:spruce_chest_boat", "minecraft:dark_oak_chest_boat", "minecraft:mangrove_chest_boat", - "minecraft:mangrove_chest_boat", "minecraft:skeleton_horse", "minecraft:zombie_horse", "minecraft:horse", diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 410641d597..f87f43756f 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -19,7 +19,8 @@ def beet_default(ctx: Context): def create_files(entities: List[Entity]): for entity in entities: since_61 = "pale_oak" in entity.entity_type - output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data + is_chest_boat = "chest_boat" in entity.entity_type or "chest_raft" in entity.entity_type + output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["since_57"] if is_chest_boat else ctx.data entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv"] = Function([ f"# Initial Logic for rod reeling {entity_type_no_prefix}", @@ -78,7 +79,7 @@ def create_files(entities: List[Entity]): "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" } }) - if not ("minecart" in entity.entity_type or "chest" in entity.entity_type): # Other entity types need to have actions defined manually + if not ("minecart" in entity.entity_type or is_chest_boat): # Other entity types need to have actions defined manually continue if "minecart" in entity.entity_type: # minecart types output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ @@ -95,7 +96,7 @@ def create_files(entities: List[Entity]): "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" ]) continue - if "chest" in entity.entity_type: # chest boats / raft + if is_chest_boat: # chest boats / raft specific output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ f"# Action for reeled {entity_type_no_prefix}", f"# @s = {entity_type_no_prefix}", diff --git a/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json new file mode 100644 index 0000000000..8d73a3466c --- /dev/null +++ b/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -0,0 +1,50 @@ +{ + "values": [ + "#minecraft:boat", + "minecraft:acacia_chest_boat", + "minecraft:oak_chest_boat", + "minecraft:cherry_chest_boat", + "minecraft:birch_chest_boat", + "minecraft:bamboo_chest_raft", + "minecraft:jungle_chest_boat", + "minecraft:spruce_chest_boat", + "minecraft:dark_oak_chest_boat", + "minecraft:pale_oak_chest_boat", + "minecraft:mangrove_chest_boat", + "minecraft:skeleton_horse", + "minecraft:zombie_horse", + "minecraft:horse", + "minecraft:allay", + "minecraft:armadillo", + "minecraft:axolotl", + "minecraft:bee", + "minecraft:camel", + "minecraft:cat", + "minecraft:chicken", + "minecraft:cow", + "minecraft:dolphin", + "minecraft:donkey", + "minecraft:fox", + "minecraft:frog", + "minecraft:glow_squid", + "minecraft:goat", + "minecraft:hoglin", + "minecraft:iron_golem", + "minecraft:llama", + "minecraft:mooshroom", + "minecraft:mule", + "minecraft:ocelot", + "minecraft:parrot", + "minecraft:pig", + "minecraft:polar_bear", + "minecraft:rabbit", + "minecraft:sheep", + "minecraft:sniffer", + "minecraft:snow_golem", + "minecraft:squid", + "minecraft:strider", + "minecraft:trader_llama", + "minecraft:wolf", + "minecraft:zoglin" + ] +} From aaed0f762fe15e462b077194f8173d9b20824b30 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 09:28:15 +0900 Subject: [PATCH 003/101] Add player gamemode check --- .../gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction | 2 ++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 3 insertions(+) diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction index 2aeb6802b4..0d537a6a3e 100644 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction @@ -5,6 +5,8 @@ advancement revoke @s only gm4_reeling_rods:fishing/chest_boat +execute if entity @s[gamemode=adventure] run return fail + function gm4_reeling_rods:store_player_pos tag @s add gm4_reeling_rods.player diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index f87f43756f..d74c9284e0 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -28,6 +28,7 @@ def create_files(entities: List[Entity]): "# at @s", f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}", f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}", + "\nexecute if entity @s[gamemode=adventure] run return fail", "\nfunction gm4_reeling_rods:store_player_pos", "\ntag @s add gm4_reeling_rods.player\n", "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", From 11e7606c0d77dba205eb513d515016e015e8e46a Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 09:28:36 +0900 Subject: [PATCH 004/101] Fix Allay HandItems[0] being removed instead of set empty --- .../gm4_reeling_rods/function/fishing/allay/action.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction index 3ad4f4422a..1d2c15de1b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction @@ -4,5 +4,5 @@ # run from gm4_reeling_rods:fishing/allay/adv data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] -data remove entity @s HandItems[0] +data modify entity @s HandItems[0] set value {} execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate From a4a3b57daf6519a3522a0a398be58cbc67a7a741 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 09:29:05 +0900 Subject: [PATCH 005/101] Add shulker pulling --- .../function/fishing/shulker/action.mcfunction | 6 ++++++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 7 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction new file mode 100644 index 0000000000..2d7dd0e62d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction @@ -0,0 +1,6 @@ +# Action for reeled shulker +# @s = shulker +# at @s +# run from gm4_reeling_rods:fishing/shulker/adv + +execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1 diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d74c9284e0..e8eda9f6a2 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -142,6 +142,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:furnace_minecart","-0.55999", True)) entity_list.append(Entity("minecraft:hopper_minecart","-0.55999", True)) entity_list.append(Entity("minecraft:tnt_minecart","-0.55999",True)) + entity_list.append(Entity("minecraft:shulker","-0.8",False)) entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags From ac894adf61cd57460c1a7def26c0a0eda54d3694 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 15:29:48 +0900 Subject: [PATCH 006/101] Fix minecart fishing bobber vertical displacement off by 0.00001 --- gm4_reeling_rods/generate_files.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index e8eda9f6a2..f671796fb9 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -132,16 +132,16 @@ def create_lookup_file(): ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) entity_list: List[Entity] = [] - + # Vertical displacement for mobs is -0.8 * the entities hibox height. Entities with hitboxes that arent just width and height are different entity_list.append(Entity("minecraft:painting","-0.4",False)) entity_list.append(Entity("minecraft:item_frame","-0.4",False)) entity_list.append(Entity("minecraft:glow_item_frame","-0.4",False)) entity_list.append(Entity("minecraft:leash_knot","-0.4",False)) entity_list.append(Entity("minecraft:allay","-0.48",True)) - entity_list.append(Entity("minecraft:chest_minecart","-0.55999",True)) - entity_list.append(Entity("minecraft:furnace_minecart","-0.55999", True)) - entity_list.append(Entity("minecraft:hopper_minecart","-0.55999", True)) - entity_list.append(Entity("minecraft:tnt_minecart","-0.55999",True)) + entity_list.append(Entity("minecraft:chest_minecart","-0.56",True)) + entity_list.append(Entity("minecraft:furnace_minecart","-0.56", True)) + entity_list.append(Entity("minecraft:hopper_minecart","-0.56", True)) + entity_list.append(Entity("minecraft:tnt_minecart","-0.56",True)) entity_list.append(Entity("minecraft:shulker","-0.8",False)) entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) From 5f94a20ff3fc2d9a042b1ba363fe67167dddd5ee Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 15:43:51 +0900 Subject: [PATCH 007/101] Fix Allay item summon wrong location --- .../gm4_reeling_rods/function/fishing/allay/action.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction index 1d2c15de1b..568c691135 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction @@ -5,4 +5,4 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] data modify entity @s HandItems[0] set value {} -execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate From a5c5e14847026908328892571b74add6774c7ff3 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 10 Mar 2025 15:51:23 +0900 Subject: [PATCH 008/101] Add witch potion stealing --- .../function/fishing/witch/action.mcfunction | 8 ++++++++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 9 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction new file mode 100644 index 0000000000..388b44bcd9 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction @@ -0,0 +1,8 @@ +# Action for reeled witch +# @s = witch +# at @s +# run from gm4_reeling_rods:fishing/witch/adv + +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +data modify entity @s HandItems[0] set value {} +execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index f671796fb9..86389c675e 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -143,6 +143,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:hopper_minecart","-0.56", True)) entity_list.append(Entity("minecraft:tnt_minecart","-0.56",True)) entity_list.append(Entity("minecraft:shulker","-0.8",False)) + entity_list.append(Entity("minecraft:witch","-1.56",True)) entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags From 216f9568ffc47eb01410dae7dcdc48ef05624a20 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 11 Mar 2025 07:57:29 +0900 Subject: [PATCH 009/101] Slight python change --- gm4_reeling_rods/generate_files.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 86389c675e..66aa144a1e 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -133,15 +133,9 @@ def create_lookup_file(): entity_list: List[Entity] = [] # Vertical displacement for mobs is -0.8 * the entities hibox height. Entities with hitboxes that arent just width and height are different - entity_list.append(Entity("minecraft:painting","-0.4",False)) - entity_list.append(Entity("minecraft:item_frame","-0.4",False)) - entity_list.append(Entity("minecraft:glow_item_frame","-0.4",False)) + entity_list.append(Entity("minecraft:leash_knot","-0.4",False)) entity_list.append(Entity("minecraft:allay","-0.48",True)) - entity_list.append(Entity("minecraft:chest_minecart","-0.56",True)) - entity_list.append(Entity("minecraft:furnace_minecart","-0.56", True)) - entity_list.append(Entity("minecraft:hopper_minecart","-0.56", True)) - entity_list.append(Entity("minecraft:tnt_minecart","-0.56",True)) entity_list.append(Entity("minecraft:shulker","-0.8",False)) entity_list.append(Entity("minecraft:witch","-1.56",True)) entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) @@ -149,7 +143,11 @@ def create_lookup_file(): item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: entity_list.append(Entity(chest_boat,"-0.45",True)) - + for minecart in ["minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:hopper_minecart","minecraft:tnt_minecart"]: + entity_list.append(Entity(minecart,"-0.56",True)) + for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: + entity_list.append(Entity(special_hitbox,"-0.4",False)) + create_files(entity_list) create_lookup_file() \ No newline at end of file From 0f37745b8619a84a57dc085b731a0905a16b1921 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 11 Mar 2025 14:29:24 +0900 Subject: [PATCH 010/101] Add villager theft --- .../fishing/villager/action.mcfunction | 30 +++++++++++++++++++ .../fishing/villager/add_gossip.mcfunction | 16 ++++++++++ .../fishing/villager/sell_out.mcfunction | 9 ++++++ gm4_reeling_rods/generate_files.py | 4 +-- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction new file mode 100644 index 0000000000..171d119d14 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction @@ -0,0 +1,30 @@ +# Action for reeled villager +# @s = villager +# at @s +# run from gm4_reeling_rods:fishing/villager/adv + +# fail if baby +execute store result score $misc gm4_reeling_rods.math run data get entity @s Age +execute unless score $misc gm4_reeling_rods.math matches 0.. run return fail + +# fail if not holding anything +execute unless data entity @s HandItems[0].id run return fail + +# find trade and sell it out +data modify storage gm4_reeling_rods:temp entity_data set value {} +data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s HandItems[0] +function gm4_reeling_rods:fishing/villager/sell_out with storage gm4_reeling_rods:temp entity_data + +# adds 20 "major_negative" gossip of the player to the villager +data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID +function gm4_reeling_rods:fishing/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip + +# angry particles +particle minecraft:angry_villager ~ ~1.5 ~ 0.3 0.3 0.3 20 3 +# angry sound +playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~1.5 ~ + +# pulls item +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +data modify entity @s HandItems[0] set value {} +execute positioned ~ ~1.1 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction new file mode 100644 index 0000000000..e30b69c30a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction @@ -0,0 +1,16 @@ +# adds a "major_negaive" gossip of the player to the villager +# @s = villager +# at @s +# with {Target} +# run from fishing/villager/action + +$execute store success score $success gm4_reeling_rods.math run \ + data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] + +execute unless score $success gm4_reeling_rods.math matches 1 run data modify storage gm4_reeling_rods:temp entity_data.gossip merge value {Type:"major_negative",Value:0} + +execute store result score $gossip_value gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp entity_data.gossip.Value +execute unless score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players set $gossip_value gm4_reeling_rods.math 100 +execute if score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players add $gossip_value gm4_reeling_rods.math 20 +execute store result storage gm4_reeling_rods:temp entity_data.gossip.Value int 1 run scoreboard players get $gossip_value gm4_reeling_rods.math +data modify entity @s Gossips append from storage gm4_reeling_rods:temp entity_data.gossip diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction new file mode 100644 index 0000000000..0e44e3e048 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction @@ -0,0 +1,9 @@ +# sells out a trade +# @s = villager +# at @s +# with {mainhand} +# run from fishing/villager/action + +# for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though +$data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0} +$data modify entity @s Offers.Recipes[{sell:$(mainhand)}].uses set from entity @s Offers.Recipes[{sell:$(mainhand)}].maxUses diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 66aa144a1e..85b49bd84e 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -137,7 +137,6 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:leash_knot","-0.4",False)) entity_list.append(Entity("minecraft:allay","-0.48",True)) entity_list.append(Entity("minecraft:shulker","-0.8",False)) - entity_list.append(Entity("minecraft:witch","-1.56",True)) entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags @@ -147,7 +146,8 @@ def create_lookup_file(): entity_list.append(Entity(minecart,"-0.56",True)) for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: entity_list.append(Entity(special_hitbox,"-0.4",False)) - + for villager_height in ["minecraft:witch","minecraft:villager"]: + entity_list.append(Entity(villager_height,"-1.56",True)) create_files(entity_list) create_lookup_file() \ No newline at end of file From b116175423f98e590ab96ed066a7954d731462ca Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 11 Mar 2025 19:41:24 +0900 Subject: [PATCH 011/101] Python changes to allow baby mobs to be processed --- gm4_reeling_rods/generate_files.py | 126 ++++++++++++++++++----------- 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 85b49bd84e..789c8624fc 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,13 +1,27 @@ from typing import List from beet import Context, Advancement, Function from beet.contrib.vanilla import Vanilla +from beet.core.utils import JsonDict import math +from copy import deepcopy class Entity: - def __init__(self, entity_type: str, vertical_displacement: str, needs_enchantment: bool): + def __init__(self, entity_type: str, can_be_baby: bool, vertical_displacement: str, needs_enchantment: bool): self.entity_type = entity_type self.vertical_displacement = vertical_displacement self.needs_enchantment = needs_enchantment + self.can_be_baby = can_be_baby + +# Function from: https://www.geeksforgeeks.org/recursively-merge-dictionaries-in-python/ +def recursive_merge(dict1:JsonDict, dict2:JsonDict): + for key, value in dict2.items(): + if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): + # Recursively merge nested dictionaries + dict1[key] = recursive_merge(dict1[key], value) # type: ignore + else: + # Merge non-dictionary values + dict1[key] = value + return dict1 def beet_default(ctx: Context): """generates the advancements, the subsequent functions for handling reeling, and set_lookup_table.mcfunction @@ -22,64 +36,84 @@ def create_files(entities: List[Entity]): is_chest_boat = "chest_boat" in entity.entity_type or "chest_raft" in entity.entity_type output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["since_57"] if is_chest_boat else ctx.data entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv"] = Function([ - f"# Initial Logic for rod reeling {entity_type_no_prefix}", - "# @s = player who fished", - "# at @s", - f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}", - f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}", - "\nexecute if entity @s[gamemode=adventure] run return fail", - "\nfunction gm4_reeling_rods:store_player_pos", - "\ntag @s add gm4_reeling_rods.player\n", - "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", - "\tif function gm4_reeling_rods:fishing/owns_bobber \\", - f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", - f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", - "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", - f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", - "\ntag @s remove gm4_reeling_rods.player" - ]) + # Create advancement file + advancement_json : JsonDict = { + "criteria":{ + "fishing_rod_hooked":{ + "trigger":"minecraft:fishing_rod_hooked", + "conditions":{ + "entity":{ + "type" : entity.entity_type + } + } + } + }, + "rewards":{ + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" + } + } if entity.needs_enchantment: - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement({ + recursive_merge(advancement_json,{ "criteria":{ "fishing_rod_hooked":{ - "trigger": "minecraft:fishing_rod_hooked", - "conditions": { - "rod": { - "predicates": { - "minecraft:enchantments": [ - { - "enchantments": "gm4_reeling_rods:reeling" - } + "conditions":{ + "rod":{ + "predicates":{ + "minecraft:enchantments":[ + {"enchantments":"gm4_reeling_rods:reeling"} ] } - }, - "entity": { - "type": entity.entity_type } } } - }, - "rewards": { - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" } }) - else: - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement({ + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement(advancement_json) + if entity.can_be_baby: + advancement_json_baby:JsonDict = deepcopy(advancement_json) + recursive_merge(advancement_json_baby,{ "criteria":{ "fishing_rod_hooked":{ - "trigger":"minecraft:fishing_rod_hooked", "conditions":{ "entity":{ - "type": entity.entity_type + "flags":{ + "is_baby": True + } } } } }, "rewards":{ - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv_baby" } }) + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby"] = Advancement(advancement_json_baby) + # Create adv function + adv_func : List[str] = [ + f"# Initial Logic for rod reeling {entity_type_no_prefix}", + "# @s = player who fished", + "# at @s", + f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}", + f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}", + "\nexecute if entity @s[gamemode=adventure] run return fail", + "\nfunction gm4_reeling_rods:store_player_pos", + "\ntag @s add gm4_reeling_rods.player\n", + "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", + "\tif function gm4_reeling_rods:fishing/owns_bobber \\", + f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", + f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", + "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", + f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", + "\ntag @s remove gm4_reeling_rods.player" + ] + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv"] = Function(adv_func) + if entity.can_be_baby: + adv_func_baby = deepcopy(adv_func) + adv_func_baby[0] = f"# Initial Logic for rod reeling baby {entity_type_no_prefix}" + adv_func_baby[3] = f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby" + adv_func_baby[4] = f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby" + adv_func_baby[10] = f"\tat @s positioned ~ ~{str(float(entity.vertical_displacement) / 2)} ~ \\" + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv_baby"] = Function(adv_func_baby) if not ("minecart" in entity.entity_type or is_chest_boat): # Other entity types need to have actions defined manually continue if "minecart" in entity.entity_type: # minecart types @@ -134,20 +168,20 @@ def create_lookup_file(): entity_list: List[Entity] = [] # Vertical displacement for mobs is -0.8 * the entities hibox height. Entities with hitboxes that arent just width and height are different - entity_list.append(Entity("minecraft:leash_knot","-0.4",False)) - entity_list.append(Entity("minecraft:allay","-0.48",True)) - entity_list.append(Entity("minecraft:shulker","-0.8",False)) - entity_list.append(Entity("minecraft:end_crystal","-1.6",False)) + entity_list.append(Entity("minecraft:leash_knot",False,"-0.4",False)) + entity_list.append(Entity("minecraft:allay",False,"-0.48",True)) + entity_list.append(Entity("minecraft:shulker",False,"-0.8",False)) + entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: - entity_list.append(Entity(chest_boat,"-0.45",True)) + entity_list.append(Entity(chest_boat,False,"-0.45",True)) for minecart in ["minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:hopper_minecart","minecraft:tnt_minecart"]: - entity_list.append(Entity(minecart,"-0.56",True)) + entity_list.append(Entity(minecart,False,"-0.56",True)) for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: - entity_list.append(Entity(special_hitbox,"-0.4",False)) + entity_list.append(Entity(special_hitbox,False,"-0.4",False)) for villager_height in ["minecraft:witch","minecraft:villager"]: - entity_list.append(Entity(villager_height,"-1.56",True)) + entity_list.append(Entity(villager_height,False,"-1.56",True)) create_files(entity_list) create_lookup_file() \ No newline at end of file From 7c22088aa850357fe44341f7555ecbdb1e868846 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 11 Mar 2025 20:30:31 +0900 Subject: [PATCH 012/101] Add fox theft --- .../function/fishing/fox/action.mcfunction | 9 +++++++++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 10 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction new file mode 100644 index 0000000000..bc805900d2 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction @@ -0,0 +1,9 @@ +# Action for reeled fox +# @s = fox +# at @s +# run from fishing/fox/adv and fishing/fox/adv_baby + +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +data modify entity @s HandItems[0] set value {} +function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 789c8624fc..f73844acf0 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -172,6 +172,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:allay",False,"-0.48",True)) entity_list.append(Entity("minecraft:shulker",False,"-0.8",False)) entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False)) + entity_list.append(Entity("minecraft:fox",True,"-0.56",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: From 2bffbbe1b74145c7bdffb0ba06a5ff5e7df487f9 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 12 Mar 2025 05:14:10 +0900 Subject: [PATCH 013/101] Add witch theft limit --- .../function/fishing/witch/action.mcfunction | 6 ++++++ .../function/fishing/witch/limit.mcfunction | 8 ++++++++ .../data/gm4_reeling_rods/function/init.mcfunction | 1 + 3 files changed, 15 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction index 388b44bcd9..8f604c7fe6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction @@ -3,6 +3,12 @@ # at @s # run from gm4_reeling_rods:fishing/witch/adv +# return if no item in mainhand +execute unless data entity @s HandItems[0].id run return fail + +execute if score @s gm4_reeling_rods.entities matches 2 run return run function gm4_reeling_rods:fishing/witch/limit +scoreboard players add @s gm4_reeling_rods.entities 1 + data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] data modify entity @s HandItems[0] set value {} execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction new file mode 100644 index 0000000000..57e13e8513 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction @@ -0,0 +1,8 @@ +# Sets a limit on witch so player cant steal any more +# @s = witch +# at @s +# run from gm4_reeling_rods:fishing/witch/action + +tag @s add gm4_reeling_rods.immune +particle minecraft:witch ~ ~1.2 ~ 0.5 0.7 0.5 40 25 +playsound minecraft:entity.witch.celebrate hostile @a[distance=..16] ~ ~1.5 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 36500c6f3a..33486c7cab 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -5,6 +5,7 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" +scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" # set_lookup_table generated in generate_files.py function gm4_reeling_rods:set_lookup_table From 72be04adde7eb2d19d968261bee079b6337ea0fc Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 12 Mar 2025 05:32:24 +0900 Subject: [PATCH 014/101] Add pig desaddling --- .../function/fishing/pig/action.mcfunction | 11 +++++++++++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 12 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction new file mode 100644 index 0000000000..a36a8d7ff7 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction @@ -0,0 +1,11 @@ +# Action for reeled pig +# @s = pig +# at @s +# run from fishing/pig/adv and fishing/pig/adv_baby + +# fail if no saddle +execute unless data entity @s {Saddle:1b} run return fail + +data modify entity @s Saddle set value 0b +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:saddle",count:1} +execute positioned ~ ~0.5 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index f73844acf0..4a6776f2fb 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -173,6 +173,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:shulker",False,"-0.8",False)) entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False)) entity_list.append(Entity("minecraft:fox",True,"-0.56",True)) + entity_list.append(Entity("minecraft:pig",True,"-0.72",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: From 96857d50f06972c750a108f424262e9f818fe24b Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 12 Mar 2025 05:38:33 +0900 Subject: [PATCH 015/101] Add strider desaddling --- .../function/fishing/strider/action.mcfunction | 11 +++++++++++ gm4_reeling_rods/generate_files.py | 1 + 2 files changed, 12 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction new file mode 100644 index 0000000000..ed8303638c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction @@ -0,0 +1,11 @@ +# Action for reeled strider +# @s = strider +# at @s +# run from fishing/strider/adv and fishing/strider/adv_baby + +# fail if no saddle +execute unless data entity @s {Saddle:1b} run return fail + +data modify entity @s Saddle set value 0b +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:saddle",count:1} +execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 4a6776f2fb..da89f4677a 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -174,6 +174,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False)) entity_list.append(Entity("minecraft:fox",True,"-0.56",True)) entity_list.append(Entity("minecraft:pig",True,"-0.72",True)) + entity_list.append(Entity("minecraft:strider",True,"-1.36",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: From f33d99e59a69eb308f030f705747c6270aecff94 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 12 Mar 2025 16:54:52 +0900 Subject: [PATCH 016/101] Add snow golem beheading --- .../function/fishing/snow_golem/action.mcfunction | 11 +++++++++++ gm4_reeling_rods/generate_files.py | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction new file mode 100644 index 0000000000..5e0dae8a66 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction @@ -0,0 +1,11 @@ +# Action for reeled snow_golem +# @s = snow_golem +# at @s +# run from fishing/snow_golem/adv + +# fail if no Pumpkin +execute unless data entity @s {Pumpkin:1b} run return fail + +data modify entity @s Pumpkin set value 0b +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} +execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index da89f4677a..93fcc7fe11 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -166,7 +166,7 @@ def create_lookup_file(): ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) entity_list: List[Entity] = [] - # Vertical displacement for mobs is -0.8 * the entities hibox height. Entities with hitboxes that arent just width and height are different + # Vertical displacement for mobs is -0.8 * the entities hitbox height. Entities with hitboxes that arent just width and height are different entity_list.append(Entity("minecraft:leash_knot",False,"-0.4",False)) entity_list.append(Entity("minecraft:allay",False,"-0.48",True)) @@ -175,6 +175,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:fox",True,"-0.56",True)) entity_list.append(Entity("minecraft:pig",True,"-0.72",True)) entity_list.append(Entity("minecraft:strider",True,"-1.36",True)) + entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: From 0b10b5146e5008b4eb9b23d7a306a62df0cd62b6 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 12 Mar 2025 16:56:12 +0900 Subject: [PATCH 017/101] Add entity TODO list --- gm4_reeling_rods/generate_files.py | 52 +++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 93fcc7fe11..a3966232c8 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -188,4 +188,54 @@ def create_lookup_file(): entity_list.append(Entity(villager_height,False,"-1.56",True)) create_files(entity_list) create_lookup_file() - \ No newline at end of file + + ''' + My goal for right now is to go to the maximum scope and then have things cut back. + Push this idea as far as I can, then reign it in. + + TODO: + ALL DISMOUNT + Check if passenger, dismount. + Prepend this logic to all entity list action function + Return if dismounting + Horse, Skele Horse, Zomb Horse : + Steal Armor? + Desaddle + Donkey, Mule : + ChestedHorse + Items + Desaddle + Llama, Trader Llama : + ChestedHorse + Items + Carpet stored in armor.body + Pufferfish : + Fully Puff? Only able to hook outside of water + Do they already do this? + Sheep : + Shear? + Wandering Trader : + Theft Trades? + Steal llamas? + Wolf : + Steal armor? + Piglin, Zomb Piglin, Piglin Brute, Bogged, + Skeleton, Stray, Husk, Drowned, Pillager, + Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: + Steal held item. No threat? Armor instead? + Balance issues per mob + Creaking : + Look into how fishing one works in vanilla. + If rooted on ground, unroot and fly at player + Evoker : + ???? + Illusioner : + ???? + Player : + Steal hand items? + Armor? Too busted? + + NOTE: --- NO --- + Enderman: NOT FEASIBLE. Block state stored, not item data. + Steal held block + Could setblock with the block state, then get drop from breaking + Could map block type to item, but that's far too much work and not maintainable + ''' From 340319aef89e338cbe060e66592f94717fc74d2d Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 13 Mar 2025 09:15:07 +0900 Subject: [PATCH 018/101] Add wolf armor stealing --- .../function/fishing/wolf/action.mcfunction | 11 +++++++++++ gm4_reeling_rods/generate_files.py | 16 ++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction new file mode 100644 index 0000000000..caf7fbff98 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction @@ -0,0 +1,11 @@ +# Action for reeled wolf +# @s = wolf +# at @s +# run from fishing/wolf/adv and fishing/wolf/adv_baby + +# fail if no Owner +execute unless data entity @s Owner run return fail + +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item +data remove entity @s body_armor_item +execute positioned ~ ~0.4 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index a3966232c8..52d6014397 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -176,6 +176,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:pig",True,"-0.72",True)) entity_list.append(Entity("minecraft:strider",True,"-1.36",True)) entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True)) + entity_list.append(Entity("minecraft:wolf",True,"-0.68",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: @@ -207,24 +208,14 @@ def create_lookup_file(): Llama, Trader Llama : ChestedHorse + Items Carpet stored in armor.body - Pufferfish : - Fully Puff? Only able to hook outside of water - Do they already do this? - Sheep : - Shear? Wandering Trader : Theft Trades? Steal llamas? - Wolf : - Steal armor? Piglin, Zomb Piglin, Piglin Brute, Bogged, Skeleton, Stray, Husk, Drowned, Pillager, Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: Steal held item. No threat? Armor instead? Balance issues per mob - Creaking : - Look into how fishing one works in vanilla. - If rooted on ground, unroot and fly at player Evoker : ???? Illusioner : @@ -238,4 +229,9 @@ def create_lookup_file(): Steal held block Could setblock with the block state, then get drop from breaking Could map block type to item, but that's far too much work and not maintainable + Pufferfish : Setting PuffState has issues. Also stupid hitbox changes size >:( + Puff up a bit + Sheep : Would need a map from Color Byte to string. Annoying. Maybe revisit + Shear? + ''' From 7f4c66e0eba672f84aa33dd4657822a0a614af22 Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 13 Mar 2025 10:42:26 +0900 Subject: [PATCH 019/101] Add horse type mob item yoinking --- .../function/fishing/donkey/action.mcfunction | 12 +++++++ .../function/fishing/horse/action.mcfunction | 11 +++++++ .../function/fishing/mule/action.mcfunction | 12 +++++++ gm4_reeling_rods/generate_files.py | 31 ++++++++++++------- 4 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction new file mode 100644 index 0000000000..8331c6a5e2 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction @@ -0,0 +1,12 @@ +# Action for reeled donkey +# @s = donkey +# at @s +# run from fishing/donkey/adv and fishing/donkey/adv_baby + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem +execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +execute positioned ~ ~0.7 ~ run function gm4_reeling_rods:separate +data modify entity @s ChestedHorse set value 0b +execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction new file mode 100644 index 0000000000..fb8a1b611e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction @@ -0,0 +1,11 @@ +# Action for reeled horse +# @s = horse +# at @s +# run from fishing/horse/adv and fishing/horse/adv_baby + +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem +execute store result score $armored gm4_reeling_rods.math if data entity @s body_armor_item run data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item +execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate +execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air +execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction new file mode 100644 index 0000000000..030d3ec556 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction @@ -0,0 +1,12 @@ +# Action for reeled mule +# @s = mule +# at @s +# run from fishing/mule/adv and fishing/mule/adv_baby + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem +execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate +data modify entity @s ChestedHorse set value 0b +execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 52d6014397..4a8a1399e5 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -114,8 +114,7 @@ def create_files(entities: List[Entity]): adv_func_baby[4] = f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby" adv_func_baby[10] = f"\tat @s positioned ~ ~{str(float(entity.vertical_displacement) / 2)} ~ \\" output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv_baby"] = Function(adv_func_baby) - if not ("minecart" in entity.entity_type or is_chest_boat): # Other entity types need to have actions defined manually - continue + # Some generated action files if "minecart" in entity.entity_type: # minecart types output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ f"# Action for reeled {entity_type_no_prefix}", @@ -146,6 +145,18 @@ def create_files(entities: List[Entity]): "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" ]) continue + if "_horse" in entity.entity_type: # skele and zombie horses + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", + "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", + "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" + ]) + continue def create_lookup_file(): lookup_keys = [0] @@ -177,6 +188,7 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:strider",True,"-1.36",True)) entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True)) entity_list.append(Entity("minecraft:wolf",True,"-0.68",True)) + entity_list.append(Entity("minecraft:donkey",True,"-1.2",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: @@ -187,6 +199,8 @@ def create_lookup_file(): entity_list.append(Entity(special_hitbox,False,"-0.4",False)) for villager_height in ["minecraft:witch","minecraft:villager"]: entity_list.append(Entity(villager_height,False,"-1.56",True)) + for horse_height in ["minecraft:mule","minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse"]: + entity_list.append(Entity(horse_height,True,"-1.28",True)) create_files(entity_list) create_lookup_file() @@ -199,18 +213,9 @@ def create_lookup_file(): Check if passenger, dismount. Prepend this logic to all entity list action function Return if dismounting - Horse, Skele Horse, Zomb Horse : - Steal Armor? - Desaddle - Donkey, Mule : - ChestedHorse + Items - Desaddle Llama, Trader Llama : ChestedHorse + Items Carpet stored in armor.body - Wandering Trader : - Theft Trades? - Steal llamas? Piglin, Zomb Piglin, Piglin Brute, Bogged, Skeleton, Stray, Husk, Drowned, Pillager, Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: @@ -233,5 +238,7 @@ def create_lookup_file(): Puff up a bit Sheep : Would need a map from Color Byte to string. Annoying. Maybe revisit Shear? - + Wandering Trader : Doesn't hold items. Maybe revist + Theft Trades? + Steal llamas? ''' From 5cc008608041423121a6045124c9ef3daf2027fd Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 13 Mar 2025 11:02:16 +0900 Subject: [PATCH 020/101] Fix Donkey and Mule code a bit --- .../function/fishing/donkey/action.mcfunction | 4 ++-- .../gm4_reeling_rods/function/fishing/mule/action.mcfunction | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction index 8331c6a5e2..176755d571 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction @@ -8,5 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} execute positioned ~ ~0.7 ~ run function gm4_reeling_rods:separate -data modify entity @s ChestedHorse set value 0b -execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air +execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b +item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction index 030d3ec556..b1b2a5ca7d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction @@ -8,5 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate -data modify entity @s ChestedHorse set value 0b -execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air +execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b +item replace entity @s horse.saddle with minecraft:air From ca05491a81c2cf924c51fe6315d9016998e0e178 Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 13 Mar 2025 11:02:34 +0900 Subject: [PATCH 021/101] Add Llama yoinking --- gm4_reeling_rods/generate_files.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 4a8a1399e5..cb84df655a 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -157,6 +157,21 @@ def create_files(entities: List[Entity]): "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" ]) continue + if "llama" in entity.entity_type: # llama and trader_llama + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", + "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", + "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", + "item replace entity @s armor.body with minecraft:air" + ]) + continue def create_lookup_file(): lookup_keys = [0] @@ -189,6 +204,8 @@ def create_lookup_file(): entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True)) entity_list.append(Entity("minecraft:wolf",True,"-0.68",True)) entity_list.append(Entity("minecraft:donkey",True,"-1.2",True)) + entity_list.append(Entity("minecraft:llama",True,"-1.496",True)) + entity_list.append(Entity("minecraft:trader_llama",True,"-1.496",True)) item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: @@ -213,9 +230,6 @@ def create_lookup_file(): Check if passenger, dismount. Prepend this logic to all entity list action function Return if dismounting - Llama, Trader Llama : - ChestedHorse + Items - Carpet stored in armor.body Piglin, Zomb Piglin, Piglin Brute, Bogged, Skeleton, Stray, Husk, Drowned, Pillager, Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: From cd3233e0ce7f851004cb94b7015d5a2aebef2e91 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 15 Mar 2025 14:11:25 +0900 Subject: [PATCH 022/101] Python refactor & the start of Dismounting work --- .../function/fishing/is_passenger.mcfunction | 6 + gm4_reeling_rods/generate_files.py | 470 ++++++++++-------- 2 files changed, 270 insertions(+), 206 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction new file mode 100644 index 0000000000..5a73a238b8 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction @@ -0,0 +1,6 @@ +# checks if @s is a passenger +# @s = entity to check +# at @s +# run from fishing/{entity_type}/action + +return run execute on vehicle if entity @s diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index cb84df655a..7546835459 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,235 +1,71 @@ from typing import List -from beet import Context, Advancement, Function +from beet import Context, Advancement, Function, DataPack from beet.contrib.vanilla import Vanilla from beet.core.utils import JsonDict import math from copy import deepcopy class Entity: - def __init__(self, entity_type: str, can_be_baby: bool, vertical_displacement: str, needs_enchantment: bool): + def __init__(self, entity_type: str, can_be_baby: bool, vertical_displacement: str, needs_enchantment: bool, can_dismount: bool): self.entity_type = entity_type self.vertical_displacement = vertical_displacement self.needs_enchantment = needs_enchantment self.can_be_baby = can_be_baby - -# Function from: https://www.geeksforgeeks.org/recursively-merge-dictionaries-in-python/ -def recursive_merge(dict1:JsonDict, dict2:JsonDict): - for key, value in dict2.items(): - if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): - # Recursively merge nested dictionaries - dict1[key] = recursive_merge(dict1[key], value) # type: ignore - else: - # Merge non-dictionary values - dict1[key] = value - return dict1 + self.can_dismount = can_dismount def beet_default(ctx: Context): """generates the advancements, the subsequent functions for handling reeling, and set_lookup_table.mcfunction NOTE: Only generates action functions for minecarts and chest boats. Others will have to be defined manually""" - + create_lookup_file(ctx) + vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '1.21.4' + item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags - def create_files(entities: List[Entity]): - for entity in entities: - since_61 = "pale_oak" in entity.entity_type - is_chest_boat = "chest_boat" in entity.entity_type or "chest_raft" in entity.entity_type - output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["since_57"] if is_chest_boat else ctx.data - entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - # Create advancement file - advancement_json : JsonDict = { - "criteria":{ - "fishing_rod_hooked":{ - "trigger":"minecraft:fishing_rod_hooked", - "conditions":{ - "entity":{ - "type" : entity.entity_type - } - } - } - }, - "rewards":{ - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv" - } - } - if entity.needs_enchantment: - recursive_merge(advancement_json,{ - "criteria":{ - "fishing_rod_hooked":{ - "conditions":{ - "rod":{ - "predicates":{ - "minecraft:enchantments":[ - {"enchantments":"gm4_reeling_rods:reeling"} - ] - } - } - } - } - } - }) - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}"] = Advancement(advancement_json) - if entity.can_be_baby: - advancement_json_baby:JsonDict = deepcopy(advancement_json) - recursive_merge(advancement_json_baby,{ - "criteria":{ - "fishing_rod_hooked":{ - "conditions":{ - "entity":{ - "flags":{ - "is_baby": True - } - } - } - } - }, - "rewards":{ - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv_baby" - } - }) - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby"] = Advancement(advancement_json_baby) - # Create adv function - adv_func : List[str] = [ - f"# Initial Logic for rod reeling {entity_type_no_prefix}", - "# @s = player who fished", - "# at @s", - f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}", - f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}", - "\nexecute if entity @s[gamemode=adventure] run return fail", - "\nfunction gm4_reeling_rods:store_player_pos", - "\ntag @s add gm4_reeling_rods.player\n", - "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", - "\tif function gm4_reeling_rods:fishing/owns_bobber \\", - f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", - f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", - "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", - f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", - "\ntag @s remove gm4_reeling_rods.player" - ] - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv"] = Function(adv_func) - if entity.can_be_baby: - adv_func_baby = deepcopy(adv_func) - adv_func_baby[0] = f"# Initial Logic for rod reeling baby {entity_type_no_prefix}" - adv_func_baby[3] = f"# run from advancement gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby" - adv_func_baby[4] = f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{entity_type_no_prefix}_baby" - adv_func_baby[10] = f"\tat @s positioned ~ ~{str(float(entity.vertical_displacement) / 2)} ~ \\" - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv_baby"] = Function(adv_func_baby) - # Some generated action files - if "minecart" in entity.entity_type: # minecart types - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", - "function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" - ]) - continue - if is_chest_boat: # chest boats / raft specific - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" - ]) - continue - if "_horse" in entity.entity_type: # skele and zombie horses - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", - "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", - "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" - ]) - continue - if "llama" in entity.entity_type: # llama and trader_llama - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", - "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", - "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", - "item replace entity @s armor.body with minecraft:air" - ]) - continue - - def create_lookup_file(): - lookup_keys = [0] - for dx in range(0,34): - for dy in range(0,34): - for dz in range(0,34): - potenital_key = (dx * dx) + (dy * dy) + (dz * dz) - if (math.sqrt(potenital_key) > 33): # ignore values out of fishing bobber range - continue - if potenital_key in lookup_keys: # ignore if already found - continue - lookup_keys.append(potenital_key) - lookup_keys.sort() - strList: List[str] = [] - for key in lookup_keys: - value = math.floor(100*(0.08*math.sqrt(math.sqrt(key)))) - strList.append(f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}") - ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) - entity_list: List[Entity] = [] # Vertical displacement for mobs is -0.8 * the entities hitbox height. Entities with hitboxes that arent just width and height are different + entity_list.append(Entity("minecraft:leash_knot",False,"-0.4",False,False)) + entity_list.append(Entity("minecraft:allay",False,"-0.48",True,True)) + entity_list.append(Entity("minecraft:shulker",False,"-0.8",False,True)) + entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False,False)) + entity_list.append(Entity("minecraft:fox",True,"-0.56",True,True)) + entity_list.append(Entity("minecraft:pig",True,"-0.72",True,True)) + entity_list.append(Entity("minecraft:strider",True,"-1.36",True,True)) + entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True,True)) + entity_list.append(Entity("minecraft:wolf",True,"-0.68",True,True)) + entity_list.append(Entity("minecraft:donkey",True,"-1.2",True,True)) + entity_list.append(Entity("minecraft:llama",True,"-1.496",True,True)) + entity_list.append(Entity("minecraft:trader_llama",True,"-1.496",True,True)) - entity_list.append(Entity("minecraft:leash_knot",False,"-0.4",False)) - entity_list.append(Entity("minecraft:allay",False,"-0.48",True)) - entity_list.append(Entity("minecraft:shulker",False,"-0.8",False)) - entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False)) - entity_list.append(Entity("minecraft:fox",True,"-0.56",True)) - entity_list.append(Entity("minecraft:pig",True,"-0.72",True)) - entity_list.append(Entity("minecraft:strider",True,"-1.36",True)) - entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True)) - entity_list.append(Entity("minecraft:wolf",True,"-0.68",True)) - entity_list.append(Entity("minecraft:donkey",True,"-1.2",True)) - entity_list.append(Entity("minecraft:llama",True,"-1.496",True)) - entity_list.append(Entity("minecraft:trader_llama",True,"-1.496",True)) - - item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags for chest_boat in item_tags["minecraft:chest_boats"].data['values']: - entity_list.append(Entity(chest_boat,False,"-0.45",True)) + entity_list.append(Entity(chest_boat,False,"-0.45",True,False)) for minecart in ["minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:hopper_minecart","minecraft:tnt_minecart"]: - entity_list.append(Entity(minecart,False,"-0.56",True)) + entity_list.append(Entity(minecart,False,"-0.56",True,False)) for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: - entity_list.append(Entity(special_hitbox,False,"-0.4",False)) + entity_list.append(Entity(special_hitbox,False,"-0.4",False,False)) for villager_height in ["minecraft:witch","minecraft:villager"]: - entity_list.append(Entity(villager_height,False,"-1.56",True)) + entity_list.append(Entity(villager_height,False,"-1.56",True,True)) for horse_height in ["minecraft:mule","minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse"]: - entity_list.append(Entity(horse_height,True,"-1.28",True)) - create_files(entity_list) - create_lookup_file() - - ''' - My goal for right now is to go to the maximum scope and then have things cut back. - Push this idea as far as I can, then reign it in. - + entity_list.append(Entity(horse_height,True,"-1.28",True,True)) + create_files(ctx, entity_list) +''' +My goal for right now is to go to the maximum scope and then have things cut back. +Push this idea as far as I can, then reign it in. + TODO: + Figure out how to account for different hitbox heights : + Different entity states. Like camel laying down, or player swimming + Multiple checks in the adv function + Slime Dismounting: Size Tag + Advancement checks? + Would need an advancement and function for each size. Maybe just do the normal vanilla 3 + Technically I could do all possible values..... But thats a lot of advancements + Could have 3 separate checks in the adv function. Same as camel and player plans + Attribute, minecraft:scale + Catch 22. Can't factor it in because we need to use it to select the entity. Can't use it before selecting. + ALL DISMOUNT - Check if passenger, dismount. - Prepend this logic to all entity list action function - Return if dismounting + Add more mobs. Hopefully all.... Piglin, Zomb Piglin, Piglin Brute, Bogged, Skeleton, Stray, Husk, Drowned, Pillager, Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: @@ -242,7 +78,8 @@ def create_lookup_file(): Player : Steal hand items? Armor? Too busted? - + Multiple hitbox sizes..... + NOTE: --- NO --- Enderman: NOT FEASIBLE. Block state stored, not item data. Steal held block @@ -255,4 +92,225 @@ def create_lookup_file(): Wandering Trader : Doesn't hold items. Maybe revist Theft Trades? Steal llamas? - ''' +''' + +def create_lookup_file(ctx: Context): + lookup_keys = [0] + for dx in range(0,34): + for dy in range(0,34): + for dz in range(0,34): + potenital_key = (dx * dx) + (dy * dy) + (dz * dz) + if (math.sqrt(potenital_key) > 33): # ignore values out of fishing bobber range + continue + if potenital_key in lookup_keys: # ignore if already found + continue + lookup_keys.append(potenital_key) + lookup_keys.sort() + strList: List[str] = [] + for key in lookup_keys: + value = math.floor(100*(0.08*math.sqrt(math.sqrt(key)))) + strList.append(f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}") + ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) + +# Function from: https://www.geeksforgeeks.org/recursively-merge-dictionaries-in-python/ +def recursive_merge(dict1:JsonDict, dict2:JsonDict): + for key, value in dict2.items(): + if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): + # Recursively merge nested dictionaries + dict1[key] = recursive_merge(dict1[key], value) # type: ignore + else: + # Merge non-dictionary values + dict1[key] = value + return dict1 + +def create_adv_and_func(output_pack: DataPack, function_name: str, advancement_name: str,entity: Entity, run_on_entity: str, function_desc: str): + entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') + advancement_json : JsonDict = { + "criteria":{ + "fishing_rod_hooked":{ + "trigger":"minecraft:fishing_rod_hooked", + "conditions":{ + "entity":{ + "type" : entity.entity_type + } + } + } + }, + "rewards":{ + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}" + } + } + if entity.needs_enchantment: + recursive_merge(advancement_json,{ + "criteria":{ + "fishing_rod_hooked":{ + "conditions":{ + "rod":{ + "predicates":{ + "minecraft:enchantments":[ + {"enchantments":"gm4_reeling_rods:reeling"} + ] + } + } + } + } + } + }) + adv_func : List[str] = [ + function_desc, + "# @s = player who fished", + "# at @s", + f"# run from advancement gm4_reeling_rods:fishing/{advancement_name}", + f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{advancement_name}", + "\nexecute if entity @s[gamemode=adventure] run return fail", + "\nfunction gm4_reeling_rods:store_player_pos", + "\ntag @s add gm4_reeling_rods.player\n", + "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", + "\tif function gm4_reeling_rods:fishing/owns_bobber \\", + f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", + f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", + "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", + run_on_entity, + "\ntag @s remove gm4_reeling_rods.player" + ] + if entity.can_be_baby: + # change normal advancement to be for explicitly not baby + recursive_merge(advancement_json,{ + "criteria":{ + "fishing_rod_hooked":{ + "conditions":{ + "entity":{ + "flags":{ + "is_baby": False + } + } + } + } + } + }) + # new advancement for explicitly baby + advancement_json_baby:JsonDict = deepcopy(advancement_json) + recursive_merge(advancement_json_baby,{ + "criteria":{ + "fishing_rod_hooked":{ + "conditions":{ + "entity":{ + "flags":{ + "is_baby": True + } + } + } + } + }, + "rewards":{ + "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}_baby" + } + }) + adv_func_baby = deepcopy(adv_func) + adv_func_baby[0] = f"{function_desc}_baby" + adv_func_baby[3] = f"# run from advancement gm4_reeling_rods:fishing/{advancement_name}_baby" + adv_func_baby[4] = f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{advancement_name}_baby" + adv_func_baby[10] = f"\tat @s positioned ~ ~{str(float(entity.vertical_displacement) / 2)} ~ \\" + + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}_baby"] = Function(adv_func_baby) + output_pack[f"gm4_reeling_rods:fishing/{advancement_name}_baby"] = Advancement(advancement_json_baby) + + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}"] = Function(adv_func) + output_pack[f"gm4_reeling_rods:fishing/{advancement_name}"] = Advancement(advancement_json) + +def create_files(ctx: Context, entities: List[Entity]): + for entity in entities: + since_61 = "pale_oak" in entity.entity_type + is_chest_boat = "chest_boat" in entity.entity_type or "chest_raft" in entity.entity_type + output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["since_57"] if is_chest_boat else ctx.data + entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') + create_adv_and_func( + output_pack, + "adv", + entity_type_no_prefix, + entity, + f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", + f"# Initial Logic for rod reeling {entity_type_no_prefix}" + ) + # Some generated action files + if "minecart" in entity.entity_type: # minecart types + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", + "function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + elif is_chest_boat: # chest boats / raft specific + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + elif "_horse" in entity.entity_type: # skele and zombie horses + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", + "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", + "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" + ]) + elif "llama" in entity.entity_type: # llama and trader_llama + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", + "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", + "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", + "item replace entity @s armor.body with minecraft:air" + ]) + if entity.can_dismount: # Dismounting logic + if entity.needs_enchantment: # Make a new advancement and adv func for dismounting, with no enchant needed + create_adv_and_func( + output_pack, + "adv_dismount", + f"{entity_type_no_prefix}_dismount", + Entity( + entity.entity_type, + entity.can_be_baby, + entity.vertical_displacement, + False, + entity.can_dismount + ), + f"\tif function gm4_reeling_rods:fishing/is_passenger run ride @s dismount", + f"# Logic for rod dismounting {entity_type_no_prefix}" + ) + else: # prepend dismounting logic to action function + actionFunc = output_pack.functions.get(f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action") + if actionFunc != None: # if existing action, prepend dismounting + actionFunc.prepend(Function([ + "# dismounting logic", + "execute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount\n\n" + ])) + else: # if no action function, make one thats just dismounting + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + "# dismounting logic", + "execute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount" + ]) From 94e59500b9e4874d14c3e80d79ef6e464ffa7b17 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 17 Mar 2025 05:51:59 +0900 Subject: [PATCH 023/101] Remove witch limit --- .../function/fishing/witch/action.mcfunction | 4 ---- .../function/fishing/witch/limit.mcfunction | 8 -------- 2 files changed, 12 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction index 8f604c7fe6..89d4c89000 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction @@ -5,10 +5,6 @@ # return if no item in mainhand execute unless data entity @s HandItems[0].id run return fail - -execute if score @s gm4_reeling_rods.entities matches 2 run return run function gm4_reeling_rods:fishing/witch/limit -scoreboard players add @s gm4_reeling_rods.entities 1 - data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] data modify entity @s HandItems[0] set value {} execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction deleted file mode 100644 index 57e13e8513..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/limit.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Sets a limit on witch so player cant steal any more -# @s = witch -# at @s -# run from gm4_reeling_rods:fishing/witch/action - -tag @s add gm4_reeling_rods.immune -particle minecraft:witch ~ ~1.2 ~ 0.5 0.7 0.5 40 25 -playsound minecraft:entity.witch.celebrate hostile @a[distance=..16] ~ ~1.5 ~ From 1145e15cb5be423d789f508047d3b1608caa9770 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 17 Mar 2025 06:56:56 +0900 Subject: [PATCH 024/101] Fix file new line issue --- .../data/gm4_reeling_rods/advancement/fishing/chest_boat.json | 1 - 1 file changed, 1 deletion(-) diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json index e5fb7a17f8..d7b118493d 100644 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json +++ b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json @@ -22,4 +22,3 @@ "function": "gm4_reeling_rods:fishing/chest_boat/adv" } } - \ No newline at end of file From 04739d7787a104910f7273b1a49a784c5736067a Mon Sep 17 00:00:00 2001 From: runcows <124551271+runcows@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:58:55 +0900 Subject: [PATCH 025/101] Switch to id based system for entity selection * Intial commit for id changes * Fix everything * overwrite old * actual overwrite old --- .../advancement/fishing/chest_boat.json | 24 -- .../fishing/chest_boat/action.mcfunction | 12 - .../fishing/chest_boat/adv.mcfunction | 21 - gm4_reeling_rods/beet.yaml | 2 +- .../function/fishing/select_type.mcfunction | 4 + .../function/id/assign.mcfunction | 20 + .../function/id/get_next.mcfunction | 18 + .../function/id/set.mcfunction | 44 ++ .../gm4_reeling_rods/function/init.mcfunction | 3 +- .../function/player/add_bit.mcfunction | 15 + .../player/find_fished_entity.mcfunction | 15 + .../owns_bobber.mcfunction | 0 .../function/player/received_bit.mcfunction | 24 ++ .../gm4_reeling_rods/function/tick.mcfunction | 4 + .../predicate/holding_reeling_rod.json | 17 + .../tags/entity_type/ignore.json | 38 ++ gm4_reeling_rods/generate_files.py | 378 +++++++----------- 17 files changed, 353 insertions(+), 286 deletions(-) delete mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json delete mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction delete mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => player}/owns_bobber.mcfunction (100%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json deleted file mode 100644 index d7b118493d..0000000000 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/advancement/fishing/chest_boat.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "criteria": { - "fishing_rod_hooked": { - "trigger": "minecraft:fishing_rod_hooked", - "conditions": { - "rod": { - "predicates": { - "minecraft:enchantments": [ - { - "enchantments": "gm4_reeling_rods:reeling" - } - ] - } - }, - "entity": { - "type": "minecraft:chest_boat" - } - } - } - }, - "rewards": { - "function": "gm4_reeling_rods:fishing/chest_boat/adv" - } - } diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction deleted file mode 100644 index 787ca611cb..0000000000 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/action.mcfunction +++ /dev/null @@ -1,12 +0,0 @@ -# Action for reeled chest_boat -# @s = chest_boat -# at @s -# run from gm4_reeling_rods:fishing/chest_boat/adv - -data modify storage gm4_reeling_rods:temp entity_data set from entity @s -data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate -tp @s ~ -1000 ~ -data remove storage gm4_reeling_rods:temp entity_data.UUID -data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:boat" -function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction deleted file mode 100644 index 0d537a6a3e..0000000000 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/function/fishing/chest_boat/adv.mcfunction +++ /dev/null @@ -1,21 +0,0 @@ -# Initial Logic for rod reeling chest_boat -# @s = player who fished -# at @s -# run from advancement gm4_reeling_rods:fishing/chest_boat - -advancement revoke @s only gm4_reeling_rods:fishing/chest_boat - -execute if entity @s[gamemode=adventure] run return fail - -function gm4_reeling_rods:store_player_pos - -tag @s add gm4_reeling_rods.player - -execute as @e[type=minecraft:fishing_bobber,distance=..33] \ - if function gm4_reeling_rods:fishing/owns_bobber \ - at @s positioned ~ ~-0.45 ~ \ - as @e[type=minecraft:chest_boat,distance=..0.00001,limit=1] \ - unless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \ - run function gm4_reeling_rods:fishing/chest_boat/action - -tag @s remove gm4_reeling_rods.player diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index 5801549d49..c813ac9db7 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -25,7 +25,7 @@ pipeline: meta: gm4: versioning: - schedule_loops: [] + schedule_loops: [tick] website: description: Reel in more than just fish with these rods! Yoink the chest from the chest boat and more! recommended: diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction new file mode 100644 index 0000000000..06111a4171 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction @@ -0,0 +1,4 @@ +# AAAAAAAAAAAAAAA +# @s = fished entity +# at @s +# run from player/find_fished_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction new file mode 100644 index 0000000000..1e41074260 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction @@ -0,0 +1,20 @@ +# actually assigns entity tags +# with {AAAAAA} +# run from id/set + +$tag @s add $(bit_0) +$tag @s add $(bit_1) +$tag @s add $(bit_2) +$tag @s add $(bit_3) +$tag @s add $(bit_4) +$tag @s add $(bit_5) +$tag @s add $(bit_6) +$tag @s add $(bit_7) +$tag @s add $(bit_8) +$tag @s add $(bit_9) +$tag @s add $(bit_10) +$tag @s add $(bit_11) +$tag @s add $(bit_12) +$tag @s add $(bit_13) +$tag @s add $(bit_14) +$tag @s add $(bit_15) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction new file mode 100644 index 0000000000..6262e2e44d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction @@ -0,0 +1,18 @@ +# Gets the next id +# with {bit} +# run from id/set and self + +# Data storage gm4_reeling_rods:id next + # bit_0..15 : "gm4_reeling_rods.id.<0..15>.[0|1]" + +# change bit 0 -> 1, return nothing else to do +$execute if data storage gm4_reeling_rods:id {next:{bit_$(bit):"gm4_reeling_rods.id.$(bit).0"}} \ + run return run data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).1" + +# change bit 1 -> 0, then go on to next bit +# from here we know the bit is 1 so we don't need to check it +$data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).0" +execute if score $bit gm4_reeling_rods.math matches 15 run return 1 +# next bit +execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players add $bit gm4_reeling_rods.math 1 +function gm4_reeling_rods:id/get_next with storage gm4_reeling_rods:id diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction new file mode 100644 index 0000000000..297cf5821d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction @@ -0,0 +1,44 @@ +# function logic for setting an id on an entity +# @s = entity to be assigned id +# at @s +# run from tick + +execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players set $bit gm4_reeling_rods.math 0 +function gm4_reeling_rods:id/get_next with storage gm4_reeling_rods:id + +# clear tags +tag @s remove gm4_reeling_rods.id.0.0 +tag @s remove gm4_reeling_rods.id.1.0 +tag @s remove gm4_reeling_rods.id.2.0 +tag @s remove gm4_reeling_rods.id.3.0 +tag @s remove gm4_reeling_rods.id.4.0 +tag @s remove gm4_reeling_rods.id.5.0 +tag @s remove gm4_reeling_rods.id.6.0 +tag @s remove gm4_reeling_rods.id.7.0 +tag @s remove gm4_reeling_rods.id.8.0 +tag @s remove gm4_reeling_rods.id.9.0 +tag @s remove gm4_reeling_rods.id.10.0 +tag @s remove gm4_reeling_rods.id.11.0 +tag @s remove gm4_reeling_rods.id.12.0 +tag @s remove gm4_reeling_rods.id.13.0 +tag @s remove gm4_reeling_rods.id.14.0 +tag @s remove gm4_reeling_rods.id.15.0 +tag @s remove gm4_reeling_rods.id.0.1 +tag @s remove gm4_reeling_rods.id.1.1 +tag @s remove gm4_reeling_rods.id.2.1 +tag @s remove gm4_reeling_rods.id.3.1 +tag @s remove gm4_reeling_rods.id.4.1 +tag @s remove gm4_reeling_rods.id.5.1 +tag @s remove gm4_reeling_rods.id.6.1 +tag @s remove gm4_reeling_rods.id.7.1 +tag @s remove gm4_reeling_rods.id.8.1 +tag @s remove gm4_reeling_rods.id.9.1 +tag @s remove gm4_reeling_rods.id.10.1 +tag @s remove gm4_reeling_rods.id.11.1 +tag @s remove gm4_reeling_rods.id.12.1 +tag @s remove gm4_reeling_rods.id.13.1 +tag @s remove gm4_reeling_rods.id.14.1 +tag @s remove gm4_reeling_rods.id.15.1 + +# assign new id +function gm4_reeling_rods:id/assign with storage gm4_reeling_rods:id next diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 33486c7cab..d61da2adb7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -6,8 +6,9 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" +scoreboard objectives add gm4_reeling_rods.bit_count dummy "gm4_reeling_rods bit count" # set_lookup_table generated in generate_files.py function gm4_reeling_rods:set_lookup_table -# no main function +schedule function gm4_reeling_rods:tick 1t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction new file mode 100644 index 0000000000..6e112d43dc --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction @@ -0,0 +1,15 @@ +# Adds a bit value to the marker at players location and continues +# @s = marker at players feet +# at @s +# with {bit, bit_tag} +# run from gm4_reeling_rods:player/received_bit + +# add bit data +$data modify entity @s data.gm4_reeling_rods.id.bit_$(bit) set value "$(bit_tag)" + +# fail if not all bits +execute unless score @a[tag=gm4_reeling_rods.player,limit=1] gm4_reeling_rods.bit_count matches 16 run return fail + +# all bits received +scoreboard players set @a[tag=gm4_reeling_rods.player] gm4_reeling_rods.bit_count 0 +function gm4_reeling_rods:player/find_fished_entity with entity @s data.gm4_reeling_rods.id diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction new file mode 100644 index 0000000000..ece82d5e7c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -0,0 +1,15 @@ +# Finds entity the player fished +# @s = marker at players feet +# at @s +# with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} +# run from gm4_reeling_rods:player/received_bit + +$execute as @e[type=minecraft:fishing_bobber,distance=..33] \ + if function gm4_reeling_rods:player/owns_bobber \ + at @s as @e[distance=..42, limit=1, \ + tag=$(bit_0), tag=$(bit_1), tag=$(bit_2), tag=$(bit_3), tag=$(bit_4), tag=$(bit_5), tag=$(bit_6), tag=$(bit_7), \ + tag=$(bit_8), tag=$(bit_9), tag=$(bit_10), tag=$(bit_11), tag=$(bit_12), tag=$(bit_13), tag=$(bit_14), tag=$(bit_15)\ + ] at @s run function gm4_reeling_rods:fishing/select_type + +# kill marker after +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction similarity index 100% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/owns_bobber.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction new file mode 100644 index 0000000000..bd00510d4f --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -0,0 +1,24 @@ +# Logic for when a player receives a bit +# @s = player who received a bit +# at @s +# with {bit, bit_tag} +# run from gm4_reeling_rods:player/bit_{bit}_{value} + +# Assumptions: + # bit and bit_tag are stored in storage gm4_reeling_rods:temp bit_data + # this score is set to 0 after all bits received +scoreboard players add @s gm4_reeling_rods.bit_count 1 + +# MARKER TAG = "gm4_reeling_rods.player_marker" +# if marker exists proceed to player/add_bit +execute as @e[type=minecraft:marker,distance=..0.001,tag=gm4_reeling_rods.player_marker,limit=1] run \ + return run function gm4_reeling_rods:player/add_bit with storage gm4_reeling_rods:temp bit_data + +# this only runs if there was no marker found, so summon one +$summon minecraft:marker ~ ~ ~ \ + {\ + Tags:["gm4_reeling_rods.player_marker","smithed.strict","smithed.entity"],\ + data:{gm4_reeling_rods:{id:{bit_$(bit):"$(bit_tag)"}}},\ + CustomName:'{"text":"gm4_reeling_rods.player_marker"}'\ + } +# as it was the first bit, we don't need to do anything else here diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction new file mode 100644 index 0000000000..90e31a0aeb --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -0,0 +1,4 @@ +# probably want to replace the type ignore tag with type supported tag thats auto generated +execute as @e[type=minecraft:fishing_bobber] at @s as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set + +schedule function gm4_reeling_rods:tick 1t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json new file mode 100644 index 0000000000..cd7a1fba2e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json @@ -0,0 +1,17 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:reeling" + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json new file mode 100644 index 0000000000..29be513500 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json @@ -0,0 +1,38 @@ +{ + "values": [ + "minecraft:area_effect_cloud", + "minecraft:arrow", + "minecraft:block_display", + "minecraft:breeze_wind_charge", + "minecraft:command_block_minecart", + "minecraft:dragon_fireball", + "minecraft:egg", + "minecraft:ender_pearl", + "minecraft:evoker_fangs", + "minecraft:experience_bottle", + "minecraft:experience_orb", + "minecraft:eye_of_ender", + "minecraft:falling_block", + "minecraft:fireball", + "minecraft:firework_rocket", + "minecraft:fishing_bobber", + "minecraft:interaction", + "minecraft:item", + "minecraft:item_display", + "minecraft:lightning_bolt", + "minecraft:llama_spit", + "minecraft:marker", + "minecraft:ominous_item_spawner", + "minecraft:potion", + "minecraft:shulker_bullet", + "minecraft:small_fireball", + "minecraft:snowball", + "minecraft:spawner_minecart", + "minecraft:spectral_arrow", + "minecraft:text_display", + "minecraft:tnt", + "minecraft:trident", + "minecraft:wind_charge", + "minecraft:wither_skull" + ] +} diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 7546835459..fec644943b 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,69 +1,55 @@ from typing import List -from beet import Context, Advancement, Function, DataPack +from beet import Context, Advancement, Function, DataPack from beet.contrib.vanilla import Vanilla -from beet.core.utils import JsonDict import math -from copy import deepcopy class Entity: - def __init__(self, entity_type: str, can_be_baby: bool, vertical_displacement: str, needs_enchantment: bool, can_dismount: bool): + def __init__(self, entity_type: str, needs_enchantment: bool, can_dismount: bool): self.entity_type = entity_type - self.vertical_displacement = vertical_displacement self.needs_enchantment = needs_enchantment - self.can_be_baby = can_be_baby self.can_dismount = can_dismount def beet_default(ctx: Context): """generates the advancements, the subsequent functions for handling reeling, and set_lookup_table.mcfunction NOTE: Only generates action functions for minecarts and chest boats. Others will have to be defined manually""" create_lookup_file(ctx) + create_bit_advancements(ctx) vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '1.21.4' item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags entity_list: List[Entity] = [] - # Vertical displacement for mobs is -0.8 * the entities hitbox height. Entities with hitboxes that arent just width and height are different - entity_list.append(Entity("minecraft:leash_knot",False,"-0.4",False,False)) - entity_list.append(Entity("minecraft:allay",False,"-0.48",True,True)) - entity_list.append(Entity("minecraft:shulker",False,"-0.8",False,True)) - entity_list.append(Entity("minecraft:end_crystal",False,"-1.6",False,False)) - entity_list.append(Entity("minecraft:fox",True,"-0.56",True,True)) - entity_list.append(Entity("minecraft:pig",True,"-0.72",True,True)) - entity_list.append(Entity("minecraft:strider",True,"-1.36",True,True)) - entity_list.append(Entity("minecraft:snow_golem", False, "-1.52",True,True)) - entity_list.append(Entity("minecraft:wolf",True,"-0.68",True,True)) - entity_list.append(Entity("minecraft:donkey",True,"-1.2",True,True)) - entity_list.append(Entity("minecraft:llama",True,"-1.496",True,True)) - entity_list.append(Entity("minecraft:trader_llama",True,"-1.496",True,True)) + entity_list.append(Entity("minecraft:leash_knot",False,False)) + entity_list.append(Entity("minecraft:allay",True,True)) + entity_list.append(Entity("minecraft:shulker",False,True)) + entity_list.append(Entity("minecraft:end_crystal",False,False)) + entity_list.append(Entity("minecraft:fox",True,True)) + entity_list.append(Entity("minecraft:pig",True,True)) + entity_list.append(Entity("minecraft:strider",True,True)) + entity_list.append(Entity("minecraft:snow_golem",True,True)) + entity_list.append(Entity("minecraft:wolf",True,True)) + entity_list.append(Entity("minecraft:donkey",True,True)) + entity_list.append(Entity("minecraft:llama",True,True)) + entity_list.append(Entity("minecraft:trader_llama",True,True)) for chest_boat in item_tags["minecraft:chest_boats"].data['values']: - entity_list.append(Entity(chest_boat,False,"-0.45",True,False)) + entity_list.append(Entity(chest_boat,True,False)) + entity_list.append(Entity("minecraft:chest_boat",True,False)) for minecart in ["minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:hopper_minecart","minecraft:tnt_minecart"]: - entity_list.append(Entity(minecart,False,"-0.56",True,False)) + entity_list.append(Entity(minecart,True,False)) for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: - entity_list.append(Entity(special_hitbox,False,"-0.4",False,False)) + entity_list.append(Entity(special_hitbox,False,False)) for villager_height in ["minecraft:witch","minecraft:villager"]: - entity_list.append(Entity(villager_height,False,"-1.56",True,True)) + entity_list.append(Entity(villager_height,True,True)) for horse_height in ["minecraft:mule","minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse"]: - entity_list.append(Entity(horse_height,True,"-1.28",True,True)) - create_files(ctx, entity_list) + entity_list.append(Entity(horse_height,True,True)) + create_select_type(ctx, entity_list) ''' My goal for right now is to go to the maximum scope and then have things cut back. Push this idea as far as I can, then reign it in. TODO: - Figure out how to account for different hitbox heights : - Different entity states. Like camel laying down, or player swimming - Multiple checks in the adv function - Slime Dismounting: Size Tag - Advancement checks? - Would need an advancement and function for each size. Maybe just do the normal vanilla 3 - Technically I could do all possible values..... But thats a lot of advancements - Could have 3 separate checks in the adv function. Same as camel and player plans - Attribute, minecraft:scale - Catch 22. Can't factor it in because we need to use it to select the entity. Can't use it before selecting. - ALL DISMOUNT Add more mobs. Hopefully all.... Piglin, Zomb Piglin, Piglin Brute, Bogged, @@ -79,6 +65,8 @@ def beet_default(ctx: Context): Steal hand items? Armor? Too busted? Multiple hitbox sizes..... + Pufferfish : + Puff up NOTE: --- NO --- Enderman: NOT FEASIBLE. Block state stored, not item data. @@ -112,205 +100,141 @@ def create_lookup_file(ctx: Context): strList.append(f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}") ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) -# Function from: https://www.geeksforgeeks.org/recursively-merge-dictionaries-in-python/ -def recursive_merge(dict1:JsonDict, dict2:JsonDict): - for key, value in dict2.items(): - if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): - # Recursively merge nested dictionaries - dict1[key] = recursive_merge(dict1[key], value) # type: ignore - else: - # Merge non-dictionary values - dict1[key] = value - return dict1 - -def create_adv_and_func(output_pack: DataPack, function_name: str, advancement_name: str,entity: Entity, run_on_entity: str, function_desc: str): - entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - advancement_json : JsonDict = { - "criteria":{ - "fishing_rod_hooked":{ - "trigger":"minecraft:fishing_rod_hooked", - "conditions":{ - "entity":{ - "type" : entity.entity_type - } - } - } - }, - "rewards":{ - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}" - } - } - if entity.needs_enchantment: - recursive_merge(advancement_json,{ - "criteria":{ - "fishing_rod_hooked":{ - "conditions":{ - "rod":{ - "predicates":{ - "minecraft:enchantments":[ - {"enchantments":"gm4_reeling_rods:reeling"} - ] +def create_bit_advancements(ctx: Context): + for bit in range(16): + for value in range(2): + # default adv + ctx.data[f"gm4_reeling_rods:fishing/bit_{bit}_{value}"] = Advancement({ + "criteria":{ + "fishing_rod_hooked":{ + "trigger":"minecraft:fishing_rod_hooked", + "conditions":{ + "entity":{ + "nbt": "{" + f"Tags:[\"gm4_reeling_rods.id.{bit}.{value}\"]" + "}" } } } + }, + "rewards":{ + "function": f"gm4_reeling_rods:player/bit_{bit}_{value}" } - } - }) - adv_func : List[str] = [ - function_desc, - "# @s = player who fished", + }) + ctx.data[f"gm4_reeling_rods:player/bit_{bit}_{value}"] = Function([ + f"# player adv logic for getting bit {bit} at value {value}", + f"# run from advancement fishing/bit_{bit}_{value}\n", + f"advancement revoke @s only gm4_reeling_rods:fishing/bit_{bit}_{value}\n", + "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", + "data remove storage gm4_reeling_rods:temp enchanted", + "execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted set value 1", + "function gm4_reeling_rods:store_player_pos", + "tag @s add gm4_reeling_rods.player", + "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", + "tag @s remove gm4_reeling_rods.player" + ]) + +def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): + finalFunction: List[str] = [ + "# GENERATED from generate_files.py", + "# Selects the right entity type or dismounts the entity", + "# @s = fished entity", "# at @s", - f"# run from advancement gm4_reeling_rods:fishing/{advancement_name}", - f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{advancement_name}", - "\nexecute if entity @s[gamemode=adventure] run return fail", - "\nfunction gm4_reeling_rods:store_player_pos", - "\ntag @s add gm4_reeling_rods.player\n", - "execute as @e[type=minecraft:fishing_bobber,distance=..33] \\", - "\tif function gm4_reeling_rods:fishing/owns_bobber \\", - f"\tat @s positioned ~ ~{entity.vertical_displacement} ~ \\", - f"\tas @e[type={entity.entity_type},distance=..0.00001,limit=1] \\", - "\tunless data entity @s {Invulnerable:1b} unless data entity @s Tags[] \\", - run_on_entity, - "\ntag @s remove gm4_reeling_rods.player" + "# run from player/find_fished_entity\n" ] - if entity.can_be_baby: - # change normal advancement to be for explicitly not baby - recursive_merge(advancement_json,{ - "criteria":{ - "fishing_rod_hooked":{ - "conditions":{ - "entity":{ - "flags":{ - "is_baby": False - } - } - } - } - } - }) - # new advancement for explicitly baby - advancement_json_baby:JsonDict = deepcopy(advancement_json) - recursive_merge(advancement_json_baby,{ - "criteria":{ - "fishing_rod_hooked":{ - "conditions":{ - "entity":{ - "flags":{ - "is_baby": True - } - } - } - } - }, - "rewards":{ - "function": f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}_baby" - } - }) - adv_func_baby = deepcopy(adv_func) - adv_func_baby[0] = f"{function_desc}_baby" - adv_func_baby[3] = f"# run from advancement gm4_reeling_rods:fishing/{advancement_name}_baby" - adv_func_baby[4] = f"\nadvancement revoke @s only gm4_reeling_rods:fishing/{advancement_name}_baby" - adv_func_baby[10] = f"\tat @s positioned ~ ~{str(float(entity.vertical_displacement) / 2)} ~ \\" - - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}_baby"] = Function(adv_func_baby) - output_pack[f"gm4_reeling_rods:fishing/{advancement_name}_baby"] = Advancement(advancement_json_baby) - - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/{function_name}"] = Function(adv_func) - output_pack[f"gm4_reeling_rods:fishing/{advancement_name}"] = Advancement(advancement_json) + for line in strings[0]: + finalFunction.append(line) + finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount\n") + for line in strings[1]: + finalFunction.append(line) + output_pack["gm4_reeling_rods:fishing/select_type"] = Function(finalFunction) -def create_files(ctx: Context, entities: List[Entity]): +def create_select_type(ctx: Context, entities: List[Entity]): + selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] + selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] + selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] for entity in entities: since_61 = "pale_oak" in entity.entity_type - is_chest_boat = "chest_boat" in entity.entity_type or "chest_raft" in entity.entity_type - output_pack = ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["since_57"] if is_chest_boat else ctx.data + backport_48 = "minecraft:chest_boat" in entity.entity_type + since_57 = "_chest_boat" in entity.entity_type or "_chest_raft" in entity.entity_type entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - create_adv_and_func( - output_pack, - "adv", - entity_type_no_prefix, - entity, - f"\trun function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", - f"# Initial Logic for rod reeling {entity_type_no_prefix}" + + # generate an action if its one of those types + generated_action( + ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["backport_48"] if backport_48 else ctx.data.overlays["since_57"] if since_57 else ctx.data, + entity ) - # Some generated action files - if "minecart" in entity.entity_type: # minecart types - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", - "function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" - ]) - elif is_chest_boat: # chest boats / raft specific - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" - ]) - elif "_horse" in entity.entity_type: # skele and zombie horses - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", - "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", - "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" - ]) - elif "llama" in entity.entity_type: # llama and trader_llama - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", - "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", - "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", - "item replace entity @s armor.body with minecraft:air" - ]) - if entity.can_dismount: # Dismounting logic - if entity.needs_enchantment: # Make a new advancement and adv func for dismounting, with no enchant needed - create_adv_and_func( - output_pack, - "adv_dismount", - f"{entity_type_no_prefix}_dismount", - Entity( - entity.entity_type, - entity.can_be_baby, - entity.vertical_displacement, - False, - entity.can_dismount - ), - f"\tif function gm4_reeling_rods:fishing/is_passenger run ride @s dismount", - f"# Logic for rod dismounting {entity_type_no_prefix}" - ) - else: # prepend dismounting logic to action function - actionFunc = output_pack.functions.get(f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action") - if actionFunc != None: # if existing action, prepend dismounting - actionFunc.prepend(Function([ - "# dismounting logic", - "execute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount\n\n" - ])) - else: # if no action function, make one thats just dismounting - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - "# dismounting logic", - "execute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount" - ]) + + order = 1 if entity.can_dismount else 0 # other action before or after dismounting logic + writeTo = [selectFuncSince61] if since_61 else [selectFuncBackport48] if backport_48 else [selectFuncBase, selectFuncSince61] if since_57 else [selectFuncBackport48, selectFuncBase, selectFuncSince61] + # since_61 gets since_61, since_57, else + # base gets since_57, else + # backport_48 gets backport_48, else + for write in writeTo: + command = f"execute if entity @s[type={entity.entity_type}] " + if entity.needs_enchantment: + command = command + "if data storage gm4_reeling_rods:temp enchanted " + command = command + f"run return run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action" + write[order].append(command) + finalSelectFunction(selectFuncBase, ctx.data) + finalSelectFunction(selectFuncSince61, ctx.data.overlays["since_61"]) + finalSelectFunction(selectFuncBackport48, ctx.data.overlays["backport_48"]) + + +def generated_action(output_pack: DataPack, entity: Entity): + entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') + if "minecart" in entity.entity_type: # minecart types + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", + "function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + return + if "chest" in entity.entity_type: # chest boats / raft specific + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", + "tp @s ~ -1000 ~", + "data remove storage gm4_reeling_rods:temp entity_data.UUID", + f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + ]) + return + if "_horse" in entity.entity_type: # skele and zombie horses + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", + "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", + "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" + ]) + return + if "llama" in entity.entity_type: # llama and trader_llama + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + f"# Action for reeled {entity_type_no_prefix}", + f"# @s = {entity_type_no_prefix}", + "# at @s", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", + "data modify storage gm4_reeling_rods:temp item_data set value {}", + "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", + "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", + "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", + "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", + "item replace entity @s armor.body with minecraft:air" + ]) + return From 1f0d012bfe9738aef63f52d8a41a9dac24743ed9 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 18 Mar 2025 17:22:44 +0900 Subject: [PATCH 026/101] minor text fixes --- .../function/fishing/select_type.mcfunction | 4 ---- .../gm4_reeling_rods/function/id/assign.mcfunction | 5 +++-- gm4_reeling_rods/generate_files.py | 11 ++++------- 3 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction deleted file mode 100644 index 06111a4171..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/select_type.mcfunction +++ /dev/null @@ -1,4 +0,0 @@ -# AAAAAAAAAAAAAAA -# @s = fished entity -# at @s -# run from player/find_fished_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction index 1e41074260..de205c8ecc 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction @@ -1,5 +1,6 @@ -# actually assigns entity tags -# with {AAAAAA} +# assigns @s bit tags +# @s = entity to set tags +# with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} # run from id/set $tag @s add $(bit_0) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index fec644943b..7fc32ac53b 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,5 +1,5 @@ from typing import List -from beet import Context, Advancement, Function, DataPack +from beet import Context, Advancement, Function, DataPack from beet.contrib.vanilla import Vanilla import math @@ -50,8 +50,6 @@ def beet_default(ctx: Context): Push this idea as far as I can, then reign it in. TODO: - ALL DISMOUNT - Add more mobs. Hopefully all.... Piglin, Zomb Piglin, Piglin Brute, Bogged, Skeleton, Stray, Husk, Drowned, Pillager, Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: @@ -64,17 +62,16 @@ def beet_default(ctx: Context): Player : Steal hand items? Armor? Too busted? - Multiple hitbox sizes..... - Pufferfish : - Puff up NOTE: --- NO --- Enderman: NOT FEASIBLE. Block state stored, not item data. Steal held block Could setblock with the block state, then get drop from breaking Could map block type to item, but that's far too much work and not maintainable - Pufferfish : Setting PuffState has issues. Also stupid hitbox changes size >:( + Pufferfish : Puff up a bit + ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. + Probably an MC bug Sheep : Would need a map from Color Byte to string. Annoying. Maybe revisit Shear? Wandering Trader : Doesn't hold items. Maybe revist From ec84e1efe3e719b46f65bf5d10782e13b9d8a937 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 18 Mar 2025 18:40:56 +0900 Subject: [PATCH 027/101] more fixes from the id change --- gm4_reeling_rods/generate_files.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 7fc32ac53b..c51984f9a8 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -120,6 +120,7 @@ def create_bit_advancements(ctx: Context): f"# player adv logic for getting bit {bit} at value {value}", f"# run from advancement fishing/bit_{bit}_{value}\n", f"advancement revoke @s only gm4_reeling_rods:fishing/bit_{bit}_{value}\n", + "execute if entity @s[gamemode=adventure] run return fail\n", "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", "data remove storage gm4_reeling_rods:temp enchanted", "execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted set value 1", @@ -166,10 +167,10 @@ def create_select_type(ctx: Context, entities: List[Entity]): # base gets since_57, else # backport_48 gets backport_48, else for write in writeTo: - command = f"execute if entity @s[type={entity.entity_type}] " + command = f"execute if entity @s[type={entity.entity_type}] return " if entity.needs_enchantment: - command = command + "if data storage gm4_reeling_rods:temp enchanted " - command = command + f"run return run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action" + command = command + "run execute if data storage gm4_reeling_rods:temp enchanted " + command = command + f"run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action" write[order].append(command) finalSelectFunction(selectFuncBase, ctx.data) finalSelectFunction(selectFuncSince61, ctx.data.overlays["since_61"]) From 013328e43b6c1f8d9091b5a5a5a88d847990e003 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 18 Mar 2025 19:03:36 +0900 Subject: [PATCH 028/101] Fix wrong command syntax :( --- gm4_reeling_rods/generate_files.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index c51984f9a8..f098d68b19 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -10,8 +10,12 @@ def __init__(self, entity_type: str, needs_enchantment: bool, can_dismount: bool self.can_dismount = can_dismount def beet_default(ctx: Context): - """generates the advancements, the subsequent functions for handling reeling, and set_lookup_table.mcfunction - NOTE: Only generates action functions for minecarts and chest boats. Others will have to be defined manually""" + """generates files + - set_lookup_table + - advancements and reward functions for every bit state of an entity's tagged id + - fishing/select_type and overlays + - a few action functions for specified entity types + """ create_lookup_file(ctx) create_bit_advancements(ctx) @@ -167,7 +171,7 @@ def create_select_type(ctx: Context, entities: List[Entity]): # base gets since_57, else # backport_48 gets backport_48, else for write in writeTo: - command = f"execute if entity @s[type={entity.entity_type}] return " + command = f"execute if entity @s[type={entity.entity_type}] run return " if entity.needs_enchantment: command = command + "run execute if data storage gm4_reeling_rods:temp enchanted " command = command + f"run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action" From 419ede3633b709ea37501a3d86637989cf487cc1 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 18 Mar 2025 19:27:34 +0900 Subject: [PATCH 029/101] Re-Add smithed.entity ignore --- .../function/player/find_fished_entity.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index ece82d5e7c..6cc4e590dd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -9,7 +9,7 @@ $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ at @s as @e[distance=..42, limit=1, \ tag=$(bit_0), tag=$(bit_1), tag=$(bit_2), tag=$(bit_3), tag=$(bit_4), tag=$(bit_5), tag=$(bit_6), tag=$(bit_7), \ tag=$(bit_8), tag=$(bit_9), tag=$(bit_10), tag=$(bit_11), tag=$(bit_12), tag=$(bit_13), tag=$(bit_14), tag=$(bit_15)\ - ] at @s run function gm4_reeling_rods:fishing/select_type + ] unless entity @s[tag=smithed.entity] at @s run function gm4_reeling_rods:fishing/select_type # kill marker after kill @s From 1546ed1accafb0f16ebf485037b72152c128acd0 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 18 Mar 2025 19:46:15 +0900 Subject: [PATCH 030/101] Change id tags to be removed when unneeded --- .../function/id/assign.mcfunction | 1 + .../function/id/clear.mcfunction | 37 +++++++++++++++++++ .../function/id/set.mcfunction | 35 +----------------- .../gm4_reeling_rods/function/tick.mcfunction | 4 +- 4 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction index de205c8ecc..fc2f0c5a20 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction @@ -19,3 +19,4 @@ $tag @s add $(bit_12) $tag @s add $(bit_13) $tag @s add $(bit_14) $tag @s add $(bit_15) +tag @s add gm4_reeling_rods.id.tagged diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction new file mode 100644 index 0000000000..50d3d6372c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction @@ -0,0 +1,37 @@ +# clears all id tags off of @s +# @s = entity with tag gm4_reeling_rods.id.tagged +# run from tick + +tag @s remove gm4_reeling_rods.id.0.0 +tag @s remove gm4_reeling_rods.id.1.0 +tag @s remove gm4_reeling_rods.id.2.0 +tag @s remove gm4_reeling_rods.id.3.0 +tag @s remove gm4_reeling_rods.id.4.0 +tag @s remove gm4_reeling_rods.id.5.0 +tag @s remove gm4_reeling_rods.id.6.0 +tag @s remove gm4_reeling_rods.id.7.0 +tag @s remove gm4_reeling_rods.id.8.0 +tag @s remove gm4_reeling_rods.id.9.0 +tag @s remove gm4_reeling_rods.id.10.0 +tag @s remove gm4_reeling_rods.id.11.0 +tag @s remove gm4_reeling_rods.id.12.0 +tag @s remove gm4_reeling_rods.id.13.0 +tag @s remove gm4_reeling_rods.id.14.0 +tag @s remove gm4_reeling_rods.id.15.0 +tag @s remove gm4_reeling_rods.id.0.1 +tag @s remove gm4_reeling_rods.id.1.1 +tag @s remove gm4_reeling_rods.id.2.1 +tag @s remove gm4_reeling_rods.id.3.1 +tag @s remove gm4_reeling_rods.id.4.1 +tag @s remove gm4_reeling_rods.id.5.1 +tag @s remove gm4_reeling_rods.id.6.1 +tag @s remove gm4_reeling_rods.id.7.1 +tag @s remove gm4_reeling_rods.id.8.1 +tag @s remove gm4_reeling_rods.id.9.1 +tag @s remove gm4_reeling_rods.id.10.1 +tag @s remove gm4_reeling_rods.id.11.1 +tag @s remove gm4_reeling_rods.id.12.1 +tag @s remove gm4_reeling_rods.id.13.1 +tag @s remove gm4_reeling_rods.id.14.1 +tag @s remove gm4_reeling_rods.id.15.1 +tag @s remove gm4_reeling_rods.id.tagged diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction index 297cf5821d..44f018c33d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction @@ -3,42 +3,9 @@ # at @s # run from tick +# get new id execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players set $bit gm4_reeling_rods.math 0 function gm4_reeling_rods:id/get_next with storage gm4_reeling_rods:id -# clear tags -tag @s remove gm4_reeling_rods.id.0.0 -tag @s remove gm4_reeling_rods.id.1.0 -tag @s remove gm4_reeling_rods.id.2.0 -tag @s remove gm4_reeling_rods.id.3.0 -tag @s remove gm4_reeling_rods.id.4.0 -tag @s remove gm4_reeling_rods.id.5.0 -tag @s remove gm4_reeling_rods.id.6.0 -tag @s remove gm4_reeling_rods.id.7.0 -tag @s remove gm4_reeling_rods.id.8.0 -tag @s remove gm4_reeling_rods.id.9.0 -tag @s remove gm4_reeling_rods.id.10.0 -tag @s remove gm4_reeling_rods.id.11.0 -tag @s remove gm4_reeling_rods.id.12.0 -tag @s remove gm4_reeling_rods.id.13.0 -tag @s remove gm4_reeling_rods.id.14.0 -tag @s remove gm4_reeling_rods.id.15.0 -tag @s remove gm4_reeling_rods.id.0.1 -tag @s remove gm4_reeling_rods.id.1.1 -tag @s remove gm4_reeling_rods.id.2.1 -tag @s remove gm4_reeling_rods.id.3.1 -tag @s remove gm4_reeling_rods.id.4.1 -tag @s remove gm4_reeling_rods.id.5.1 -tag @s remove gm4_reeling_rods.id.6.1 -tag @s remove gm4_reeling_rods.id.7.1 -tag @s remove gm4_reeling_rods.id.8.1 -tag @s remove gm4_reeling_rods.id.9.1 -tag @s remove gm4_reeling_rods.id.10.1 -tag @s remove gm4_reeling_rods.id.11.1 -tag @s remove gm4_reeling_rods.id.12.1 -tag @s remove gm4_reeling_rods.id.13.1 -tag @s remove gm4_reeling_rods.id.14.1 -tag @s remove gm4_reeling_rods.id.15.1 - # assign new id function gm4_reeling_rods:id/assign with storage gm4_reeling_rods:id next diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index 90e31a0aeb..7e3aa7b18c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -1,4 +1,6 @@ -# probably want to replace the type ignore tag with type supported tag thats auto generated +# reset clear all id tags +execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear +# set new id tags if needed execute as @e[type=minecraft:fishing_bobber] at @s as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set schedule function gm4_reeling_rods:tick 1t From c1a424952266a3f8ff6cda88112ac04c270837a6 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 19 Mar 2025 15:15:46 +0900 Subject: [PATCH 031/101] Vehicle separation passenger transfer --- gm4_reeling_rods/generate_files.py | 37 +++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index f098d68b19..cb618cd2df 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -188,14 +188,25 @@ def generated_action(output_pack: DataPack, entity: Entity): f"# Action for reeled {entity_type_no_prefix}", f"# @s = {entity_type_no_prefix}", "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + f"# run from gm4_reeling_rods:fishing/select_type", "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", "function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", "data remove storage gm4_reeling_rods:temp entity_data.UUID", + "data remove storage gm4_reeling_rods:temp entity_data.Passengers", "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp", + f"execute on passengers run function gm4_reeling_rods:fishing/minecart_passenger_transfer", + "tp @s ~ -1000 ~", + ]) + # technically this is generated 4 times, but its just one file, so uh idk + output_pack[f"gm4_reeling_rods:fishing/minecart_passenger_transfer"] = Function([ + "# transfer old passenger to new minecart", + f"# @s = passengers of {entity_type_no_prefix}", + f"# at old {entity_type_no_prefix}", + "# run from gm4_reeling_rods:fishing/{all_minecart}/action", + "\nride @s dismount", + "ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1]" ]) return if "chest" in entity.entity_type: # chest boats / raft specific @@ -203,18 +214,28 @@ def generated_action(output_pack: DataPack, entity: Entity): f"# Action for reeled {entity_type_no_prefix}", f"# @s = {entity_type_no_prefix}", "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", + f"# run from gm4_reeling_rods:fishing/select_type", "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", - "tp @s ~ -1000 ~", "data remove storage gm4_reeling_rods:temp entity_data.UUID", + "data remove storage gm4_reeling_rods:temp entity_data.Passengers", f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp" + "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp", + f"execute on passengers run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/passenger_transfer", + "tp @s ~ -1000 ~" + ]) + output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/passenger_transfer"] = Function([ + "# transfer old passenger to new boat", + f"# @s = passengers of {entity_type_no_prefix}", + f"# at old {entity_type_no_prefix}", + f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", + "\nride @s dismount", + f"ride @s mount @e[type={entity.entity_type.replace('_chest','')},distance=..0.00001,limit=1]" ]) return if "_horse" in entity.entity_type: # skele and zombie horses - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + output_pack[f"gm4_reeling_rods:fishing/select_type"] = Function([ f"# Action for reeled {entity_type_no_prefix}", f"# @s = {entity_type_no_prefix}", "# at @s", @@ -226,7 +247,7 @@ def generated_action(output_pack: DataPack, entity: Entity): ]) return if "llama" in entity.entity_type: # llama and trader_llama - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ + output_pack[f"gm4_reeling_rods:fishing/select_type"] = Function([ f"# Action for reeled {entity_type_no_prefix}", f"# @s = {entity_type_no_prefix}", "# at @s", From f0f3f640022eed78dcd394eead2f9d7642602bff Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 20 Mar 2025 08:06:13 +0900 Subject: [PATCH 032/101] Add live catch to recommended --- gm4_reeling_rods/beet.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index c813ac9db7..7911b62099 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -30,6 +30,7 @@ meta: description: Reel in more than just fish with these rods! Yoink the chest from the chest boat and more! recommended: - gm4_end_fishing + - gm4_live_catch notes: [] #modrinth: #project_id: From 68173db9fee182ebce4cadc0668c40b986398de2 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 24 Mar 2025 07:43:03 +0900 Subject: [PATCH 033/101] Misc comments because I need these file changes on my laptop to work on this while not at home --- .../player/find_fished_entity.mcfunction | 2 + gm4_reeling_rods/generate_files.py | 37 ++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 6cc4e590dd..934a0a8e95 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -4,6 +4,8 @@ # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} # run from gm4_reeling_rods:player/received_bit +# distance to fishing bobber is ..33 as 33 blocks is the farthest a fishing bobber can be from the caster +# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ at @s as @e[distance=..42, limit=1, \ diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index cb618cd2df..8ccef1860a 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -54,33 +54,42 @@ def beet_default(ctx: Context): Push this idea as far as I can, then reign it in. TODO: - Piglin, Zomb Piglin, Piglin Brute, Bogged, - Skeleton, Stray, Husk, Drowned, Pillager, - Vindicator, Vex, Wither Skele, Zombie, Zomb Villager: - Steal held item. No threat? Armor instead? - Balance issues per mob - Evoker : - ???? - Illusioner : - ???? - Player : - Steal hand items? - Armor? Too busted? + Hand & Armor Yoinking + Should pull a random of those that exist + + Villagers can have armor dispensed onto them, but only the head slot will render + Illager types can have armor on them through commands, but it doesn't render. Ignore armor then + + Should return success of yoinking and have select_type return if yoinked item. I think, idk, i'll figure it out later + + + Bogged, Skeleton, Stray, Wither Skele, + Husk, Drowned, Zombie, Zomb Villager, + Piglin, Zomb Piglin, Piglin Brute, PLAYER: + Random item of hand or armor + Player might need special handling + Vindicator, Vex, Pillager, Illusioner, Allay: + Random of Hands + Allay will need to be revisited NOTE: --- NO --- - Enderman: NOT FEASIBLE. Block state stored, not item data. + Enderman : Steal held block + ISSUE: Block state stored, not item data. Could setblock with the block state, then get drop from breaking Could map block type to item, but that's far too much work and not maintainable Pufferfish : Puff up a bit ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. Probably an MC bug - Sheep : Would need a map from Color Byte to string. Annoying. Maybe revisit + Sheep : Shear? + ISSUE: Would need a map from Color Byte to string. Annoying. Maybe revisit Wandering Trader : Doesn't hold items. Maybe revist Theft Trades? Steal llamas? + Evoker : + No Ideas ''' def create_lookup_file(ctx: Context): From f2014ee43965668d3fa010a86394a55237326423 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 25 Mar 2025 09:47:04 +0900 Subject: [PATCH 034/101] misc beet changes --- gm4_reeling_rods/generate_files.py | 74 ++++++++++++++++++------------ 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 8ccef1860a..b155fc5b0c 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -23,31 +23,39 @@ def beet_default(ctx: Context): vanilla.minecraft_version = '1.21.4' item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags + # Here we define all entities with a specific action, those not listed will simply dismount if possible + needsEnchant_canDismount: List[str] = [ + "minecraft:allay", "minecraft:fox", "minecraft:pig", + "minecraft:strider", "minecraft:snow_golem", "minecraft:wolf", + "minecraft:donkey", "minecraft:llama", "minecraft:trader_llama", + "minecraft:witch","minecraft:villager", "minecraft:mule", + "minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse" + ] + noEnchant_canDismount: List[str] = [ + "minecraft:shulker" + ] + needsEnchant_noDismount: List[str] = [ + "minecraft:chest_minecart", "minecraft:furnace_minecart", "minecraft:hopper_minecart", + "minecraft:tnt_minecart", "minecraft:chest_boat" + ] + for chest_boat in item_tags["minecraft:chest_boats"].data['values']: + needsEnchant_noDismount.append(chest_boat) + + noEnchant_noDismount: List[str] = [ + "minecraft:leash_knot", "minecraft:end_crystal", "minecraft:painting", + "minecraft:item_frame", "minecraft:glow_item_frame" + ] + entity_list: List[Entity] = [] - entity_list.append(Entity("minecraft:leash_knot",False,False)) - entity_list.append(Entity("minecraft:allay",True,True)) - entity_list.append(Entity("minecraft:shulker",False,True)) - entity_list.append(Entity("minecraft:end_crystal",False,False)) - entity_list.append(Entity("minecraft:fox",True,True)) - entity_list.append(Entity("minecraft:pig",True,True)) - entity_list.append(Entity("minecraft:strider",True,True)) - entity_list.append(Entity("minecraft:snow_golem",True,True)) - entity_list.append(Entity("minecraft:wolf",True,True)) - entity_list.append(Entity("minecraft:donkey",True,True)) - entity_list.append(Entity("minecraft:llama",True,True)) - entity_list.append(Entity("minecraft:trader_llama",True,True)) + for name in needsEnchant_canDismount: + entity_list.append(Entity(name,True,True)) + for name in noEnchant_canDismount: + entity_list.append(Entity(name,False,True)) + for name in needsEnchant_noDismount: + entity_list.append(Entity(name,True,False)) + for name in noEnchant_noDismount: + entity_list.append(Entity(name,False,False)) - for chest_boat in item_tags["minecraft:chest_boats"].data['values']: - entity_list.append(Entity(chest_boat,True,False)) - entity_list.append(Entity("minecraft:chest_boat",True,False)) - for minecart in ["minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:hopper_minecart","minecraft:tnt_minecart"]: - entity_list.append(Entity(minecart,True,False)) - for special_hitbox in ["minecraft:painting","minecraft:item_frame", "minecraft:glow_item_frame"]: - entity_list.append(Entity(special_hitbox,False,False)) - for villager_height in ["minecraft:witch","minecraft:villager"]: - entity_list.append(Entity(villager_height,True,True)) - for horse_height in ["minecraft:mule","minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse"]: - entity_list.append(Entity(horse_height,True,True)) create_select_type(ctx, entity_list) ''' My goal for right now is to go to the maximum scope and then have things cut back. @@ -65,12 +73,17 @@ def beet_default(ctx: Context): Bogged, Skeleton, Stray, Wither Skele, Husk, Drowned, Zombie, Zomb Villager, - Piglin, Zomb Piglin, Piglin Brute, PLAYER: + Piglin, Zomb Piglin, Piglin Brute, + Player, Villager, Allay, Witch: Random item of hand or armor Player might need special handling - Vindicator, Vex, Pillager, Illusioner, Allay: + Villager will need special handling due to consequences + Allay and Witch can't have armor, but that means it should just fail + They also need to be revisted and have the old code scrapped + Vindicator, Vex, Pillager, Illusioner: Random of Hands - Allay will need to be revisited + Can have armor with commands, but we don't want to yoink? + What if we did? Would it actually be a problem? NOTE: --- NO --- Enderman : @@ -151,17 +164,20 @@ def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): "# at @s", "# run from player/find_fished_entity\n" ] + # entities that don't dismount for line in strings[0]: finalFunction.append(line) + # dismount logic finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount\n") + # entities that do dismount, only runs if not dismounting for line in strings[1]: finalFunction.append(line) output_pack["gm4_reeling_rods:fishing/select_type"] = Function(finalFunction) def create_select_type(ctx: Context, entities: List[Entity]): - selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] - selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] - selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after dismount"]] + selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] for entity in entities: since_61 = "pale_oak" in entity.entity_type backport_48 = "minecraft:chest_boat" in entity.entity_type From 2c59b253eb6830ec362dce5e3b14ac2b10b4e236 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 14 Apr 2025 15:47:53 +0900 Subject: [PATCH 035/101] py comment restructure --- gm4_reeling_rods/generate_files.py | 73 +++++++++++++++++++----------- 1 file changed, 46 insertions(+), 27 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index b155fc5b0c..d7a774e0f7 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -10,7 +10,7 @@ def __init__(self, entity_type: str, needs_enchantment: bool, can_dismount: bool self.can_dismount = can_dismount def beet_default(ctx: Context): - """generates files + """NOTE: generates files - set_lookup_table - advancements and reward functions for every bit state of an entity's tagged id - fishing/select_type and overlays @@ -61,31 +61,52 @@ def beet_default(ctx: Context): My goal for right now is to go to the maximum scope and then have things cut back. Push this idea as far as I can, then reign it in. - TODO: - Hand & Armor Yoinking + TODO: Hand & Armor Yoinking + Treat this as an action. No entity should have an action AND have item theft + Therefore, it should take place after a failed dismount + As a consequence of no overlap, we can just return run the theft function, no need to conditional it + Should pull a random of those that exist + Use the random check order that you have in your notebook + Yoinked item height. + Previously, in manually defined yoinking, the item height was hard coded per entity + This is not easily possible with a generic item yoink + What do we do? + We could pass a value with a macro, same principal as hard coding the value, not pretty but it works + Is it possible to get the entity hitbox height? If we can then we can math out the location + Use a type tag list for which entities can have items yoinked + + + NOTE: Specific Entities + Villagers: + -{ Special Exception }- + Currently are set up as a manually defined mainhand theft with reputational harm and trade sell out + Needs to implement theft for armor as well (armor can be dispensed onto them; only head renders) + Does the armor theft cause reputational damage to player? + Illagers: + [ Vindicator, Vex, Pillager, Illusioner, Evoker? ] + Can have armor on them through commands (not dispensed), but doesn't render + Probably shouldn't theft armor that can't be applied by players, that's the realm of datapackers + Should use a special hand item theft function + Fox, Allay, Witch: + Needs to have old code scrapped + Cannot have armor (<1.21.5) + Should use a special hand item theft funciton (for clarity) + Player: + Try to implement using the generic entity item yoinking + But if there's player specific problems, just split player off into a special case + All the rest: + [ Bogged, Skeleton, Stray, Wither Skeleton ] + [ Husk, Drowned, Zombie, Zombie Villager ] + [ Piglin, Piglin Brute, Zombie Piglin ] + + Steal armor or hand item just fine + Nugget idea? + Try to use drop chances for armor and if it fails drop armor material? + What about datapack armor?... I worry about compatibility - Villagers can have armor dispensed onto them, but only the head slot will render - Illager types can have armor on them through commands, but it doesn't render. Ignore armor then - - Should return success of yoinking and have select_type return if yoinked item. I think, idk, i'll figure it out later - - - Bogged, Skeleton, Stray, Wither Skele, - Husk, Drowned, Zombie, Zomb Villager, - Piglin, Zomb Piglin, Piglin Brute, - Player, Villager, Allay, Witch: - Random item of hand or armor - Player might need special handling - Villager will need special handling due to consequences - Allay and Witch can't have armor, but that means it should just fail - They also need to be revisted and have the old code scrapped - Vindicator, Vex, Pillager, Illusioner: - Random of Hands - Can have armor with commands, but we don't want to yoink? - What if we did? Would it actually be a problem? - NOTE: --- NO --- + \\ ---[ REJECTED FOR A REASON ]--- \\ Enderman : Steal held block ISSUE: Block state stored, not item data. @@ -94,15 +115,13 @@ def beet_default(ctx: Context): Pufferfish : Puff up a bit ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. - Probably an MC bug + Probably an MC bug, should make an issue for it if it doesn't exist Sheep : Shear? - ISSUE: Would need a map from Color Byte to string. Annoying. Maybe revisit + ISSUE: Would need to map from Color Byte to string. Annoying. Maybe revisit Wandering Trader : Doesn't hold items. Maybe revist Theft Trades? Steal llamas? - Evoker : - No Ideas ''' def create_lookup_file(ctx: Context): From 1d2df27c2e523fe38ec3e74762534694e4a6cd6b Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 29 Apr 2025 11:27:50 +0900 Subject: [PATCH 036/101] Refactor in prep for generic item yoinking --- .../tags/entity_type/leashable.json | 41 ---- .../empty_container_entity.mcfunction | 2 +- .../action.mcfunction => allay.mcfunction} | 2 +- .../boat_passenger_transfer.mcfunction | 7 + .../function/fishing/chest_boat.mcfunction | 15 ++ .../action.mcfunction => donkey.mcfunction} | 2 +- .../fishing/end_crystal/action.mcfunction | 6 - .../{fox/action.mcfunction => fox.mcfunction} | 2 +- .../fishing/glow_item_frame/action.mcfunction | 10 - .../action.mcfunction => horse.mcfunction} | 2 +- .../function/fishing/is_passenger.mcfunction | 2 +- ...ction.mcfunction => item_frame.mcfunction} | 9 +- .../fishing/leash_knot/action.mcfunction | 2 +- .../function/fishing/llama.mcfunction | 12 ++ .../minecart_passenger_transfer.mcfunction | 7 + .../function/fishing/minecart_type.mcfunction | 15 ++ .../action.mcfunction => mule.mcfunction} | 2 +- .../action.mcfunction => painting.mcfunction} | 2 +- .../{pig/action.mcfunction => pig.mcfunction} | 2 +- .../fishing/shulker/action.mcfunction | 6 - ...ction.mcfunction => snow_golem.mcfunction} | 2 +- .../action.mcfunction => strider.mcfunction} | 2 +- .../function/fishing/undead_horse.mcfunction | 9 + .../fishing/villager/action.mcfunction | 2 +- .../action.mcfunction => witch.mcfunction} | 2 +- .../action.mcfunction => wolf.mcfunction} | 2 +- .../function/id/get_next.mcfunction | 1 - .../gm4_reeling_rods/function/init.mcfunction | 1 - .../function/player/add_bit.mcfunction | 2 +- .../player/find_fished_entity.mcfunction | 2 +- .../function/player/owns_bobber.mcfunction | 2 +- .../function/player/received_bit.mcfunction | 6 +- .../function/separate.mcfunction | 2 +- .../function/store_player_pos.mcfunction | 2 +- .../function/summon_entity.mcfunction | 2 +- .../gm4_reeling_rods/function/tick.mcfunction | 2 + .../tags/entity_type/leashable.json | 20 +- .../tags/entity_type/llamas.json | 6 + .../tags/entity_type/undead_horse.json | 6 + gm4_reeling_rods/entities.csv | 35 ++++ gm4_reeling_rods/generate_files.py | 186 +++--------------- .../tags/entity_type/leashable.json | 50 ----- 42 files changed, 175 insertions(+), 317 deletions(-) delete mode 100644 gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{allay/action.mcfunction => allay.mcfunction} (82%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{donkey/action.mcfunction => donkey.mcfunction} (91%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{fox/action.mcfunction => fox.mcfunction} (84%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{horse/action.mcfunction => horse.mcfunction} (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{item_frame/action.mcfunction => item_frame.mcfunction} (53%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{mule/action.mcfunction => mule.mcfunction} (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{painting/action.mcfunction => painting.mcfunction} (83%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{pig/action.mcfunction => pig.mcfunction} (86%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{snow_golem/action.mcfunction => snow_golem.mcfunction} (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{strider/action.mcfunction => strider.mcfunction} (85%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{witch/action.mcfunction => witch.mcfunction} (88%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/{wolf/action.mcfunction => wolf.mcfunction} (85%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json create mode 100644 gm4_reeling_rods/entities.csv delete mode 100644 gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json diff --git a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json deleted file mode 100644 index 4a06361e37..0000000000 --- a/gm4_reeling_rods/backport_48/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "values": [ - "minecraft:boat", - "minecraft:chest_boat", - "minecraft:skeleton_horse", - "minecraft:zombie_horse", - "minecraft:horse", - "minecraft:allay", - "minecraft:armadillo", - "minecraft:axolotl", - "minecraft:bee", - "minecraft:camel", - "minecraft:cat", - "minecraft:chicken", - "minecraft:cow", - "minecraft:dolphin", - "minecraft:donkey", - "minecraft:fox", - "minecraft:frog", - "minecraft:glow_squid", - "minecraft:goat", - "minecraft:hoglin", - "minecraft:iron_golem", - "minecraft:llama", - "minecraft:mooshroom", - "minecraft:mule", - "minecraft:ocelot", - "minecraft:parrot", - "minecraft:pig", - "minecraft:polar_bear", - "minecraft:rabbit", - "minecraft:sheep", - "minecraft:sniffer", - "minecraft:snow_golem", - "minecraft:squid", - "minecraft:strider", - "minecraft:trader_llama", - "minecraft:wolf", - "minecraft:zoglin" - ] -} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction index e4481ae697..305869ea56 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction @@ -24,7 +24,7 @@ execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0. scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.006 run \ scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math -# scale 0.01 for same magnitude as main item +# scale 0.01 for same magnitude as main item, currently 0.006 to be slower # summon item with data function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction index 568c691135..8a875c8a2d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction @@ -1,7 +1,7 @@ # Action for reeled allay # @s = allay # at @s -# run from gm4_reeling_rods:fishing/allay/adv +# run from fishing/select_type data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] data modify entity @s HandItems[0] set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction new file mode 100644 index 0000000000..4476d384ed --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction @@ -0,0 +1,7 @@ +# transfer old passenger to new boat +# @s = passengers of chest boat type +# at old chest boat type +# run from fishing/chest_boat + +ride @s dismount +ride @s mount @e[type=#gm4:boats,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction new file mode 100644 index 0000000000..dfae2182e5 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction @@ -0,0 +1,15 @@ +# Action for reeled chest_boat +# @s = chest_boat type +# at @s +# with {boat_type} +# run from fishing/select_type + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate +data remove storage gm4_reeling_rods:temp entity_data.UUID +data remove storage gm4_reeling_rods:temp entity_data.Passengers +$data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" +function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp +execute on passengers run function gm4_reeling_rods:fishing/boat_passenger_transfer +tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction index 176755d571..93684ebe6d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction @@ -1,7 +1,7 @@ # Action for reeled donkey # @s = donkey # at @s -# run from fishing/donkey/adv and fishing/donkey/adv_baby +# run from fishing/selec_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction deleted file mode 100644 index 36fa31748e..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/end_crystal/action.mcfunction +++ /dev/null @@ -1,6 +0,0 @@ -# Action for reeled end crystal -# @s = end_crystal -# at @s -# run from gm4_reeling_rods:fishing/end_crystal/adv - -damage @s 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction similarity index 84% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction index bc805900d2..42053fa770 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction @@ -1,7 +1,7 @@ # Action for reeled fox # @s = fox # at @s -# run from fishing/fox/adv and fishing/fox/adv_baby +# run from fishing/select_type data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction deleted file mode 100644 index 62fa7d6ba5..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/glow_item_frame/action.mcfunction +++ /dev/null @@ -1,10 +0,0 @@ -# Action for reeled glow item frame -# @s = glow item frame -# at @s -# run from gm4_reeling_rods:fishing/glow_item_frame/adv - -data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:glow_item_frame",count:1} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item -execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate -execute unless data entity @s Item run return run kill @s -data remove entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction index fb8a1b611e..826b39c042 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction @@ -1,7 +1,7 @@ # Action for reeled horse # @s = horse # at @s -# run from fishing/horse/adv and fishing/horse/adv_baby +# run from fishing/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction index 5a73a238b8..9a3b0fae04 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction @@ -1,6 +1,6 @@ # checks if @s is a passenger # @s = entity to check # at @s -# run from fishing/{entity_type}/action +# run from fishing/select_type return run execute on vehicle if entity @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction similarity index 53% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction index 65e1b5e8ce..b98bb43eb9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction @@ -1,9 +1,10 @@ -# Action for reeled item frame -# @s = item frame +# Action for reeled item frame or glow item frame +# @s = item frame or glow item frame # at @s -# run from gm4_reeling_rods:fishing/item_frame/adv +# with {type} +# run from fishing/select_type -data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:item_frame",count:1} +$data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate execute unless data entity @s Item run return run kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction index f9e8e13369..0475cd7220 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction @@ -1,7 +1,7 @@ # Action for reeled leash knot # @s = leash knot # at @s -# run from gm4_reeling_rods:fishing/leash_knot/adv +# run from fishing/select_type tag @s add gm4_reeling_rods.leash_knot diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction new file mode 100644 index 0000000000..0626c94267 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction @@ -0,0 +1,12 @@ +# Action for reeled llama or trader llama +# @s = llama or trader llama +# at @s +# run from fishing/select_type + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item +execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate +execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b +item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction new file mode 100644 index 0000000000..59d6f0e761 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction @@ -0,0 +1,7 @@ +# transfer old passenger to new minecart +# @s = passengers of *_minecart +# at old *_minecart +# run from fishing/minecart_type + +ride @s dismount +ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction new file mode 100644 index 0000000000..7915d21363 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction @@ -0,0 +1,15 @@ +# Action for reeled *_minecart +# @s = *_minecart +# at @s +# with {block} +# run from fishing/select_type + +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +$data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} +function gm4_reeling_rods:separate +data remove storage gm4_reeling_rods:temp entity_data.UUID +data remove storage gm4_reeling_rods:temp entity_data.Passengers +data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" +function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp +execute on passengers run function gm4_reeling_rods:fishing/minecart_passenger_transfer +tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction index b1b2a5ca7d..e8a3275ede 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction @@ -1,7 +1,7 @@ # Action for reeled mule # @s = mule # at @s -# run from fishing/mule/adv and fishing/mule/adv_baby +# run from fishing/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction similarity index 83% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction index 266b7dbfc6..0c8b078ca0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction @@ -1,7 +1,7 @@ # Action for reeled painting # @s = painting # at @s -# run from gm4_reeling_rods:fishing/painting/adv +# run from fishing/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction similarity index 86% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction index a36a8d7ff7..6e41e186ae 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction @@ -1,7 +1,7 @@ # Action for reeled pig # @s = pig # at @s -# run from fishing/pig/adv and fishing/pig/adv_baby +# run from fishing/select_type # fail if no saddle execute unless data entity @s {Saddle:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction deleted file mode 100644 index 2d7dd0e62d..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/shulker/action.mcfunction +++ /dev/null @@ -1,6 +0,0 @@ -# Action for reeled shulker -# @s = shulker -# at @s -# run from gm4_reeling_rods:fishing/shulker/adv - -execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction index 5e0dae8a66..6debadee18 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction @@ -1,7 +1,7 @@ # Action for reeled snow_golem # @s = snow_golem # at @s -# run from fishing/snow_golem/adv +# run from fishing/select_type # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction similarity index 85% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction index ed8303638c..171ca62461 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction @@ -1,7 +1,7 @@ # Action for reeled strider # @s = strider # at @s -# run from fishing/strider/adv and fishing/strider/adv_baby +# run from fishing/select_type # fail if no saddle execute unless data entity @s {Saddle:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction new file mode 100644 index 0000000000..1940948293 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction @@ -0,0 +1,9 @@ +# Action for reeled zombie horse or skele horse +# @s = zombie horse or skele horse +# at @s +# run from fishing/select_type + +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem +execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate +execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction index 171d119d14..97726700d2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction @@ -1,7 +1,7 @@ # Action for reeled villager # @s = villager # at @s -# run from gm4_reeling_rods:fishing/villager/adv +# run from fishing/select_type # fail if baby execute store result score $misc gm4_reeling_rods.math run data get entity @s Age diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction similarity index 88% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction index 89d4c89000..fc9b7f4990 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction @@ -1,7 +1,7 @@ # Action for reeled witch # @s = witch # at @s -# run from gm4_reeling_rods:fishing/witch/adv +# run from fishing/select_type # return if no item in mainhand execute unless data entity @s HandItems[0].id run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction similarity index 85% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction index caf7fbff98..7717084422 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction @@ -1,7 +1,7 @@ # Action for reeled wolf # @s = wolf # at @s -# run from fishing/wolf/adv and fishing/wolf/adv_baby +# run from fishing/select_type # fail if no Owner execute unless data entity @s Owner run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction index 6262e2e44d..b791d423d6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction @@ -10,7 +10,6 @@ $execute if data storage gm4_reeling_rods:id {next:{bit_$(bit):"gm4_reeling_rods run return run data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).1" # change bit 1 -> 0, then go on to next bit -# from here we know the bit is 1 so we don't need to check it $data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).0" execute if score $bit gm4_reeling_rods.math matches 15 run return 1 # next bit diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index d61da2adb7..44051458d7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -2,7 +2,6 @@ execute unless score reeling_rods gm4_modules matches 1 run data modify storage execute unless score reeling_rods gm4_earliest_version < reeling_rods gm4_modules run scoreboard players operation reeling_rods gm4_earliest_version = reeling_rods gm4_modules scoreboard players set reeling_rods gm4_modules 1 - scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction index 6e112d43dc..5144711455 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction @@ -2,7 +2,7 @@ # @s = marker at players feet # at @s # with {bit, bit_tag} -# run from gm4_reeling_rods:player/received_bit +# run from player/received_bit # add bit data $data modify entity @s data.gm4_reeling_rods.id.bit_$(bit) set value "$(bit_tag)" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 934a0a8e95..569e56ad15 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -2,7 +2,7 @@ # @s = marker at players feet # at @s # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} -# run from gm4_reeling_rods:player/received_bit +# run from player/add_bit # distance to fishing bobber is ..33 as 33 blocks is the farthest a fishing bobber can be from the caster # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction index 9e97065849..4e2a119250 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction @@ -1,6 +1,6 @@ # Checks if a fishing bobber belongs to the targeted owner # @s = a fishing bobber # at owner -# run from fishing/{entity}/adv +# run from player/find_fished_entity return run execute on origin if entity @s[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction index bd00510d4f..283f5984d8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -2,23 +2,21 @@ # @s = player who received a bit # at @s # with {bit, bit_tag} -# run from gm4_reeling_rods:player/bit_{bit}_{value} +# run from player/bit_{bit}_{value} # Assumptions: # bit and bit_tag are stored in storage gm4_reeling_rods:temp bit_data # this score is set to 0 after all bits received scoreboard players add @s gm4_reeling_rods.bit_count 1 -# MARKER TAG = "gm4_reeling_rods.player_marker" # if marker exists proceed to player/add_bit execute as @e[type=minecraft:marker,distance=..0.001,tag=gm4_reeling_rods.player_marker,limit=1] run \ return run function gm4_reeling_rods:player/add_bit with storage gm4_reeling_rods:temp bit_data -# this only runs if there was no marker found, so summon one +# first bit, no marker found, summon one $summon minecraft:marker ~ ~ ~ \ {\ Tags:["gm4_reeling_rods.player_marker","smithed.strict","smithed.entity"],\ data:{gm4_reeling_rods:{id:{bit_$(bit):"$(bit_tag)"}}},\ CustomName:'{"text":"gm4_reeling_rods.player_marker"}'\ } -# as it was the first bit, we don't need to do anything else here diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction index 801cf2ad0d..59584b0958 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction @@ -1,7 +1,7 @@ # Separates an entity that needs it # @s = entity to be separated # at @s -# run from fishing/{entity}/action +# run from fishing/{entity} (/action) function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction index cdbac992cb..56e5268f34 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction @@ -1,7 +1,7 @@ # stores players postion # @s = Player # at @s -# run from fishing/{entity}/adv +# run from player/bit_{bit}_{value} data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction index d53b8adb37..ea49ad2fd6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction @@ -1,5 +1,5 @@ # Summons a generic entity with data # with {entity_data} -# run from fishing/{entity}/action +# run from fishing/{entity} $summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index 7e3aa7b18c..950803fd48 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -1,6 +1,8 @@ # reset clear all id tags execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear + # set new id tags if needed +# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber execute as @e[type=minecraft:fishing_bobber] at @s as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set schedule function gm4_reeling_rods:tick 1t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json index d4a2d4449f..2649426f8b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -1,18 +1,9 @@ { "values": [ - "#minecraft:boat", - "minecraft:acacia_chest_boat", - "minecraft:oak_chest_boat", - "minecraft:cherry_chest_boat", - "minecraft:birch_chest_boat", - "minecraft:bamboo_chest_raft", - "minecraft:jungle_chest_boat", - "minecraft:spruce_chest_boat", - "minecraft:dark_oak_chest_boat", - "minecraft:mangrove_chest_boat", - "minecraft:skeleton_horse", - "minecraft:zombie_horse", - "minecraft:horse", + "#gm4:boats", + "#gm4:chest_boats", + "#gm4_reeling_rods:llamas", + "#gm4_reeling_rods:undead_horse", "minecraft:allay", "minecraft:armadillo", "minecraft:axolotl", @@ -28,8 +19,8 @@ "minecraft:glow_squid", "minecraft:goat", "minecraft:hoglin", + "minecraft:horse", "minecraft:iron_golem", - "minecraft:llama", "minecraft:mooshroom", "minecraft:mule", "minecraft:ocelot", @@ -42,7 +33,6 @@ "minecraft:snow_golem", "minecraft:squid", "minecraft:strider", - "minecraft:trader_llama", "minecraft:wolf", "minecraft:zoglin" ] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json new file mode 100644 index 0000000000..6e94bfce7d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:llama", + "minecraft:trader_llama" + ] +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json new file mode 100644 index 0000000000..ab5a10544b --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:skeleton_horse", + "minecraft:zombie_horse" + ] +} diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv new file mode 100644 index 0000000000..0419a43f9b --- /dev/null +++ b/gm4_reeling_rods/entities.csv @@ -0,0 +1,35 @@ +id,needs_enchantment,can_dismount,command +minecraft:allay,TRUE,TRUE,"run function gm4_reeling_rods:fishing/allay" +minecraft:fox,TRUE,TRUE,"run function gm4_reeling_rods:fishing/fox" +minecraft:pig,TRUE,TRUE,"run function gm4_reeling_rods:fishing/pig" +minecraft:strider,TRUE,TRUE,"run function gm4_reeling_rods:fishing/strider" +minecraft:snow_golem,TRUE,TRUE,"run function gm4_reeling_rods:fishing/snow_golem" +minecraft:wolf,TRUE,TRUE,"run function gm4_reeling_rods:fishing/wolf" +minecraft:donkey,TRUE,TRUE,"run function gm4_reeling_rods:fishing/donkey" +#gm4_reeling_rods:llamas,TRUE,TRUE,"run function gm4_reeling_rods:fishing/llama" +minecraft:witch,TRUE,TRUE,"run function gm4_reeling_rods:fishing/witch" +minecraft:villager,TRUE,TRUE,"run function gm4_reeling_rods:fishing/villager/action" +minecraft:mule,TRUE,TRUE,"run function gm4_reeling_rods:fishing/mule" +minecraft:horse,TRUE,TRUE,"run function gm4_reeling_rods:fishing/horse" +#gm4_reeling_rods:undead_horse,TRUE,TRUE,"run function gm4_reeling_rods:fishing/undead_horse" +minecraft:shulker,FALSE,TRUE,"run execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1" +minecraft:chest_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:chest'}" +minecraft:furnace_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:furnace'}" +minecraft:hopper_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:hopper'}" +minecraft:tnt_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:tnt'}" +minecraft:chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:boat'}" +minecraft:acacia_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:acacia_boat'}" +minecraft:bamboo_chest_raft,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:bamboo_raft'}" +minecraft:birch_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:birch_boat'}" +minecraft:cherry_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:cherry_boat'}" +minecraft:dark_oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:dark_oak_boat'}" +minecraft:jungle_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:jungle_boat'}" +minecraft:mangrove_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:mangrove_boat'}" +minecraft:oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:oak_boat'}" +minecraft:pale_oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:pale_oak_boat'}" +minecraft:spruce_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:spruce_boat'}" +minecraft:leash_knot,FALSE,FALSE,"run function gm4_reeling_rods:fishing/leash_knot/action" +minecraft:end_crystal,FALSE,FALSE,"run damage @s 1" +minecraft:painting,FALSE,FALSE,"run function gm4_reeling_rods:fishing/painting" +minecraft:item_frame,FALSE,FALSE,"run function gm4_reeling_rods:fishing/item_frame {type:'minecraft:item_frame'}" +minecraft:glow_item_frame,FALSE,FALSE,"run function gm4_reeling_rods:fishing/item_frame {type:'minecraft:glow_item_frame'}" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d7a774e0f7..873741d939 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,60 +1,19 @@ from typing import List from beet import Context, Advancement, Function, DataPack -from beet.contrib.vanilla import Vanilla import math - -class Entity: - def __init__(self, entity_type: str, needs_enchantment: bool, can_dismount: bool): - self.entity_type = entity_type - self.needs_enchantment = needs_enchantment - self.can_dismount = can_dismount +from pathlib import Path +from gm4.utils import CSV def beet_default(ctx: Context): """NOTE: generates files - set_lookup_table - advancements and reward functions for every bit state of an entity's tagged id - - fishing/select_type and overlays - - a few action functions for specified entity types + - fishing/select_type and overlays of it """ create_lookup_file(ctx) create_bit_advancements(ctx) - vanilla = ctx.inject(Vanilla) - vanilla.minecraft_version = '1.21.4' - item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags - - # Here we define all entities with a specific action, those not listed will simply dismount if possible - needsEnchant_canDismount: List[str] = [ - "minecraft:allay", "minecraft:fox", "minecraft:pig", - "minecraft:strider", "minecraft:snow_golem", "minecraft:wolf", - "minecraft:donkey", "minecraft:llama", "minecraft:trader_llama", - "minecraft:witch","minecraft:villager", "minecraft:mule", - "minecraft:horse", "minecraft:zombie_horse", "minecraft:skeleton_horse" - ] - noEnchant_canDismount: List[str] = [ - "minecraft:shulker" - ] - needsEnchant_noDismount: List[str] = [ - "minecraft:chest_minecart", "minecraft:furnace_minecart", "minecraft:hopper_minecart", - "minecraft:tnt_minecart", "minecraft:chest_boat" - ] - for chest_boat in item_tags["minecraft:chest_boats"].data['values']: - needsEnchant_noDismount.append(chest_boat) - - noEnchant_noDismount: List[str] = [ - "minecraft:leash_knot", "minecraft:end_crystal", "minecraft:painting", - "minecraft:item_frame", "minecraft:glow_item_frame" - ] - - entity_list: List[Entity] = [] - for name in needsEnchant_canDismount: - entity_list.append(Entity(name,True,True)) - for name in noEnchant_canDismount: - entity_list.append(Entity(name,False,True)) - for name in needsEnchant_noDismount: - entity_list.append(Entity(name,True,False)) - for name in noEnchant_noDismount: - entity_list.append(Entity(name,False,False)) + entity_list = CSV.from_file(Path('gm4_reeling_rods','entities.csv')) create_select_type(ctx, entity_list) ''' @@ -175,6 +134,30 @@ def create_bit_advancements(ctx: Context): "tag @s remove gm4_reeling_rods.player" ]) +def create_select_type(ctx: Context, entities: CSV): + selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + for entity in entities: + since_61 = "pale_oak" in entity['id'] + backport_48 = "minecraft:chest_boat" in entity['id'] + since_57 = "_chest_boat" in entity['id'] or "_chest_raft" in entity['id'] + + order = 1 if entity['can_dismount'] == "TRUE" else 0 # other action before or after dismounting logic + writeTo = [selectFuncSince61] if since_61 else [selectFuncBackport48] if backport_48 else [selectFuncBase, selectFuncSince61] if since_57 else [selectFuncBackport48, selectFuncBase, selectFuncSince61] + # since_61 gets since_61, since_57, else + # base gets since_57, else + # backport_48 gets backport_48, else + for write in writeTo: + command = f"execute if entity @s[type={entity['id']}] run return " + if entity['needs_enchantment'] == "TRUE": + command = command + "run execute if data storage gm4_reeling_rods:temp enchanted " + command = command + entity['command'] + write[order].append(command) + finalSelectFunction(selectFuncBase, ctx.data.overlays["since_57"]) # should just be ctx.data when moved to 1.21.5, these overlays are gonna be a nightmare to update.,., Figure it out later + finalSelectFunction(selectFuncSince61, ctx.data.overlays["since_61"]) + finalSelectFunction(selectFuncBackport48, ctx.data.overlays["backport_48"]) + def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): finalFunction: List[str] = [ "# GENERATED from generate_files.py", @@ -192,116 +175,3 @@ def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): for line in strings[1]: finalFunction.append(line) output_pack["gm4_reeling_rods:fishing/select_type"] = Function(finalFunction) - -def create_select_type(ctx: Context, entities: List[Entity]): - selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - for entity in entities: - since_61 = "pale_oak" in entity.entity_type - backport_48 = "minecraft:chest_boat" in entity.entity_type - since_57 = "_chest_boat" in entity.entity_type or "_chest_raft" in entity.entity_type - entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - - # generate an action if its one of those types - generated_action( - ctx.data.overlays["since_61"] if since_61 else ctx.data.overlays["backport_48"] if backport_48 else ctx.data.overlays["since_57"] if since_57 else ctx.data, - entity - ) - - order = 1 if entity.can_dismount else 0 # other action before or after dismounting logic - writeTo = [selectFuncSince61] if since_61 else [selectFuncBackport48] if backport_48 else [selectFuncBase, selectFuncSince61] if since_57 else [selectFuncBackport48, selectFuncBase, selectFuncSince61] - # since_61 gets since_61, since_57, else - # base gets since_57, else - # backport_48 gets backport_48, else - for write in writeTo: - command = f"execute if entity @s[type={entity.entity_type}] run return " - if entity.needs_enchantment: - command = command + "run execute if data storage gm4_reeling_rods:temp enchanted " - command = command + f"run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/action" - write[order].append(command) - finalSelectFunction(selectFuncBase, ctx.data) - finalSelectFunction(selectFuncSince61, ctx.data.overlays["since_61"]) - finalSelectFunction(selectFuncBackport48, ctx.data.overlays["backport_48"]) - - -def generated_action(output_pack: DataPack, entity: Entity): - entity_type_no_prefix = entity.entity_type.removeprefix('minecraft:') - if "minecart" in entity.entity_type: # minecart types - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/select_type", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"" + entity.entity_type.removesuffix('_minecart') + "\",count:1}", - "function gm4_reeling_rods:separate", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - "data remove storage gm4_reeling_rods:temp entity_data.Passengers", - "data modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp", - f"execute on passengers run function gm4_reeling_rods:fishing/minecart_passenger_transfer", - "tp @s ~ -1000 ~", - ]) - # technically this is generated 4 times, but its just one file, so uh idk - output_pack[f"gm4_reeling_rods:fishing/minecart_passenger_transfer"] = Function([ - "# transfer old passenger to new minecart", - f"# @s = passengers of {entity_type_no_prefix}", - f"# at old {entity_type_no_prefix}", - "# run from gm4_reeling_rods:fishing/{all_minecart}/action", - "\nride @s dismount", - "ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1]" - ]) - return - if "chest" in entity.entity_type: # chest boats / raft specific - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/action"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/select_type", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate", - "data remove storage gm4_reeling_rods:temp entity_data.UUID", - "data remove storage gm4_reeling_rods:temp entity_data.Passengers", - f"data modify storage gm4_reeling_rods:temp entity_type set value \"{entity.entity_type.replace('_chest','')}\"", - "function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp", - f"execute on passengers run function gm4_reeling_rods:fishing/{entity_type_no_prefix}/passenger_transfer", - "tp @s ~ -1000 ~" - ]) - output_pack[f"gm4_reeling_rods:fishing/{entity_type_no_prefix}/passenger_transfer"] = Function([ - "# transfer old passenger to new boat", - f"# @s = passengers of {entity_type_no_prefix}", - f"# at old {entity_type_no_prefix}", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/action", - "\nride @s dismount", - f"ride @s mount @e[type={entity.entity_type.replace('_chest','')},distance=..0.00001,limit=1]" - ]) - return - if "_horse" in entity.entity_type: # skele and zombie horses - output_pack[f"gm4_reeling_rods:fishing/select_type"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem", - "execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate", - "execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"minecraft:saddle\"}}} run item replace entity @s horse.saddle with minecraft:air" - ]) - return - if "llama" in entity.entity_type: # llama and trader_llama - output_pack[f"gm4_reeling_rods:fishing/select_type"] = Function([ - f"# Action for reeled {entity_type_no_prefix}", - f"# @s = {entity_type_no_prefix}", - "# at @s", - f"# run from gm4_reeling_rods:fishing/{entity_type_no_prefix}/adv", - "\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s", - "data modify storage gm4_reeling_rods:temp item_data set value {}", - "data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item", - "execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}", - "execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate", - "execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b", - "item replace entity @s armor.body with minecraft:air" - ]) - return diff --git a/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json deleted file mode 100644 index 8d73a3466c..0000000000 --- a/gm4_reeling_rods/since_61/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "values": [ - "#minecraft:boat", - "minecraft:acacia_chest_boat", - "minecraft:oak_chest_boat", - "minecraft:cherry_chest_boat", - "minecraft:birch_chest_boat", - "minecraft:bamboo_chest_raft", - "minecraft:jungle_chest_boat", - "minecraft:spruce_chest_boat", - "minecraft:dark_oak_chest_boat", - "minecraft:pale_oak_chest_boat", - "minecraft:mangrove_chest_boat", - "minecraft:skeleton_horse", - "minecraft:zombie_horse", - "minecraft:horse", - "minecraft:allay", - "minecraft:armadillo", - "minecraft:axolotl", - "minecraft:bee", - "minecraft:camel", - "minecraft:cat", - "minecraft:chicken", - "minecraft:cow", - "minecraft:dolphin", - "minecraft:donkey", - "minecraft:fox", - "minecraft:frog", - "minecraft:glow_squid", - "minecraft:goat", - "minecraft:hoglin", - "minecraft:iron_golem", - "minecraft:llama", - "minecraft:mooshroom", - "minecraft:mule", - "minecraft:ocelot", - "minecraft:parrot", - "minecraft:pig", - "minecraft:polar_bear", - "minecraft:rabbit", - "minecraft:sheep", - "minecraft:sniffer", - "minecraft:snow_golem", - "minecraft:squid", - "minecraft:strider", - "minecraft:trader_llama", - "minecraft:wolf", - "minecraft:zoglin" - ] -} From 3910c3cf009b2b67e8e07681456a13ee0df58005 Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 1 May 2025 16:15:38 +0900 Subject: [PATCH 037/101] Refactor & Add Generic Hand/Armor Yoinking --- .../chest_boat/action.mcfunction} | 4 +- .../chest_boat/passenger_transfer.mcfunction} | 2 +- .../{fishing => fished}/donkey.mcfunction | 2 +- .../{fishing => fished}/horse.mcfunction | 2 +- .../{fishing => fished}/item_frame.mcfunction | 2 +- .../fished/leash_knot/action.mcfunction | 14 ++++ .../leash_knot/change_leader.mcfunction | 2 +- .../leash_knot/leaded_by_knot.mcfunction | 2 +- .../{fishing => fished}/llama.mcfunction | 2 +- .../minecart/action.mcfunction} | 4 +- .../minecart/passenger_transfer.mcfunction} | 2 +- .../{fishing => fished}/mule.mcfunction | 2 +- .../{fishing => fished}/painting.mcfunction | 2 +- .../{fishing => fished}/pig.mcfunction | 2 +- .../{fishing => fished}/snow_golem.mcfunction | 2 +- .../stealable/order/equipment_1.mcfunction | 19 ++++++ .../stealable/order/equipment_2.mcfunction | 19 ++++++ .../stealable/order/equipment_3.mcfunction | 19 ++++++ .../stealable/order/equipment_4.mcfunction | 19 ++++++ .../stealable/order/equipment_5.mcfunction | 19 ++++++ .../stealable/order/equipment_6.mcfunction | 19 ++++++ .../fished/stealable/order/hands_1.mcfunction | 9 +++ .../fished/stealable/order/hands_2.mcfunction | 9 +++ .../stealable/steal_equipment.mcfunction | 13 ++++ .../fished/stealable/steal_hand.mcfunction | 9 +++ .../stealable/steal_slot/chest.mcfunction | 14 ++++ .../stealable/steal_slot/feet.mcfunction | 14 ++++ .../stealable/steal_slot/head.mcfunction | 14 ++++ .../stealable/steal_slot/legs.mcfunction | 14 ++++ .../stealable/steal_slot/mainhand.mcfunction | 14 ++++ .../stealable/steal_slot/offhand.mcfunction | 14 ++++ .../{fishing => fished}/strider.mcfunction | 2 +- .../undead_horse.mcfunction | 2 +- .../fished/villager/action.mcfunction | 27 ++++++++ .../villager/add_gossip.mcfunction | 2 +- .../villager/sell_out.mcfunction | 2 +- .../{fishing => fished}/wolf.mcfunction | 2 +- .../function/fishing/allay.mcfunction | 8 --- .../function/fishing/fox.mcfunction | 9 --- .../fishing/leash_knot/action.mcfunction | 13 ---- .../fishing/villager/action.mcfunction | 30 -------- .../function/fishing/witch.mcfunction | 10 --- .../{fishing => }/is_passenger.mcfunction | 2 +- .../player/find_fished_entity.mcfunction | 2 +- .../function/separate.mcfunction | 2 +- .../function/summon_entity.mcfunction | 4 +- .../tags/entity_type/ignore.json | 68 +++++++++---------- .../tags/entity_type/llamas.json | 4 +- .../tags/entity_type/steal_equipment.json | 16 +++++ .../tags/entity_type/steal_hand.json | 11 +++ gm4_reeling_rods/entities.csv | 67 +++++++++--------- gm4_reeling_rods/generate_files.py | 60 ++++++---------- 52 files changed, 421 insertions(+), 206 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing/chest_boat.mcfunction => fished/chest_boat/action.mcfunction} (83%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing/boat_passenger_transfer.mcfunction => fished/chest_boat/passenger_transfer.mcfunction} (83%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/donkey.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/horse.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/item_frame.mcfunction (93%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/leash_knot/change_leader.mcfunction (88%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/leash_knot/leaded_by_knot.mcfunction (82%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/llama.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing/minecart_type.mcfunction => fished/minecart/action.mcfunction} (82%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing/minecart_passenger_transfer.mcfunction => fished/minecart/passenger_transfer.mcfunction} (84%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/mule.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/painting.mcfunction (88%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/pig.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/snow_golem.mcfunction (91%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/strider.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/undead_horse.mcfunction (93%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/villager/add_gossip.mcfunction (96%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/villager/sell_out.mcfunction (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => fished}/wolf.mcfunction (91%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fishing => }/is_passenger.mcfunction (77%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction similarity index 83% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction index dfae2182e5..b97b489c24 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/chest_boat.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction @@ -2,7 +2,7 @@ # @s = chest_boat type # at @s # with {boat_type} -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} @@ -11,5 +11,5 @@ data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute on passengers run function gm4_reeling_rods:fishing/boat_passenger_transfer +execute on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction similarity index 83% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction index 4476d384ed..3cbec803a6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/boat_passenger_transfer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction @@ -1,7 +1,7 @@ # transfer old passenger to new boat # @s = passengers of chest boat type # at old chest boat type -# run from fishing/chest_boat +# run from fished/chest_boat/action ride @s dismount ride @s mount @e[type=#gm4:boats,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction index 93684ebe6d..63fbcd675e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/donkey.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction @@ -1,7 +1,7 @@ # Action for reeled donkey # @s = donkey # at @s -# run from fishing/selec_type +# run from fished/selec_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction index 826b39c042..927999d4e1 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction @@ -1,7 +1,7 @@ # Action for reeled horse # @s = horse # at @s -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction similarity index 93% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction index b98bb43eb9..26abbbd4f3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction @@ -2,7 +2,7 @@ # @s = item frame or glow item frame # at @s # with {type} -# run from fishing/select_type +# run from fished/select_type $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction new file mode 100644 index 0000000000..d1c0161790 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction @@ -0,0 +1,14 @@ +# Action for reeled leash knot +# @s = leash knot +# at @s +# run from fished/select_type + +tag @s add gm4_reeling_rods.leash_knot + +# distance=..10 is leash distance UNTIL 1.21.6 +execute as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ + if function gm4_reeling_rods:fished/leash_knot/leaded_by_knot \ + run function gm4_reeling_rods:fished/leash_knot/change_leader + + +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction similarity index 88% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction index 254d0ffcdb..63d0f7d782 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/change_leader.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction @@ -1,7 +1,7 @@ # Changes a leashed entities leader from a leash knot to a tagged player # @s = entity leaded to leash knot # at leash knot -# run from fishing/leash_knot/action +# run from fished/leash_knot/action data remove entity @s leash data modify entity @s leash.UUID set from entity @e[type=player,tag=gm4_reeling_rods.player,distance=..45,limit=1] UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction index efbe8444c5..c8d23ccc6b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/leaded_by_knot.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction @@ -1,6 +1,6 @@ # Checks if an entity is leashed by the knot in question # @s = a leashable entity # at owner -# run from fishing/leash_knot/action +# run from fished/leash_knot/action return run execute on leasher if entity @s[tag=gm4_reeling_rods.leash_knot] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction index 0626c94267..e877c4ab95 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction @@ -1,7 +1,7 @@ # Action for reeled llama or trader llama # @s = llama or trader llama # at @s -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction index 7915d21363..61edcc441f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_type.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction @@ -2,7 +2,7 @@ # @s = *_minecart # at @s # with {block} -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} @@ -11,5 +11,5 @@ data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute on passengers run function gm4_reeling_rods:fishing/minecart_passenger_transfer +execute on passengers run function gm4_reeling_rods:fished/minecart/passenger_transfer tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction similarity index 84% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction index 59d6f0e761..b98fc0079a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/minecart_passenger_transfer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction @@ -1,7 +1,7 @@ # transfer old passenger to new minecart # @s = passengers of *_minecart # at old *_minecart -# run from fishing/minecart_type +# run from fished/minecart/action ride @s dismount ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction index e8a3275ede..210c5ecc07 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/mule.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction @@ -1,7 +1,7 @@ # Action for reeled mule # @s = mule # at @s -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction similarity index 88% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction index 0c8b078ca0..eda6f6985d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction @@ -1,7 +1,7 @@ # Action for reeled painting # @s = painting # at @s -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction index 6e41e186ae..d4f4e1f408 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/pig.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction @@ -1,7 +1,7 @@ # Action for reeled pig # @s = pig # at @s -# run from fishing/select_type +# run from fished/select_type # fail if no saddle execute unless data entity @s {Saddle:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction index 6debadee18..98701dfb16 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction @@ -1,7 +1,7 @@ # Action for reeled snow_golem # @s = snow_golem # at @s -# run from fishing/select_type +# run from fished/select_type # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction new file mode 100644 index 0000000000..49734f8749 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction new file mode 100644 index 0000000000..ac3a7ad446 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction new file mode 100644 index 0000000000..672d93dbcf --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction new file mode 100644 index 0000000000..5c5c889b7a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction new file mode 100644 index 0000000000..0f52fa86df --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction new file mode 100644 index 0000000000..3b8ee03c6a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction @@ -0,0 +1,19 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/steal_equipment + +# 6 +execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +# 1 +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +# 3 +execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +# 5 +execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +# 2 +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +# 4 +execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction new file mode 100644 index 0000000000..7648fdaab6 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction @@ -0,0 +1,9 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_hand +# at @s +# run from fished/stealable/steal_hand + +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction new file mode 100644 index 0000000000..1cf37d796c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction @@ -0,0 +1,9 @@ +# Checks slots to steal +# @s = #gm4_reeling_rods:steal_hand +# at @s +# run from fished/stealable/steal_hand + +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction new file mode 100644 index 0000000000..5509109608 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction @@ -0,0 +1,13 @@ +# Pick an order to check equipment slots for stealing +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/select_type & fished/villager/action + +execute store result score $order gm4_reeling_rods.math run random value 1..6 + +execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:fished/stealable/order/equipment_1 +execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:fished/stealable/order/equipment_2 +execute if score $order gm4_reeling_rods.math matches 3 run return run function gm4_reeling_rods:fished/stealable/order/equipment_3 +execute if score $order gm4_reeling_rods.math matches 4 run return run function gm4_reeling_rods:fished/stealable/order/equipment_4 +execute if score $order gm4_reeling_rods.math matches 5 run return run function gm4_reeling_rods:fished/stealable/order/equipment_5 +execute if score $order gm4_reeling_rods.math matches 6 run return run function gm4_reeling_rods:fished/stealable/order/equipment_6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction new file mode 100644 index 0000000000..34e5a411fc --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction @@ -0,0 +1,9 @@ +# Pick an order to check hand slots for stealing +# @s = #gm4_reeling_rods:steal_hand +# at @s +# run from fished/select_type + +execute store result score $order gm4_reeling_rods.math run random value 1..2 + +execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:fished/stealable/order/hands_1 +execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:fished/stealable/order/hands_2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction new file mode 100644 index 0000000000..a3303ead55 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction @@ -0,0 +1,14 @@ +# Steal Chest +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/equipment_* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:102b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[2] +item replace entity @s armor.chest with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction new file mode 100644 index 0000000000..3c0c239fde --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction @@ -0,0 +1,14 @@ +# Steal Feet +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/equipment_* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:100b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[0] +item replace entity @s armor.feet with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction new file mode 100644 index 0000000000..2ae2999d60 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction @@ -0,0 +1,14 @@ +# Steal Head +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/equipment_* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:103b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[3] +item replace entity @s armor.head with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction new file mode 100644 index 0000000000..dc9a210a9d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction @@ -0,0 +1,14 @@ +# Steal Legs +# @s = #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/equipment_* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:101b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[1] +item replace entity @s armor.legs with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction new file mode 100644 index 0000000000..a8201f2a71 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction @@ -0,0 +1,14 @@ +# Steal Mainhand +# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:0b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +item replace entity @s weapon.mainhand with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction new file mode 100644 index 0000000000..d69b9e8547 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction @@ -0,0 +1,14 @@ +# Steal Offhand +# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment +# at @s +# run from fished/stealable/order/* + +data modify storage gm4_reeling_rods:temp item_data.Item set value {} +# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:-106b}] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[1] +item replace entity @s weapon.offhand with minecraft:air +data remove storage gm4_reeling_rods:temp item_data.Item.Slot +data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s +execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +return 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction index 171ca62461..8c14108abd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/strider.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction @@ -1,7 +1,7 @@ # Action for reeled strider # @s = strider # at @s -# run from fishing/select_type +# run from fished/select_type # fail if no saddle execute unless data entity @s {Saddle:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction similarity index 93% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction index 1940948293..eb52f02ea6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/undead_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction @@ -1,7 +1,7 @@ # Action for reeled zombie horse or skele horse # @s = zombie horse or skele horse # at @s -# run from fishing/select_type +# run from fished/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction new file mode 100644 index 0000000000..ebbb642a19 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction @@ -0,0 +1,27 @@ +# Action for reeled villager +# @s = villager +# at @s +# run from fished/select_type + +# store mainhand data for a potential trade steal +data modify storage gm4_reeling_rods:temp entity_data set value {} +data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s HandItems[0] + +# try to steal +execute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:fished/stealable/steal_equipment +# if not mainhand, return +execute unless score $slot gm4_reeling_rods.math matches 1 run return fail + +## mainhand stolen (TRADED ITEM) + +# find trade and sell it out +function gm4_reeling_rods:fished/villager/sell_out with storage gm4_reeling_rods:temp entity_data + +# adds 20 "major_negative" gossip of the player to the villager +data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID +function gm4_reeling_rods:fished/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip + +# angry particles +particle minecraft:angry_villager ~ ~1.5 ~ 0.3 0.3 0.3 20 3 +# angry sound +playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~1.5 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction similarity index 96% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction index e30b69c30a..7b6e1f0d03 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/add_gossip.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction @@ -2,7 +2,7 @@ # @s = villager # at @s # with {Target} -# run from fishing/villager/action +# run from fished/villager/action $execute store success score $success gm4_reeling_rods.math run \ data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction index 0e44e3e048..390fdc51d9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/sell_out.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction @@ -2,7 +2,7 @@ # @s = villager # at @s # with {mainhand} -# run from fishing/villager/action +# run from fished/villager/action # for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though $data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction index 7717084422..fce50f0808 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction @@ -1,7 +1,7 @@ # Action for reeled wolf # @s = wolf # at @s -# run from fishing/select_type +# run from fished/select_type # fail if no Owner execute unless data entity @s Owner run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction deleted file mode 100644 index 8a875c8a2d..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/allay.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Action for reeled allay -# @s = allay -# at @s -# run from fishing/select_type - -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] -data modify entity @s HandItems[0] set value {} -function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction deleted file mode 100644 index 42053fa770..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/fox.mcfunction +++ /dev/null @@ -1,9 +0,0 @@ -# Action for reeled fox -# @s = fox -# at @s -# run from fishing/select_type - -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] -data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -data modify entity @s HandItems[0] set value {} -function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction deleted file mode 100644 index 0475cd7220..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/leash_knot/action.mcfunction +++ /dev/null @@ -1,13 +0,0 @@ -# Action for reeled leash knot -# @s = leash knot -# at @s -# run from fishing/select_type - -tag @s add gm4_reeling_rods.leash_knot - -execute as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ - if function gm4_reeling_rods:fishing/leash_knot/leaded_by_knot \ - run function gm4_reeling_rods:fishing/leash_knot/change_leader - - -kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction deleted file mode 100644 index 97726700d2..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/villager/action.mcfunction +++ /dev/null @@ -1,30 +0,0 @@ -# Action for reeled villager -# @s = villager -# at @s -# run from fishing/select_type - -# fail if baby -execute store result score $misc gm4_reeling_rods.math run data get entity @s Age -execute unless score $misc gm4_reeling_rods.math matches 0.. run return fail - -# fail if not holding anything -execute unless data entity @s HandItems[0].id run return fail - -# find trade and sell it out -data modify storage gm4_reeling_rods:temp entity_data set value {} -data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s HandItems[0] -function gm4_reeling_rods:fishing/villager/sell_out with storage gm4_reeling_rods:temp entity_data - -# adds 20 "major_negative" gossip of the player to the villager -data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID -function gm4_reeling_rods:fishing/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip - -# angry particles -particle minecraft:angry_villager ~ ~1.5 ~ 0.3 0.3 0.3 20 3 -# angry sound -playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~1.5 ~ - -# pulls item -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] -data modify entity @s HandItems[0] set value {} -execute positioned ~ ~1.1 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction deleted file mode 100644 index fc9b7f4990..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/witch.mcfunction +++ /dev/null @@ -1,10 +0,0 @@ -# Action for reeled witch -# @s = witch -# at @s -# run from fishing/select_type - -# return if no item in mainhand -execute unless data entity @s HandItems[0].id run return fail -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] -data modify entity @s HandItems[0] set value {} -execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction similarity index 77% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction index 9a3b0fae04..6282558dac 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fishing/is_passenger.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction @@ -1,6 +1,6 @@ # checks if @s is a passenger # @s = entity to check # at @s -# run from fishing/select_type +# run from fished/select_type return run execute on vehicle if entity @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 569e56ad15..8f8cf3433b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -11,7 +11,7 @@ $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ at @s as @e[distance=..42, limit=1, \ tag=$(bit_0), tag=$(bit_1), tag=$(bit_2), tag=$(bit_3), tag=$(bit_4), tag=$(bit_5), tag=$(bit_6), tag=$(bit_7), \ tag=$(bit_8), tag=$(bit_9), tag=$(bit_10), tag=$(bit_11), tag=$(bit_12), tag=$(bit_13), tag=$(bit_14), tag=$(bit_15)\ - ] unless entity @s[tag=smithed.entity] at @s run function gm4_reeling_rods:fishing/select_type + ] unless entity @s[tag=smithed.entity] at @s run function gm4_reeling_rods:fished/select_type # kill marker after kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction index 59584b0958..b3f873dc2c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction @@ -1,7 +1,7 @@ # Separates an entity that needs it # @s = entity to be separated # at @s -# run from fishing/{entity} (/action) +# run from fished/* & fished/*/action & fished/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction index ea49ad2fd6..83e23266a2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction @@ -1,5 +1,5 @@ # Summons a generic entity with data -# with {entity_data} -# run from fishing/{entity} +# with {entity_type, entity_data} +# run from fished/{minecart/chest_boat}/action $summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json index 29be513500..79d0f04ca6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json @@ -1,38 +1,38 @@ { "values": [ - "minecraft:area_effect_cloud", - "minecraft:arrow", - "minecraft:block_display", - "minecraft:breeze_wind_charge", - "minecraft:command_block_minecart", - "minecraft:dragon_fireball", - "minecraft:egg", - "minecraft:ender_pearl", - "minecraft:evoker_fangs", - "minecraft:experience_bottle", - "minecraft:experience_orb", - "minecraft:eye_of_ender", - "minecraft:falling_block", - "minecraft:fireball", - "minecraft:firework_rocket", - "minecraft:fishing_bobber", - "minecraft:interaction", - "minecraft:item", - "minecraft:item_display", - "minecraft:lightning_bolt", - "minecraft:llama_spit", - "minecraft:marker", - "minecraft:ominous_item_spawner", - "minecraft:potion", - "minecraft:shulker_bullet", - "minecraft:small_fireball", - "minecraft:snowball", - "minecraft:spawner_minecart", - "minecraft:spectral_arrow", - "minecraft:text_display", - "minecraft:tnt", - "minecraft:trident", - "minecraft:wind_charge", - "minecraft:wither_skull" + "minecraft:area_effect_cloud", + "minecraft:arrow", + "minecraft:block_display", + "minecraft:breeze_wind_charge", + "minecraft:command_block_minecart", + "minecraft:dragon_fireball", + "minecraft:egg", + "minecraft:ender_pearl", + "minecraft:evoker_fangs", + "minecraft:experience_bottle", + "minecraft:experience_orb", + "minecraft:eye_of_ender", + "minecraft:falling_block", + "minecraft:fireball", + "minecraft:firework_rocket", + "minecraft:fishing_bobber", + "minecraft:interaction", + "minecraft:item", + "minecraft:item_display", + "minecraft:lightning_bolt", + "minecraft:llama_spit", + "minecraft:marker", + "minecraft:ominous_item_spawner", + "minecraft:potion", + "minecraft:shulker_bullet", + "minecraft:small_fireball", + "minecraft:snowball", + "minecraft:spawner_minecart", + "minecraft:spectral_arrow", + "minecraft:text_display", + "minecraft:tnt", + "minecraft:trident", + "minecraft:wind_charge", + "minecraft:wither_skull" ] } diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json index 6e94bfce7d..4560fcfee3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json @@ -1,6 +1,6 @@ { "values": [ - "minecraft:llama", - "minecraft:trader_llama" + "minecraft:llama", + "minecraft:trader_llama" ] } diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json new file mode 100644 index 0000000000..83ae295d49 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json @@ -0,0 +1,16 @@ +{ + "values": [ + "minecraft:bogged", + "minecraft:drowned", + "minecraft:husk", + "minecraft:piglin", + "minecraft:piglin_brute", + "minecraft:player", + "minecraft:skeleton", + "minecraft:stray", + "minecraft:wither_skeleton", + "minecraft:zombie", + "minecraft:zombie_villager", + "minecraft:zombified_piglin" + ] +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json new file mode 100644 index 0000000000..66c0801214 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json @@ -0,0 +1,11 @@ +{ + "values": [ + "minecraft:allay", + "minecraft:fox", + "minecraft:illusioner", + "minecraft:pillager", + "minecraft:vex", + "minecraft:vindicator", + "minecraft:witch" + ] +} diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 0419a43f9b..7fd852e9fb 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -1,35 +1,34 @@ id,needs_enchantment,can_dismount,command -minecraft:allay,TRUE,TRUE,"run function gm4_reeling_rods:fishing/allay" -minecraft:fox,TRUE,TRUE,"run function gm4_reeling_rods:fishing/fox" -minecraft:pig,TRUE,TRUE,"run function gm4_reeling_rods:fishing/pig" -minecraft:strider,TRUE,TRUE,"run function gm4_reeling_rods:fishing/strider" -minecraft:snow_golem,TRUE,TRUE,"run function gm4_reeling_rods:fishing/snow_golem" -minecraft:wolf,TRUE,TRUE,"run function gm4_reeling_rods:fishing/wolf" -minecraft:donkey,TRUE,TRUE,"run function gm4_reeling_rods:fishing/donkey" -#gm4_reeling_rods:llamas,TRUE,TRUE,"run function gm4_reeling_rods:fishing/llama" -minecraft:witch,TRUE,TRUE,"run function gm4_reeling_rods:fishing/witch" -minecraft:villager,TRUE,TRUE,"run function gm4_reeling_rods:fishing/villager/action" -minecraft:mule,TRUE,TRUE,"run function gm4_reeling_rods:fishing/mule" -minecraft:horse,TRUE,TRUE,"run function gm4_reeling_rods:fishing/horse" -#gm4_reeling_rods:undead_horse,TRUE,TRUE,"run function gm4_reeling_rods:fishing/undead_horse" -minecraft:shulker,FALSE,TRUE,"run execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1" -minecraft:chest_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:chest'}" -minecraft:furnace_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:furnace'}" -minecraft:hopper_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:hopper'}" -minecraft:tnt_minecart,TRUE,FALSE,"run function gm4_reeling_rods:fishing/minecart_type {block:'minecraft:tnt'}" -minecraft:chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:boat'}" -minecraft:acacia_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:acacia_boat'}" -minecraft:bamboo_chest_raft,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:bamboo_raft'}" -minecraft:birch_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:birch_boat'}" -minecraft:cherry_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:cherry_boat'}" -minecraft:dark_oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:dark_oak_boat'}" -minecraft:jungle_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:jungle_boat'}" -minecraft:mangrove_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:mangrove_boat'}" -minecraft:oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:oak_boat'}" -minecraft:pale_oak_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:pale_oak_boat'}" -minecraft:spruce_chest_boat,TRUE,FALSE,"run function gm4_reeling_rods:fishing/chest_boat {boat_type:'minecraft:spruce_boat'}" -minecraft:leash_knot,FALSE,FALSE,"run function gm4_reeling_rods:fishing/leash_knot/action" -minecraft:end_crystal,FALSE,FALSE,"run damage @s 1" -minecraft:painting,FALSE,FALSE,"run function gm4_reeling_rods:fishing/painting" -minecraft:item_frame,FALSE,FALSE,"run function gm4_reeling_rods:fishing/item_frame {type:'minecraft:item_frame'}" -minecraft:glow_item_frame,FALSE,FALSE,"run function gm4_reeling_rods:fishing/item_frame {type:'minecraft:glow_item_frame'}" +#gm4_reeling_rods:llamas,TRUE,TRUE,"function gm4_reeling_rods:fished/llama" +#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" +#gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_equipment" +#gm4_reeling_rods:undead_horse,TRUE,TRUE,"function gm4_reeling_rods:fished/undead_horse" +minecraft:donkey,TRUE,TRUE,"function gm4_reeling_rods:fished/donkey" +minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" +minecraft:mule,TRUE,TRUE,"function gm4_reeling_rods:fished/mule" +minecraft:pig,TRUE,TRUE,"function gm4_reeling_rods:fished/pig" +minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" +minecraft:strider,TRUE,TRUE,"function gm4_reeling_rods:fished/strider" +minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" +minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:fished/wolf" +minecraft:shulker,FALSE,TRUE,"execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1" +minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:chest'}" +minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:furnace'}" +minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:hopper'}" +minecraft:tnt_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:tnt'}" +minecraft:chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:boat'}" +minecraft:acacia_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:acacia_boat'}" +minecraft:bamboo_chest_raft,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" +minecraft:birch_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:birch_boat'}" +minecraft:cherry_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:cherry_boat'}" +minecraft:dark_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" +minecraft:jungle_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:jungle_boat'}" +minecraft:mangrove_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" +minecraft:oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:oak_boat'}" +minecraft:pale_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" +minecraft:spruce_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:spruce_boat'}" +minecraft:end_crystal,FALSE,FALSE,"damage @s 1" +minecraft:glow_item_frame,FALSE,FALSE,"function gm4_reeling_rods:fished/item_frame {type:'minecraft:glow_item_frame'}" +minecraft:item_frame,FALSE,FALSE,"function gm4_reeling_rods:fished/item_frame {type:'minecraft:item_frame'}" +minecraft:leash_knot,FALSE,FALSE,"function gm4_reeling_rods:fished/leash_knot/action" +minecraft:painting,FALSE,FALSE,"function gm4_reeling_rods:fished/painting" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 873741d939..d0bd4265fa 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -20,49 +20,29 @@ def beet_default(ctx: Context): My goal for right now is to go to the maximum scope and then have things cut back. Push this idea as far as I can, then reign it in. - TODO: Hand & Armor Yoinking - Treat this as an action. No entity should have an action AND have item theft - Therefore, it should take place after a failed dismount - As a consequence of no overlap, we can just return run the theft function, no need to conditional it + Hand & Armor Yoinking + Treat this as an action. If an entity is in one of the tags, don't list them separately in the csv - Should pull a random of those that exist - Use the random check order that you have in your notebook Yoinked item height. Previously, in manually defined yoinking, the item height was hard coded per entity - This is not easily possible with a generic item yoink - What do we do? - We could pass a value with a macro, same principal as hard coding the value, not pretty but it works - Is it possible to get the entity hitbox height? If we can then we can math out the location - Use a type tag list for which entities can have items yoinked + This is not possible with a generic item yoink + Right now the yoinked item is .7 block above entity origin - - NOTE: Specific Entities + Specific Entities Villagers: - -{ Special Exception }- - Currently are set up as a manually defined mainhand theft with reputational harm and trade sell out - Needs to implement theft for armor as well (armor can be dispensed onto them; only head renders) Does the armor theft cause reputational damage to player? + Currently, no. Easy to change though Illagers: - [ Vindicator, Vex, Pillager, Illusioner, Evoker? ] Can have armor on them through commands (not dispensed), but doesn't render Probably shouldn't theft armor that can't be applied by players, that's the realm of datapackers - Should use a special hand item theft function - Fox, Allay, Witch: - Needs to have old code scrapped - Cannot have armor (<1.21.5) - Should use a special hand item theft funciton (for clarity) + Using hand item theft function Player: - Try to implement using the generic entity item yoinking - But if there's player specific problems, just split player off into a special case - All the rest: - [ Bogged, Skeleton, Stray, Wither Skeleton ] - [ Husk, Drowned, Zombie, Zombie Villager ] - [ Piglin, Piglin Brute, Zombie Piglin ] - - Steal armor or hand item just fine - Nugget idea? - Try to use drop chances for armor and if it fails drop armor material? - What about datapack armor?... I worry about compatibility + Technically working for < 1.21.5, but for 1.21.5 it can be collapsed + + Nugget idea? + Try to use drop chances for armor and if it fails drop armor material? + What about datapack armor?... I worry about compatibility + Probably want to implement drop chances one way though \\ ---[ REJECTED FOR A REASON ]--- \\ @@ -105,7 +85,7 @@ def create_bit_advancements(ctx: Context): for bit in range(16): for value in range(2): # default adv - ctx.data[f"gm4_reeling_rods:fishing/bit_{bit}_{value}"] = Advancement({ + ctx.data[f"gm4_reeling_rods:fished/bit_{bit}_{value}"] = Advancement({ "criteria":{ "fishing_rod_hooked":{ "trigger":"minecraft:fishing_rod_hooked", @@ -122,8 +102,8 @@ def create_bit_advancements(ctx: Context): }) ctx.data[f"gm4_reeling_rods:player/bit_{bit}_{value}"] = Function([ f"# player adv logic for getting bit {bit} at value {value}", - f"# run from advancement fishing/bit_{bit}_{value}\n", - f"advancement revoke @s only gm4_reeling_rods:fishing/bit_{bit}_{value}\n", + f"# run from advancement fished/bit_{bit}_{value}\n", + f"advancement revoke @s only gm4_reeling_rods:fished/bit_{bit}_{value}\n", "execute if entity @s[gamemode=adventure] run return fail\n", "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", "data remove storage gm4_reeling_rods:temp enchanted", @@ -149,9 +129,9 @@ def create_select_type(ctx: Context, entities: CSV): # base gets since_57, else # backport_48 gets backport_48, else for write in writeTo: - command = f"execute if entity @s[type={entity['id']}] run return " + command = f"execute if entity @s[type={entity['id']}] run return run " if entity['needs_enchantment'] == "TRUE": - command = command + "run execute if data storage gm4_reeling_rods:temp enchanted " + command = command + "execute if data storage gm4_reeling_rods:temp enchanted run " command = command + entity['command'] write[order].append(command) finalSelectFunction(selectFuncBase, ctx.data.overlays["since_57"]) # should just be ctx.data when moved to 1.21.5, these overlays are gonna be a nightmare to update.,., Figure it out later @@ -170,8 +150,8 @@ def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): for line in strings[0]: finalFunction.append(line) # dismount logic - finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:fishing/is_passenger run return run ride @s dismount\n") + finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:is_passenger run return run ride @s dismount\n") # entities that do dismount, only runs if not dismounting for line in strings[1]: finalFunction.append(line) - output_pack["gm4_reeling_rods:fishing/select_type"] = Function(finalFunction) + output_pack["gm4_reeling_rods:fished/select_type"] = Function(finalFunction) From dab75bfbbb8e6b1881ca341d17d00ca9fa8d24c9 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 26 May 2025 19:24:54 +0900 Subject: [PATCH 038/101] Update to 1.21.5 --- gm4_reeling_rods/beet.yaml | 13 ------ .../empty_container_entity.mcfunction | 1 - .../fished/chest_boat/action.mcfunction | 6 +-- ...ey.mcfunction => chested_horse.mcfunction} | 10 ++--- .../function/fished/horse.mcfunction | 10 ++--- .../function/fished/item_frame.mcfunction | 4 +- .../fished/leash_knot/action.mcfunction | 6 +-- .../function/fished/llama.mcfunction | 6 +-- .../fished/minecart/action.mcfunction | 6 +-- .../function/fished/mule.mcfunction | 12 ------ .../function/fished/painting.mcfunction | 4 +- .../function/fished/pig.mcfunction | 11 ----- .../function/fished/snow_golem.mcfunction | 4 +- .../stealable/order/equipment_1.mcfunction | 2 +- .../stealable/order/equipment_2.mcfunction | 2 +- .../stealable/order/equipment_3.mcfunction | 2 +- .../stealable/order/equipment_4.mcfunction | 2 +- .../stealable/order/equipment_5.mcfunction | 2 +- .../stealable/order/equipment_6.mcfunction | 2 +- .../fished/stealable/order/hands_1.mcfunction | 2 +- .../fished/stealable/order/hands_2.mcfunction | 2 +- .../stealable/steal_equipment.mcfunction | 2 +- .../fished/stealable/steal_hand.mcfunction | 2 +- .../stealable/steal_slot/chest.mcfunction | 9 ++-- .../stealable/steal_slot/feet.mcfunction | 9 ++-- .../stealable/steal_slot/head.mcfunction | 9 ++-- .../stealable/steal_slot/legs.mcfunction | 9 ++-- .../stealable/steal_slot/mainhand.mcfunction | 11 +++-- .../stealable/steal_slot/offhand.mcfunction | 9 ++-- .../stealable/steal_slot/saddle.mcfunction | 9 ++++ .../function/fished/strider.mcfunction | 11 ----- .../function/fished/undead_horse.mcfunction | 9 ---- .../fished/villager/action.mcfunction | 8 ++-- .../fished/villager/add_gossip.mcfunction | 2 +- .../fished/villager/sell_out.mcfunction | 2 +- .../function/fished/wolf.mcfunction | 8 ++-- .../function/player/add_bit.mcfunction | 3 ++ .../player/find_fished_entity.mcfunction | 8 +--- .../function/player/received_bit.mcfunction | 2 +- .../tags/entity_type/chested_horse.json | 6 +++ .../{undead_horse.json => steal_saddle.json} | 2 + gm4_reeling_rods/entities.csv | 9 ++-- gm4_reeling_rods/generate_files.py | 41 ++++++------------- 43 files changed, 107 insertions(+), 182 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/fished/{donkey.mcfunction => chested_horse.mcfunction} (73%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json rename gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/{undead_horse.json => steal_saddle.json} (63%) diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index 7911b62099..92b9f78089 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -4,19 +4,6 @@ version: 1.0.X data_pack: load: . - overlays: - - formats: - min_inclusive: 61 - max_inclusive: 61 - directory: since_61 - - formats: - min_inclusive: 57 - max_inclusive: 61 - directory: since_57 - - formats: - min_inclusive: 48 - max_inclusive: 48 - directory: backport_48 pipeline: - generate_files diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction index 305869ea56..119c7a50fc 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction @@ -11,7 +11,6 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from storage gm4_reeling_rods:temp entity_data.Items[0] # randomize motion slightly.... - # this is the complicated bit execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[0] 100 execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[1] 100 execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[2] 100 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction index b97b489c24..3b1c1df807 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction @@ -1,15 +1,15 @@ # Action for reeled chest_boat # @s = chest_boat type -# at @s +# at bobber in @s # with {boat_type} # run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate +execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:separate data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer +execute at @s on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction similarity index 73% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction index 63fbcd675e..e8c23033a3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/donkey.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction @@ -1,12 +1,12 @@ # Action for reeled donkey # @s = donkey -# at @s -# run from fished/selec_type +# at bobber in @s +# run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~0.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b -item replace entity @s horse.saddle with minecraft:air +item replace entity @s saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction index 927999d4e1..3da9c7b162 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction @@ -1,11 +1,11 @@ # Action for reeled horse # @s = horse -# at @s +# at bobber in @s # run from fished/select_type data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem -execute store result score $armored gm4_reeling_rods.math if data entity @s body_armor_item run data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item -execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate -execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle +execute store result score $armored gm4_reeling_rods.math if items entity @s armor.body * run data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body +function gm4_reeling_rods:separate +execute if score $armored gm4_reeling_rods.math matches 0 run item replace entity @s saddle with minecraft:air execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction index 26abbbd4f3..45c14f9c90 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction @@ -1,11 +1,11 @@ # Action for reeled item frame or glow item frame # @s = item frame or glow item frame -# at @s +# at bobber in @s # with {type} # run from fished/select_type $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item -execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate execute unless data entity @s Item run return run kill @s data remove entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction index d1c0161790..0d16bc2f42 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction @@ -1,12 +1,12 @@ # Action for reeled leash knot # @s = leash knot -# at @s +# at bobber in @s # run from fished/select_type tag @s add gm4_reeling_rods.leash_knot -# distance=..10 is leash distance UNTIL 1.21.6 -execute as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ +# distance=..10 is leash distance (1.21.6 CHANGES TO 12) +execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ if function gm4_reeling_rods:fished/leash_knot/leaded_by_knot \ run function gm4_reeling_rods:fished/leash_knot/change_leader diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction index e877c4ab95..8764f80782 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction @@ -1,12 +1,12 @@ # Action for reeled llama or trader llama # @s = llama or trader llama -# at @s +# at bobber in @s # run from fished/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~1 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction index 61edcc441f..524eb63a3a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction @@ -1,6 +1,6 @@ # Action for reeled *_minecart # @s = *_minecart -# at @s +# at bobber in @s # with {block} # run from fished/select_type @@ -10,6 +10,6 @@ function gm4_reeling_rods:separate data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" -function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute on passengers run function gm4_reeling_rods:fished/minecart/passenger_transfer +execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp +execute at @s on passengers run function gm4_reeling_rods:fished/minecart/passenger_transfer tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction deleted file mode 100644 index 210c5ecc07..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mule.mcfunction +++ /dev/null @@ -1,12 +0,0 @@ -# Action for reeled mule -# @s = mule -# at @s -# run from fished/select_type - -data modify storage gm4_reeling_rods:temp entity_data set from entity @s -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem -execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate -execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b -item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction index eda6f6985d..11e667e8ca 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction @@ -1,8 +1,8 @@ # Action for reeled painting # @s = painting -# at @s +# at bobber in @s # run from fished/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} -execute align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction deleted file mode 100644 index d4f4e1f408..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/pig.mcfunction +++ /dev/null @@ -1,11 +0,0 @@ -# Action for reeled pig -# @s = pig -# at @s -# run from fished/select_type - -# fail if no saddle -execute unless data entity @s {Saddle:1b} run return fail - -data modify entity @s Saddle set value 0b -data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:saddle",count:1} -execute positioned ~ ~0.5 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction index 98701dfb16..5c3aaaf249 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction @@ -1,6 +1,6 @@ # Action for reeled snow_golem # @s = snow_golem -# at @s +# at bobber in @s # run from fished/select_type # fail if no Pumpkin @@ -8,4 +8,4 @@ execute unless data entity @s {Pumpkin:1b} run return fail data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} -execute positioned ~ ~1.2 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction index 49734f8749..7e34d5136d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction index ac3a7ad446..534ab10852 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction index 672d93dbcf..638a42fdc8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction index 5c5c889b7a..04b9b76616 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction index 0f52fa86df..ad1f6484ac 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction index 3b8ee03c6a..26d8783969 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/steal_equipment # 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction index 7648fdaab6..fe84d0c6cd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_hand -# at @s +# at bobber in @s # run from fished/stealable/steal_hand execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction index 1cf37d796c..498c62b036 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction @@ -1,6 +1,6 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_hand -# at @s +# at bobber in @s # run from fished/stealable/steal_hand execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction index 5509109608..317b72d931 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction @@ -1,6 +1,6 @@ # Pick an order to check equipment slots for stealing # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/select_type & fished/villager/action execute store result score $order gm4_reeling_rods.math run random value 1..6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction index 34e5a411fc..2e85b70436 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction @@ -1,6 +1,6 @@ # Pick an order to check hand slots for stealing # @s = #gm4_reeling_rods:steal_hand -# at @s +# at bobber in @s # run from fished/select_type execute store result score $order gm4_reeling_rods.math run random value 1..2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction index a3303ead55..ab0f7ac6fd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction @@ -1,14 +1,11 @@ # Steal Chest # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:102b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[2] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest item replace entity @s armor.chest with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction index 3c0c239fde..57abba5a50 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction @@ -1,14 +1,11 @@ # Steal Feet # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:100b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[0] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet item replace entity @s armor.feet with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction index 2ae2999d60..333311cff5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction @@ -1,14 +1,11 @@ # Steal Head # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:103b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[3] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head item replace entity @s armor.head with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction index dc9a210a9d..5e3bc4eea4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction @@ -1,14 +1,11 @@ # Steal Legs # @s = #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:101b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s ArmorItems[1] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs item replace entity @s armor.legs with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction index a8201f2a71..214fed65e3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction @@ -1,14 +1,13 @@ # Steal Mainhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:0b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[0] +# need SelectedItem to work with players +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand item replace entity @s weapon.mainhand with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction index d69b9e8547..d5de2732c8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction @@ -1,14 +1,11 @@ # Steal Offhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment -# at @s +# at bobber in @s # run from fished/stealable/order/* data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# NEEDS UPDATING FOR 1.21.5, USE EQUIPMENT TAG -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Inventory[{Slot:-106b}] -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s HandItems[1] +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air -data remove storage gm4_reeling_rods:temp item_data.Item.Slot data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -execute positioned ~ ~.7 ~ run function gm4_reeling_rods:separate +function gm4_reeling_rods:separate return 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction new file mode 100644 index 0000000000..64a569d4ae --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction @@ -0,0 +1,9 @@ +# Steal Saddle +# @s = #gm4_reeling_rods:steal_saddle +# at bobber in @s +# run from fished/select_type + +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle +function gm4_reeling_rods:separate +item replace entity @s saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction deleted file mode 100644 index 8c14108abd..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/strider.mcfunction +++ /dev/null @@ -1,11 +0,0 @@ -# Action for reeled strider -# @s = strider -# at @s -# run from fished/select_type - -# fail if no saddle -execute unless data entity @s {Saddle:1b} run return fail - -data modify entity @s Saddle set value 0b -data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:saddle",count:1} -execute positioned ~ ~0.75 ~ run function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction deleted file mode 100644 index eb52f02ea6..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/undead_horse.mcfunction +++ /dev/null @@ -1,9 +0,0 @@ -# Action for reeled zombie horse or skele horse -# @s = zombie horse or skele horse -# at @s -# run from fished/select_type - -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SaddleItem -execute positioned ~ ~0.8 ~ run function gm4_reeling_rods:separate -execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"minecraft:saddle"}}} run item replace entity @s horse.saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction index ebbb642a19..6735bd3a0a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction @@ -1,11 +1,11 @@ # Action for reeled villager # @s = villager -# at @s +# at bobber in @s # run from fished/select_type # store mainhand data for a potential trade steal data modify storage gm4_reeling_rods:temp entity_data set value {} -data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s HandItems[0] +data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s equipment.mainhand # try to steal execute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:fished/stealable/steal_equipment @@ -22,6 +22,6 @@ data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from ent function gm4_reeling_rods:fished/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip # angry particles -particle minecraft:angry_villager ~ ~1.5 ~ 0.3 0.3 0.3 20 3 +particle minecraft:angry_villager ~ ~ ~ 0.3 0.3 0.3 20 3 # angry sound -playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~1.5 ~ +playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction index 7b6e1f0d03..76fce999ac 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction @@ -1,6 +1,6 @@ # adds a "major_negaive" gossip of the player to the villager # @s = villager -# at @s +# at bobber in @s # with {Target} # run from fished/villager/action diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction index 390fdc51d9..67b923541f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction @@ -1,6 +1,6 @@ # sells out a trade # @s = villager -# at @s +# at bobber in @s # with {mainhand} # run from fished/villager/action diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction index fce50f0808..e192a32afb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction @@ -1,11 +1,11 @@ # Action for reeled wolf # @s = wolf -# at @s +# at bobber in @s # run from fished/select_type # fail if no Owner execute unless data entity @s Owner run return fail -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s body_armor_item -data remove entity @s body_armor_item -execute positioned ~ ~0.4 ~ run function gm4_reeling_rods:separate +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body +item replace entity @s armor.body with air +function gm4_reeling_rods:separate diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction index 5144711455..f6c4a571cd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction @@ -13,3 +13,6 @@ execute unless score @a[tag=gm4_reeling_rods.player,limit=1] gm4_reeling_rods.bi # all bits received scoreboard players set @a[tag=gm4_reeling_rods.player] gm4_reeling_rods.bit_count 0 function gm4_reeling_rods:player/find_fished_entity with entity @s data.gm4_reeling_rods.id + +# kill marker after +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 8f8cf3433b..267ea81667 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -4,14 +4,10 @@ # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} # run from player/add_bit -# distance to fishing bobber is ..33 as 33 blocks is the farthest a fishing bobber can be from the caster # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ - at @s as @e[distance=..42, limit=1, \ + at @s as @e[distance=..42, limit=1, type=!#gm4_reeling_rods:ignore, \ tag=$(bit_0), tag=$(bit_1), tag=$(bit_2), tag=$(bit_3), tag=$(bit_4), tag=$(bit_5), tag=$(bit_6), tag=$(bit_7), \ tag=$(bit_8), tag=$(bit_9), tag=$(bit_10), tag=$(bit_11), tag=$(bit_12), tag=$(bit_13), tag=$(bit_14), tag=$(bit_15)\ - ] unless entity @s[tag=smithed.entity] at @s run function gm4_reeling_rods:fished/select_type - -# kill marker after -kill @s + ] unless entity @s[tag=smithed.entity] run function gm4_reeling_rods:fished/select_type diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction index 283f5984d8..a91d7014fe 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -18,5 +18,5 @@ $summon minecraft:marker ~ ~ ~ \ {\ Tags:["gm4_reeling_rods.player_marker","smithed.strict","smithed.entity"],\ data:{gm4_reeling_rods:{id:{bit_$(bit):"$(bit_tag)"}}},\ - CustomName:'{"text":"gm4_reeling_rods.player_marker"}'\ + CustomName:{"text":"gm4_reeling_rods.player_marker"}\ } diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json new file mode 100644 index 0000000000..4cd85e4a5b --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:donkey", + "minecraft:mule" + ] +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json similarity index 63% rename from gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json rename to gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json index ab5a10544b..bd93cbf42c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/undead_horse.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json @@ -1,6 +1,8 @@ { "values": [ + "minecraft:pig", "minecraft:skeleton_horse", + "minecraft:strider", "minecraft:zombie_horse" ] } diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 7fd852e9fb..384b50c10c 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -1,14 +1,11 @@ id,needs_enchantment,can_dismount,command +#gm4_reeling_rods:chested_horse,TRUE,TRUE,"function gm4_reeling_rods:fished/chested_horse" #gm4_reeling_rods:llamas,TRUE,TRUE,"function gm4_reeling_rods:fished/llama" -#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" #gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_equipment" -#gm4_reeling_rods:undead_horse,TRUE,TRUE,"function gm4_reeling_rods:fished/undead_horse" -minecraft:donkey,TRUE,TRUE,"function gm4_reeling_rods:fished/donkey" +#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" +#gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_slot/saddle" minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" -minecraft:mule,TRUE,TRUE,"function gm4_reeling_rods:fished/mule" -minecraft:pig,TRUE,TRUE,"function gm4_reeling_rods:fished/pig" minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" -minecraft:strider,TRUE,TRUE,"function gm4_reeling_rods:fished/strider" minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:fished/wolf" minecraft:shulker,FALSE,TRUE,"execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d0bd4265fa..d7f76f2dda 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,5 +1,5 @@ from typing import List -from beet import Context, Advancement, Function, DataPack +from beet import Context, Advancement, Function import math from pathlib import Path from gm4.utils import CSV @@ -115,43 +115,28 @@ def create_bit_advancements(ctx: Context): ]) def create_select_type(ctx: Context, entities: CSV): - selectFuncBase: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - selectFuncSince61: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - selectFuncBackport48: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] + commandOrder: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] for entity in entities: - since_61 = "pale_oak" in entity['id'] - backport_48 = "minecraft:chest_boat" in entity['id'] - since_57 = "_chest_boat" in entity['id'] or "_chest_raft" in entity['id'] - - order = 1 if entity['can_dismount'] == "TRUE" else 0 # other action before or after dismounting logic - writeTo = [selectFuncSince61] if since_61 else [selectFuncBackport48] if backport_48 else [selectFuncBase, selectFuncSince61] if since_57 else [selectFuncBackport48, selectFuncBase, selectFuncSince61] - # since_61 gets since_61, since_57, else - # base gets since_57, else - # backport_48 gets backport_48, else - for write in writeTo: - command = f"execute if entity @s[type={entity['id']}] run return run " - if entity['needs_enchantment'] == "TRUE": - command = command + "execute if data storage gm4_reeling_rods:temp enchanted run " - command = command + entity['command'] - write[order].append(command) - finalSelectFunction(selectFuncBase, ctx.data.overlays["since_57"]) # should just be ctx.data when moved to 1.21.5, these overlays are gonna be a nightmare to update.,., Figure it out later - finalSelectFunction(selectFuncSince61, ctx.data.overlays["since_61"]) - finalSelectFunction(selectFuncBackport48, ctx.data.overlays["backport_48"]) - -def finalSelectFunction(strings: List[List[str]], output_pack: DataPack): + order = 1 if entity['can_dismount'] == "TRUE" else 0 + command = f"execute if entity @s[type={entity['id']}] run return run " + if entity['needs_enchantment'] == "TRUE": + command = command + "execute if data storage gm4_reeling_rods:temp enchanted run " + command = command + entity['command'] + commandOrder[order].append(command) + finalFunction: List[str] = [ "# GENERATED from generate_files.py", "# Selects the right entity type or dismounts the entity", "# @s = fished entity", - "# at @s", + "# at bobber in entity", "# run from player/find_fished_entity\n" ] # entities that don't dismount - for line in strings[0]: + for line in commandOrder[0]: finalFunction.append(line) # dismount logic finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:is_passenger run return run ride @s dismount\n") # entities that do dismount, only runs if not dismounting - for line in strings[1]: + for line in commandOrder[1]: finalFunction.append(line) - output_pack["gm4_reeling_rods:fished/select_type"] = Function(finalFunction) + ctx.data["gm4_reeling_rods:fished/select_type"] = Function(finalFunction) From f2243f0a2f7a2529da3417ceba1b0ce8cd6f6cc2 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 04:47:24 +0900 Subject: [PATCH 039/101] Some comment changes --- gm4_reeling_rods/generate_files.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d7f76f2dda..c3f19f8a59 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -8,7 +8,7 @@ def beet_default(ctx: Context): """NOTE: generates files - set_lookup_table - advancements and reward functions for every bit state of an entity's tagged id - - fishing/select_type and overlays of it + - fishing/select_type """ create_lookup_file(ctx) create_bit_advancements(ctx) @@ -21,12 +21,7 @@ def beet_default(ctx: Context): Push this idea as far as I can, then reign it in. Hand & Armor Yoinking - Treat this as an action. If an entity is in one of the tags, don't list them separately in the csv - - Yoinked item height. - Previously, in manually defined yoinking, the item height was hard coded per entity - This is not possible with a generic item yoink - Right now the yoinked item is .7 block above entity origin + Treated as an action. If an entity is in one of the tags, don't list them separately in the csv Specific Entities Villagers: @@ -36,8 +31,6 @@ def beet_default(ctx: Context): Can have armor on them through commands (not dispensed), but doesn't render Probably shouldn't theft armor that can't be applied by players, that's the realm of datapackers Using hand item theft function - Player: - Technically working for < 1.21.5, but for 1.21.5 it can be collapsed Nugget idea? Try to use drop chances for armor and if it fails drop armor material? @@ -84,7 +77,6 @@ def create_lookup_file(ctx: Context): def create_bit_advancements(ctx: Context): for bit in range(16): for value in range(2): - # default adv ctx.data[f"gm4_reeling_rods:fished/bit_{bit}_{value}"] = Advancement({ "criteria":{ "fishing_rod_hooked":{ From d2a9cb18a42b3593d73d04ef5dc803e1732aefe0 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 05:03:19 +0900 Subject: [PATCH 040/101] Missed changes for 1.21.5 --- .../data/gm4_reeling_rods/tags/entity_type/ignore.json | 3 ++- .../data/gm4_reeling_rods/tags/entity_type/leashable.json | 4 +--- gm4_reeling_rods/entities.csv | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json index 79d0f04ca6..dbb3066de7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json @@ -20,10 +20,11 @@ "minecraft:item", "minecraft:item_display", "minecraft:lightning_bolt", + "minecraft:lingering_potion", "minecraft:llama_spit", "minecraft:marker", "minecraft:ominous_item_spawner", - "minecraft:potion", + "minecraft:splash_potion", "minecraft:shulker_bullet", "minecraft:small_fireball", "minecraft:snowball", diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json index 2649426f8b..c82c3002cb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -3,7 +3,7 @@ "#gm4:boats", "#gm4:chest_boats", "#gm4_reeling_rods:llamas", - "#gm4_reeling_rods:undead_horse", + "#gm4_reeling_rods:steal_saddle", "minecraft:allay", "minecraft:armadillo", "minecraft:axolotl", @@ -25,14 +25,12 @@ "minecraft:mule", "minecraft:ocelot", "minecraft:parrot", - "minecraft:pig", "minecraft:polar_bear", "minecraft:rabbit", "minecraft:sheep", "minecraft:sniffer", "minecraft:snow_golem", "minecraft:squid", - "minecraft:strider", "minecraft:wolf", "minecraft:zoglin" ] diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 384b50c10c..48cb4cf5fb 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -13,7 +13,6 @@ minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/a minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:furnace'}" minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:hopper'}" minecraft:tnt_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:tnt'}" -minecraft:chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:boat'}" minecraft:acacia_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:acacia_boat'}" minecraft:bamboo_chest_raft,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" minecraft:birch_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:birch_boat'}" From d53ceeebb4a7ba4f2b025737cf142fabd7ad995b Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 05:46:23 +0900 Subject: [PATCH 041/101] Fix shulker teleporting --- gm4_reeling_rods/entities.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 48cb4cf5fb..04bebae4b6 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -8,7 +8,7 @@ minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:fished/wolf" -minecraft:shulker,FALSE,TRUE,"execute facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes run tp @s ^ ^ ^1" +minecraft:shulker,FALSE,TRUE,"execute at @s facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1" minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:chest'}" minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:furnace'}" minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:hopper'}" From 6e6f754487f1cbb1382ab22578d1389048e64dd6 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 08:43:08 +0900 Subject: [PATCH 042/101] Fix chest boat yoinking --- .../function/fished/chest_boat/action.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction index 3b1c1df807..708a65d44b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction @@ -10,6 +10,6 @@ execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:separate data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" -function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp +execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp execute at @s on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer tp @s ~ -1000 ~ From dd864662eceec68f51002d5ca86fb288b49c4096 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 10:00:58 +0900 Subject: [PATCH 043/101] Rename function for clarity --- .../function/empty_container_entity.mcfunction | 2 +- .../function/fished/chest_boat/action.mcfunction | 2 +- .../gm4_reeling_rods/function/fished/chested_horse.mcfunction | 2 +- .../data/gm4_reeling_rods/function/fished/horse.mcfunction | 2 +- .../gm4_reeling_rods/function/fished/item_frame.mcfunction | 2 +- .../data/gm4_reeling_rods/function/fished/llama.mcfunction | 2 +- .../function/fished/minecart/action.mcfunction | 2 +- .../data/gm4_reeling_rods/function/fished/painting.mcfunction | 2 +- .../gm4_reeling_rods/function/fished/snow_golem.mcfunction | 2 +- .../function/fished/stealable/steal_slot/chest.mcfunction | 2 +- .../function/fished/stealable/steal_slot/feet.mcfunction | 2 +- .../function/fished/stealable/steal_slot/head.mcfunction | 2 +- .../function/fished/stealable/steal_slot/legs.mcfunction | 2 +- .../function/fished/stealable/steal_slot/mainhand.mcfunction | 2 +- .../function/fished/stealable/steal_slot/offhand.mcfunction | 2 +- .../function/fished/stealable/steal_slot/saddle.mcfunction | 2 +- .../data/gm4_reeling_rods/function/fished/wolf.mcfunction | 2 +- .../gm4_reeling_rods/function/get_motion_to_player.mcfunction | 2 +- .../function/{separate.mcfunction => pull_items.mcfunction} | 4 ++-- .../data/gm4_reeling_rods/function/summon_item.mcfunction | 2 +- gm4_reeling_rods/generate_files.py | 4 ---- 21 files changed, 21 insertions(+), 25 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{separate.mcfunction => pull_items.mcfunction} (87%) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction index 119c7a50fc..46adc389b8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction @@ -1,7 +1,7 @@ # Loops through Items[] and creates an item entity for each item, setting a slightly random motion # @s = entity with an Items[] tag # at @s -# run from separate +# run from pull_items # Assumptions # storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction index 708a65d44b..55a6393797 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction @@ -6,7 +6,7 @@ data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:separate +execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction index e8c23033a3..e2c41ebd2a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction @@ -7,6 +7,6 @@ data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b item replace entity @s saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction index 3da9c7b162..ca83444c4a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction @@ -6,6 +6,6 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle execute store result score $armored gm4_reeling_rods.math if items entity @s armor.body * run data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items execute if score $armored gm4_reeling_rods.math matches 0 run item replace entity @s saddle with minecraft:air execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction index 45c14f9c90..77540979d2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction @@ -6,6 +6,6 @@ $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item -execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items execute unless data entity @s Item run return run kill @s data remove entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction index 8764f80782..7b505feb79 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction @@ -7,6 +7,6 @@ data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction index 524eb63a3a..93695d9686 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction @@ -6,7 +6,7 @@ data modify storage gm4_reeling_rods:temp entity_data set from entity @s $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction index 11e667e8ca..c94cbf3427 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction @@ -4,5 +4,5 @@ # run from fished/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} -execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:separate +execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction index 5c3aaaf249..d3499ed95f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction @@ -8,4 +8,4 @@ execute unless data entity @s {Pumpkin:1b} run return fail data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction index ab0f7ac6fd..493e7aeee7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction @@ -7,5 +7,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest item replace entity @s armor.chest with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction index 57abba5a50..1027391d4d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction @@ -7,5 +7,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet item replace entity @s armor.feet with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction index 333311cff5..587318c5d6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction @@ -7,5 +7,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head item replace entity @s armor.head with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction index 5e3bc4eea4..d461633b26 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction @@ -7,5 +7,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs item replace entity @s armor.legs with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction index 214fed65e3..be7e737526 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction @@ -9,5 +9,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Sele data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand item replace entity @s weapon.mainhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction index d5de2732c8..cfa01388f8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction @@ -7,5 +7,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items return 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction index 64a569d4ae..c3c10e58c4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction @@ -5,5 +5,5 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items item replace entity @s saddle with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction index e192a32afb..e46771946e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction @@ -8,4 +8,4 @@ execute unless data entity @s Owner run return fail data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body item replace entity @s armor.body with air -function gm4_reeling_rods:separate +function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 833856cc8f..9fa9183796 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -1,5 +1,5 @@ # Gets motion vector to launch item to player -# run from separate +# run from pull_items data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction similarity index 87% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction index b3f873dc2c..0808709205 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/separate.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction @@ -1,13 +1,13 @@ # Separates an entity that needs it -# @s = entity to be separated +# @s = entity with items to be yoinked # at @s # run from fished/* & fished/*/action & fished/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp -# return if no items execute unless data entity @s Items[] run return 0 +# Entities with Items tag data modify storage gm4_reeling_rods:temp motion_vector set from storage gm4_reeling_rods:temp entity_data.Motion function gm4_reeling_rods:empty_container_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction index cf8001d5b6..091e2dd2a7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction @@ -1,4 +1,4 @@ # Summons item with data -# run from separate and empty_container_entity +# run from pull_items and empty_container_entity $summon minecraft:item ~ ~ ~ $(item_data) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index c3f19f8a59..9e1edd7b4c 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -37,7 +37,6 @@ def beet_default(ctx: Context): What about datapack armor?... I worry about compatibility Probably want to implement drop chances one way though - \\ ---[ REJECTED FOR A REASON ]--- \\ Enderman : Steal held block @@ -48,9 +47,6 @@ def beet_default(ctx: Context): Puff up a bit ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. Probably an MC bug, should make an issue for it if it doesn't exist - Sheep : - Shear? - ISSUE: Would need to map from Color Byte to string. Annoying. Maybe revisit Wandering Trader : Doesn't hold items. Maybe revist Theft Trades? Steal llamas? From 3897558c3e754dc160429475f1971ee420b35cb7 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 27 May 2025 10:01:12 +0900 Subject: [PATCH 044/101] Add Sheep shearing yoinking --- .../function/fished/sheep.mcfunction | 27 +++++++++++++++++++ gm4_reeling_rods/entities.csv | 1 + 2 files changed, 28 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction new file mode 100644 index 0000000000..6650472ca0 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction @@ -0,0 +1,27 @@ +# Action for reeled sheep +# @s = sheep +# at bobber in @s +# run from fished/select_type + +execute if data entity @s {Sheared:1} run return fail + +data modify entity @s Sheared set value true + +execute if data entity @s {Color:0} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:white_wool",count:1} +execute if data entity @s {Color:1} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:orange_wool",count:1} +execute if data entity @s {Color:2} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:magenta_wool",count:1} +execute if data entity @s {Color:3} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:light_blue_wool",count:1} +execute if data entity @s {Color:4} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:yellow_wool",count:1} +execute if data entity @s {Color:5} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:lime_wool",count:1} +execute if data entity @s {Color:6} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:pink_wool",count:1} +execute if data entity @s {Color:7} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:gray_wool",count:1} +execute if data entity @s {Color:8} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:light_gray_wool",count:1} +execute if data entity @s {Color:9} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:cyan_wool",count:1} +execute if data entity @s {Color:10} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:purple_wool",count:1} +execute if data entity @s {Color:11} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:blue_wool",count:1} +execute if data entity @s {Color:12} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:brown_wool",count:1} +execute if data entity @s {Color:13} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:green_wool",count:1} +execute if data entity @s {Color:14} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:red_wool",count:1} +execute if data entity @s {Color:15} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:black_wool",count:1} + +function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 04bebae4b6..a8c991bd57 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -5,6 +5,7 @@ id,needs_enchantment,can_dismount,command #gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_slot/saddle" minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" +minecraft:sheep,TRUE,TRUE,"function gm4_reeling_rods:fished/sheep" minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:fished/wolf" From 7070c5aa2619fed7cb76f808bc321f8def5a7a2c Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 28 May 2025 00:09:03 +0900 Subject: [PATCH 045/101] Fix sheep wool yoinking I was rushing before --- .../function/fished/sheep.mcfunction | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction index 6650472ca0..f9b5707772 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction @@ -7,21 +7,21 @@ execute if data entity @s {Sheared:1} run return fail data modify entity @s Sheared set value true -execute if data entity @s {Color:0} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:white_wool",count:1} -execute if data entity @s {Color:1} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:orange_wool",count:1} -execute if data entity @s {Color:2} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:magenta_wool",count:1} -execute if data entity @s {Color:3} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:light_blue_wool",count:1} -execute if data entity @s {Color:4} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:yellow_wool",count:1} -execute if data entity @s {Color:5} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:lime_wool",count:1} -execute if data entity @s {Color:6} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:pink_wool",count:1} -execute if data entity @s {Color:7} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:gray_wool",count:1} -execute if data entity @s {Color:8} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:light_gray_wool",count:1} -execute if data entity @s {Color:9} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:cyan_wool",count:1} -execute if data entity @s {Color:10} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:purple_wool",count:1} -execute if data entity @s {Color:11} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:blue_wool",count:1} -execute if data entity @s {Color:12} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:brown_wool",count:1} -execute if data entity @s {Color:13} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:green_wool",count:1} -execute if data entity @s {Color:14} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:red_wool",count:1} -execute if data entity @s {Color:15} run data modify storage gm4_reeling_rods:temp item_data set value {id:"minecraft:black_wool",count:1} +execute if data entity @s {Color:0b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:white_wool",count:1} +execute if data entity @s {Color:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:orange_wool",count:1} +execute if data entity @s {Color:2b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:magenta_wool",count:1} +execute if data entity @s {Color:3b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:light_blue_wool",count:1} +execute if data entity @s {Color:4b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:yellow_wool",count:1} +execute if data entity @s {Color:5b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:lime_wool",count:1} +execute if data entity @s {Color:6b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:pink_wool",count:1} +execute if data entity @s {Color:7b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:gray_wool",count:1} +execute if data entity @s {Color:8b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:light_gray_wool",count:1} +execute if data entity @s {Color:9b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:cyan_wool",count:1} +execute if data entity @s {Color:10b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:purple_wool",count:1} +execute if data entity @s {Color:11b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:blue_wool",count:1} +execute if data entity @s {Color:12b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:brown_wool",count:1} +execute if data entity @s {Color:13b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:green_wool",count:1} +execute if data entity @s {Color:14b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:red_wool",count:1} +execute if data entity @s {Color:15b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:black_wool",count:1} function gm4_reeling_rods:pull_items From 6705fbdbc2ccb7a272063cf3e4d999ad406260b3 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 3 Jun 2025 16:48:36 +0900 Subject: [PATCH 046/101] Fixes (hopefully) --- .../function/fished/horse.mcfunction | 3 ++- .../gm4_reeling_rods/function/init.mcfunction | 3 +-- .../function/player/add_bit.mcfunction | 18 ------------- .../player/find_fished_entity.mcfunction | 6 ++--- .../function/player/received_bit.mcfunction | 25 ++++++++----------- .../store_pos.mcfunction} | 0 .../gm4_reeling_rods/function/tick.mcfunction | 3 ++- gm4_reeling_rods/generate_files.py | 5 ++-- 8 files changed, 21 insertions(+), 42 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/{store_player_pos.mcfunction => player/store_pos.mcfunction} (100%) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction index ca83444c4a..97121f790a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction @@ -5,7 +5,8 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle -execute store result score $armored gm4_reeling_rods.math if items entity @s armor.body * run data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body +execute store result score $armored gm4_reeling_rods.math if items entity @s armor.body * function gm4_reeling_rods:pull_items execute if score $armored gm4_reeling_rods.math matches 0 run item replace entity @s saddle with minecraft:air execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 44051458d7..b6420409e9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -5,9 +5,8 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" -scoreboard objectives add gm4_reeling_rods.bit_count dummy "gm4_reeling_rods bit count" # set_lookup_table generated in generate_files.py function gm4_reeling_rods:set_lookup_table -schedule function gm4_reeling_rods:tick 1t +schedule function gm4_reeling_rods:tick 5t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction deleted file mode 100644 index f6c4a571cd..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/add_bit.mcfunction +++ /dev/null @@ -1,18 +0,0 @@ -# Adds a bit value to the marker at players location and continues -# @s = marker at players feet -# at @s -# with {bit, bit_tag} -# run from player/received_bit - -# add bit data -$data modify entity @s data.gm4_reeling_rods.id.bit_$(bit) set value "$(bit_tag)" - -# fail if not all bits -execute unless score @a[tag=gm4_reeling_rods.player,limit=1] gm4_reeling_rods.bit_count matches 16 run return fail - -# all bits received -scoreboard players set @a[tag=gm4_reeling_rods.player] gm4_reeling_rods.bit_count 0 -function gm4_reeling_rods:player/find_fished_entity with entity @s data.gm4_reeling_rods.id - -# kill marker after -kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 267ea81667..7d97085225 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -1,8 +1,8 @@ -# Finds entity the player fished -# @s = marker at players feet +# Finds the entity the player fished +# @s = player who fished # at @s # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} -# run from player/add_bit +# run from player/received_bit # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction index a91d7014fe..fac36d8a3c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -1,22 +1,17 @@ # Logic for when a player receives a bit # @s = player who received a bit # at @s -# with {bit, bit_tag} +# with {bit, UUID} # run from player/bit_{bit}_{value} -# Assumptions: - # bit and bit_tag are stored in storage gm4_reeling_rods:temp bit_data - # this score is set to 0 after all bits received -scoreboard players add @s gm4_reeling_rods.bit_count 1 +$data modify storage gm4_reeling_rods:players "$(UUID)".bit_$(bit) set from storage gm4_reeling_rods:temp bit_data.bit_tag -# if marker exists proceed to player/add_bit -execute as @e[type=minecraft:marker,distance=..0.001,tag=gm4_reeling_rods.player_marker,limit=1] run \ - return run function gm4_reeling_rods:player/add_bit with storage gm4_reeling_rods:temp bit_data +# fail if not all bits +$execute store result score $bit_count gm4_reeling_rods.math run data get storage gm4_reeling_rods:players "$(UUID)" +execute unless score $bit_count gm4_reeling_rods.math matches 16 run return fail -# first bit, no marker found, summon one -$summon minecraft:marker ~ ~ ~ \ - {\ - Tags:["gm4_reeling_rods.player_marker","smithed.strict","smithed.entity"],\ - data:{gm4_reeling_rods:{id:{bit_$(bit):"$(bit_tag)"}}},\ - CustomName:{"text":"gm4_reeling_rods.player_marker"}\ - } +# all bits received +$function gm4_reeling_rods:player/find_fished_entity with storage gm4_reeling_rods:players "$(UUID)" + +# clear storage +$data remove storage gm4_reeling_rods:players "$(UUID)" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction similarity index 100% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/store_player_pos.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index 950803fd48..fa1aaa4bf8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -5,4 +5,5 @@ execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/c # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber execute as @e[type=minecraft:fishing_bobber] at @s as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set -schedule function gm4_reeling_rods:tick 1t +# 5 ticks is good enough response time +schedule function gm4_reeling_rods:tick 5t diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 9e1edd7b4c..4d2582a253 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -8,7 +8,7 @@ def beet_default(ctx: Context): """NOTE: generates files - set_lookup_table - advancements and reward functions for every bit state of an entity's tagged id - - fishing/select_type + - fished/select_type """ create_lookup_file(ctx) create_bit_advancements(ctx) @@ -94,9 +94,10 @@ def create_bit_advancements(ctx: Context): f"advancement revoke @s only gm4_reeling_rods:fished/bit_{bit}_{value}\n", "execute if entity @s[gamemode=adventure] run return fail\n", "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", + "data modify storage gm4_reeling_rods:temp bit_data.UUID set from entity @s UUID", "data remove storage gm4_reeling_rods:temp enchanted", "execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted set value 1", - "function gm4_reeling_rods:store_player_pos", + "function gm4_reeling_rods:player/store_pos", "tag @s add gm4_reeling_rods.player", "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", "tag @s remove gm4_reeling_rods.player" From 1f75214c70489c12a72a51c14b97e80a540ac0d3 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 3 Jun 2025 17:41:14 +0900 Subject: [PATCH 047/101] Add Binding blocking for equipment theft --- .../fished/stealable/order/equipment_1.mcfunction | 12 ++++++++---- .../fished/stealable/order/equipment_2.mcfunction | 12 ++++++++---- .../fished/stealable/order/equipment_3.mcfunction | 12 ++++++++---- .../fished/stealable/order/equipment_4.mcfunction | 12 ++++++++---- .../fished/stealable/order/equipment_5.mcfunction | 12 ++++++++---- .../fished/stealable/order/equipment_6.mcfunction | 12 ++++++++---- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction index 7e34d5136d..06a58548bb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction @@ -6,14 +6,18 @@ # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction index 534ab10852..ffd205171c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction @@ -6,14 +6,18 @@ # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction index 638a42fdc8..6d1cda57b4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction @@ -4,15 +4,19 @@ # run from fished/stealable/steal_equipment # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction index 04b9b76616..6047318da9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction @@ -4,15 +4,19 @@ # run from fished/stealable/steal_equipment # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction index ad1f6484ac..246b79f7f8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction @@ -4,16 +4,20 @@ # run from fished/stealable/steal_equipment # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction index 26d8783969..3a37173fa6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction @@ -4,16 +4,20 @@ # run from fished/stealable/steal_equipment # 6 -execute if items entity @s armor.feet * run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet +execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand # 3 -execute if items entity @s armor.head * run return run function gm4_reeling_rods:fished/stealable/steal_slot/head +execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/head # 5 -execute if items entity @s armor.legs * run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs +execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand # 4 -execute if items entity @s armor.chest * run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest +execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ + run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest return fail From 2e75cfa8e4f26cd2e03d2552162c229e426dfc1c Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 01:27:28 +0900 Subject: [PATCH 048/101] Add Entities - Wandering Trader: Steal Hands - Armor Stand: Steal Equipment - Camel: Steal Saddle - Mooshroom: Shear and steal shrooms - Bee: Steal honey comb and suffer the consequences --- .../function/fished/bee.mcfunction | 13 +++++++++++ .../fished/mooshroom/action.mcfunction | 22 +++++++++++++++++++ .../mooshroom/passenger_transfer.mcfunction | 7 ++++++ .../tags/entity_type/steal_equipment.json | 1 + .../tags/entity_type/steal_hand.json | 1 + .../tags/entity_type/steal_saddle.json | 9 ++++---- gm4_reeling_rods/entities.csv | 2 ++ gm4_reeling_rods/generate_files.py | 3 --- 8 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction new file mode 100644 index 0000000000..ff9a67be0d --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction @@ -0,0 +1,13 @@ +# Action for reeled bee +# @s = bee +# at bobber in @s +# run from fished/select_type + +# fail if no nectar +execute unless data entity @s {HasNectar:1b} run return fail + +# Steal +data merge entity @s {HasNectar:0b,AngerTime:500} +data modify entity @s AngryAt set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} +function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction new file mode 100644 index 0000000000..a2035c13db --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction @@ -0,0 +1,22 @@ +# Action for reeled mooshroom +# @s = mooshroom +# at bobber in @s +# run from fished/select_type + +# set item id to correct mushroom type +execute if data entity @s {Type:"red"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:red_mushroom" +execute if data entity @s {Type:"brown"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:brown_mushroom" +# set item count to 5 +data modify storage gm4_reeling_rods:temp item_data.Item.count set value 5 +# yoink +function gm4_reeling_rods:pull_items + +# replace with cow +data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data remove storage gm4_reeling_rods:temp entity_data.UUID +data remove storage gm4_reeling_rods:temp entity_data.Passengers +data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:cow" +execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp +execute at @s on passengers run function gm4_reeling_rods:fished/mooshroom/passenger_transfer + +tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction new file mode 100644 index 0000000000..6b232e3410 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction @@ -0,0 +1,7 @@ +# transfer old passenger to new cow +# @s = passengers of mooshroom +# at old mooshroom +# run from fished/mooshroom/action + +ride @s dismount +ride @s mount @e[type=minecraft:cow,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json index 83ae295d49..4744b7d6be 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json @@ -1,5 +1,6 @@ { "values": [ + "minecraft:armor_stand", "minecraft:bogged", "minecraft:drowned", "minecraft:husk", diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json index 66c0801214..76c8c7602e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json @@ -6,6 +6,7 @@ "minecraft:pillager", "minecraft:vex", "minecraft:vindicator", + "minecraft:wandering_trader", "minecraft:witch" ] } diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json index bd93cbf42c..aef60be58a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json @@ -1,8 +1,9 @@ { "values": [ - "minecraft:pig", - "minecraft:skeleton_horse", - "minecraft:strider", - "minecraft:zombie_horse" + "minecraft:camel", + "minecraft:pig", + "minecraft:skeleton_horse", + "minecraft:strider", + "minecraft:zombie_horse" ] } diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index a8c991bd57..ec7c03742d 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -4,7 +4,9 @@ id,needs_enchantment,can_dismount,command #gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_equipment" #gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_slot/saddle" +minecraft:bee,TRUE,TRUE,"function gm4_reeling_rods:fished/bee" minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" +minecraft:mooshroom,TRUE,TRUE,"function gm4_reeling_rods:fished/mooshroom/action" minecraft:sheep,TRUE,TRUE,"function gm4_reeling_rods:fished/sheep" minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 4d2582a253..828a9c6f57 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -47,9 +47,6 @@ def beet_default(ctx: Context): Puff up a bit ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. Probably an MC bug, should make an issue for it if it doesn't exist - Wandering Trader : Doesn't hold items. Maybe revist - Theft Trades? - Steal llamas? ''' def create_lookup_file(ctx: Context): From 897c8f0bd2f8b54c96388569cc70126f3d899c3c Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 02:30:45 +0900 Subject: [PATCH 049/101] Optimize bobber id setting --- .../data/gm4_reeling_rods/function/id/loop.mcfunction | 4 ++++ .../function/id/select_entities.mcfunction | 11 +++++++++++ .../data/gm4_reeling_rods/function/init.mcfunction | 1 + .../function/player/cast_line.mcfunction | 8 ++++++++ .../data/gm4_reeling_rods/function/tick.mcfunction | 4 +--- 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction new file mode 100644 index 0000000000..f4538a1887 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction @@ -0,0 +1,4 @@ +# checks for bobbers and stops when there are none +# run from player/cast_line & id/select_entities + +execute as @e[type=minecraft:fishing_bobber] at @s run function gm4_reeling_rods:id/select_entities diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction new file mode 100644 index 0000000000..ac0fd41533 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction @@ -0,0 +1,11 @@ +# selects entities to assign an id and schedules the loop to run again +# @s = fishing_bobber +# at @s +# run from id/loop + +# set new id tags if needed +# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber +execute as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set + +# schedule again, since bobber still exists +schedule function gm4_reeling_rods:id/loop 5t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index b6420409e9..12306cf526 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -5,6 +5,7 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" +scoreboard objectives add gm4_reeling_rods.rods_cast minecraft.used:minecraft.fishing_rod "gm4_reeling rods cast" # set_lookup_table generated in generate_files.py function gm4_reeling_rods:set_lookup_table diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction new file mode 100644 index 0000000000..f55a08b1d6 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction @@ -0,0 +1,8 @@ +# sets rods_cast to 0 and schedules id loop +# @s = player, scores={gm4_reeling_rods.rods_cast=1..} +# at @s +# run from tick + +scoreboard players set @s gm4_reeling_rods.rods_cast 0 + +schedule function gm4_reeling_rods:id/loop 1t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index fa1aaa4bf8..c324d21ccb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -1,9 +1,7 @@ # reset clear all id tags execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear -# set new id tags if needed -# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber -execute as @e[type=minecraft:fishing_bobber] at @s as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set +execute as @a[scores={gm4_reeling_rods.rods_cast=1..}] at @s run function gm4_reeling_rods:player/cast_line # 5 ticks is good enough response time schedule function gm4_reeling_rods:tick 5t From f0214d8c9fa09049c5a70821c12c444c735c6ad4 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 02:33:33 +0900 Subject: [PATCH 050/101] single comment change because nobody can stop me --- .../data/gm4_reeling_rods/function/id/loop.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction index f4538a1887..a277363e09 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction @@ -1,4 +1,4 @@ # checks for bobbers and stops when there are none -# run from player/cast_line & id/select_entities +# scheduled from player/cast_line & id/select_entities execute as @e[type=minecraft:fishing_bobber] at @s run function gm4_reeling_rods:id/select_entities From 96e120901f879ad72c49468fe9710134b48c0747 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 11:40:19 +0900 Subject: [PATCH 051/101] Fix my id changes & add sounds :D --- .../data/gm4_reeling_rods/function/fished/bee.mcfunction | 2 ++ .../function/fished/chest_boat/action.mcfunction | 2 ++ .../function/fished/chested_horse.mcfunction | 7 +++++-- .../data/gm4_reeling_rods/function/fished/horse.mcfunction | 3 +++ .../gm4_reeling_rods/function/fished/item_frame.mcfunction | 5 +++++ .../function/fished/leash_knot/action.mcfunction | 2 ++ .../data/gm4_reeling_rods/function/fished/llama.mcfunction | 2 ++ .../function/fished/minecart/action.mcfunction | 2 ++ .../function/fished/mooshroom/action.mcfunction | 4 ++++ .../gm4_reeling_rods/function/fished/painting.mcfunction | 2 ++ .../data/gm4_reeling_rods/function/fished/sheep.mcfunction | 2 ++ .../gm4_reeling_rods/function/fished/snow_golem.mcfunction | 2 ++ .../function/fished/stealable/steal_slot/chest.mcfunction | 1 + .../function/fished/stealable/steal_slot/feet.mcfunction | 1 + .../function/fished/stealable/steal_slot/head.mcfunction | 1 + .../function/fished/stealable/steal_slot/legs.mcfunction | 1 + .../fished/stealable/steal_slot/mainhand.mcfunction | 1 + .../fished/stealable/steal_slot/offhand.mcfunction | 1 + .../function/fished/stealable/steal_slot/saddle.mcfunction | 5 +++++ .../data/gm4_reeling_rods/function/fished/wolf.mcfunction | 5 ++++- .../data/gm4_reeling_rods/function/id/loop.mcfunction | 6 +++++- .../function/id/select_entities.mcfunction | 2 +- .../gm4_reeling_rods/function/player/cast_line.mcfunction | 2 +- .../data/gm4_reeling_rods/function/tick.mcfunction | 4 +--- 24 files changed, 56 insertions(+), 9 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction index ff9a67be0d..cd014f18a0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction @@ -11,3 +11,5 @@ data merge entity @s {HasNectar:0b,AngerTime:500} data modify entity @s AngryAt set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} function gm4_reeling_rods:pull_items + +playsound entity.bee.hurt neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction index 55a6393797..06f9ddcca2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction @@ -13,3 +13,5 @@ $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp execute at @s on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer tp @s ~ -1000 ~ + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction index e2c41ebd2a..6166ecb0a0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction @@ -1,5 +1,5 @@ -# Action for reeled donkey -# @s = donkey +# Action for reeled #gm4_reeling_rods:chested_horse +# @s = #gm4_reeling_rods:chested_horse # at bobber in @s # run from fished/select_type @@ -10,3 +10,6 @@ execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_ function gm4_reeling_rods:pull_items execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b item replace entity @s saddle with minecraft:air + +execute if data storage gm4_reeling_rods:temp item_data.Item run \ + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction index 97121f790a..f59c8bc772 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction @@ -10,3 +10,6 @@ execute store result score $armored gm4_reeling_rods.math if items entity @s arm function gm4_reeling_rods:pull_items execute if score $armored gm4_reeling_rods.math matches 0 run item replace entity @s saddle with minecraft:air execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air + +execute if data storage gm4_reeling_rods:temp item_data.Item run \ + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction index 77540979d2..4f19a9da83 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction @@ -9,3 +9,8 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items execute unless data entity @s Item run return run kill @s data remove entity @s Item + +execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"$(type)"}}} \ + run return run playsound minecraft:entity.item_frame.break neutral @a[distance=..16] ~ ~ ~ + +playsound minecraft:entity.item_frame.remove_item neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction index 0d16bc2f42..1f4321e3b3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction @@ -12,3 +12,5 @@ execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ kill @s + +execute at @a[tag=gm4_reeling_rods.player,limit=1,distance=..50] run playsound minecraft:entity.leash_knot.place neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction index 7b505feb79..e8d351f0e5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction @@ -8,5 +8,7 @@ data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} function gm4_reeling_rods:pull_items +execute if data storage gm4_reeling_rods:temp item_data.Item run \ + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b item replace entity @s armor.body with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction index 93695d9686..b4626eebe2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction @@ -13,3 +13,5 @@ data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minec execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp execute at @s on passengers run function gm4_reeling_rods:fished/minecart/passenger_transfer tp @s ~ -1000 ~ + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction index a2035c13db..820a5c3bbd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction @@ -3,6 +3,8 @@ # at bobber in @s # run from fished/select_type +# fail if baby +execute unless data entity @s {Age:0} run return fail # set item id to correct mushroom type execute if data entity @s {Type:"red"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:red_mushroom" execute if data entity @s {Type:"brown"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:brown_mushroom" @@ -20,3 +22,5 @@ execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeli execute at @s on passengers run function gm4_reeling_rods:fished/mooshroom/passenger_transfer tp @s ~ -1000 ~ + +playsound entity.mooshroom.shear neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction index c94cbf3427..09ed0a9379 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction @@ -6,3 +6,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items kill @s + +playsound minecraft:entity.painting.break neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction index f9b5707772..69a3b48410 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction @@ -25,3 +25,5 @@ execute if data entity @s {Color:14b} run data modify storage gm4_reeling_rods:t execute if data entity @s {Color:15b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:black_wool",count:1} function gm4_reeling_rods:pull_items + +playsound minecraft:entity.sheep.shear neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction index d3499ed95f..c58b1466e2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction @@ -9,3 +9,5 @@ execute unless data entity @s {Pumpkin:1b} run return fail data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} function gm4_reeling_rods:pull_items + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction index 493e7aeee7..4ec5d24396 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction @@ -8,4 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s armor.chest with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction index 1027391d4d..72b9ea1b1b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction @@ -8,4 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s armor.feet with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction index 587318c5d6..9379cdb3d0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction @@ -8,4 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s armor.head with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction index d461633b26..e4426af741 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction @@ -8,4 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s armor.legs with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction index be7e737526..f37fb2a617 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction @@ -10,4 +10,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s weapon.mainhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction index cfa01388f8..28f7de3b1b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction @@ -8,4 +8,5 @@ data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equi item replace entity @s weapon.offhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction index c3c10e58c4..f7735cf843 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction @@ -3,7 +3,12 @@ # at bobber in @s # run from fished/select_type +# fail if no saddle +execute unless data entity @s equipment.saddle run return fail +# yoink data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle function gm4_reeling_rods:pull_items item replace entity @s saddle with minecraft:air + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction index e46771946e..7aefb557b4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction @@ -3,9 +3,12 @@ # at bobber in @s # run from fished/select_type -# fail if no Owner +# fail if no Owner and if no armor execute unless data entity @s Owner run return fail +execute unless data entity @s equipment.body run return fail data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body item replace entity @s armor.body with air function gm4_reeling_rods:pull_items + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction index a277363e09..b287c26da0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction @@ -1,4 +1,8 @@ # checks for bobbers and stops when there are none -# scheduled from player/cast_line & id/select_entities +# run from player/cast_line \ + & scheduled id/select_entities +# clear ids for new assignment +execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear +# assign new ids if there's a bobber execute as @e[type=minecraft:fishing_bobber] at @s run function gm4_reeling_rods:id/select_entities diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction index ac0fd41533..f93484ea5c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction @@ -8,4 +8,4 @@ execute as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set # schedule again, since bobber still exists -schedule function gm4_reeling_rods:id/loop 5t +schedule function gm4_reeling_rods:id/loop 2t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction index f55a08b1d6..879eb641b7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction @@ -5,4 +5,4 @@ scoreboard players set @s gm4_reeling_rods.rods_cast 0 -schedule function gm4_reeling_rods:id/loop 1t +function gm4_reeling_rods:id/loop diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index c324d21ccb..bc976ad19c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -1,6 +1,4 @@ -# reset clear all id tags -execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear - +# checks if players have cast a line, then will assign ids to entities around bobber execute as @a[scores={gm4_reeling_rods.rods_cast=1..}] at @s run function gm4_reeling_rods:player/cast_line # 5 ticks is good enough response time From cbd7dae87370b3847126c9cc1592857d16c263d1 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 11:49:30 +0900 Subject: [PATCH 052/101] Change some player selectors to `@p` --- .../function/fished/leash_knot/action.mcfunction | 2 +- .../function/fished/leash_knot/change_leader.mcfunction | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction index 1f4321e3b3..c8724472c3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction @@ -13,4 +13,4 @@ execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ kill @s -execute at @a[tag=gm4_reeling_rods.player,limit=1,distance=..50] run playsound minecraft:entity.leash_knot.place neutral @a[distance=..16] ~ ~ ~ +execute at @p[tag=gm4_reeling_rods.player] run playsound minecraft:entity.leash_knot.place neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction index 63d0f7d782..d8c636f7aa 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction @@ -4,4 +4,4 @@ # run from fished/leash_knot/action data remove entity @s leash -data modify entity @s leash.UUID set from entity @e[type=player,tag=gm4_reeling_rods.player,distance=..45,limit=1] UUID +data modify entity @s leash.UUID set from entity @p[tag=gm4_reeling_rods.player] UUID From 4b300db268cf8ee03b0cd666f341cf86187475d3 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 12:55:48 +0900 Subject: [PATCH 053/101] Change a few more player selectors to @p --- .../data/gm4_reeling_rods/function/fished/bee.mcfunction | 2 +- .../gm4_reeling_rods/function/fished/villager/action.mcfunction | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction index cd014f18a0..f682bb32b9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction @@ -8,7 +8,7 @@ execute unless data entity @s {HasNectar:1b} run return fail # Steal data merge entity @s {HasNectar:0b,AngerTime:500} -data modify entity @s AngryAt set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID +data modify entity @s AngryAt set from entity @p[tag=gm4_reeling_rods.player] UUID data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction index 6735bd3a0a..c27198142b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction @@ -18,7 +18,7 @@ execute unless score $slot gm4_reeling_rods.math matches 1 run return fail function gm4_reeling_rods:fished/villager/sell_out with storage gm4_reeling_rods:temp entity_data # adds 20 "major_negative" gossip of the player to the villager -data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @a[tag=gm4_reeling_rods.player,limit=1,distance=..33] UUID +data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @p[tag=gm4_reeling_rods.player] UUID function gm4_reeling_rods:fished/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip # angry particles From 2808e2ee96f1ad78bc0880b7a49a5b1e3d45db49 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 7 Jun 2025 12:56:20 +0900 Subject: [PATCH 054/101] Shorten bee anger time --- .../data/gm4_reeling_rods/function/fished/bee.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction index f682bb32b9..a9ba29734d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction @@ -7,7 +7,7 @@ execute unless data entity @s {HasNectar:1b} run return fail # Steal -data merge entity @s {HasNectar:0b,AngerTime:500} +data merge entity @s {HasNectar:0b,AngerTime:300} data modify entity @s AngryAt set from entity @p[tag=gm4_reeling_rods.player] UUID data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} function gm4_reeling_rods:pull_items From 39827519e328ba6865cab66bfadbfd741cb27a74 Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 12:15:29 +0200 Subject: [PATCH 055/101] Add Barbed Enchantment (#2) * Add Barbed Enchantment * Fix formatting * Update apply_barbed_damage header * Add missing comma * Remove extra line * Update non_treasure.json to include barbed Needed for it to show up in enchanting table * Fix barbed damage not running * Increase Barbed Damage * Adjust Enchantment Cost --------- Co-authored-by: runcows <124551271+runcows@users.noreply.github.com> --- gm4/utils.py | 340 ++++++++++-------- .../gm4_reeling_rods/enchantment/barbed.json | 22 ++ .../fished/apply_barbed_damage.mcfunction | 7 + .../player/find_fished_entity.mcfunction | 13 + .../function/player/store_pos.mcfunction | 9 - .../predicate/holding_barbed_rod/level_1.json | 18 + .../predicate/holding_barbed_rod/level_2.json | 18 + .../predicate/holding_barbed_rod/level_3.json | 18 + .../predicate/holding_barbed_rod/level_4.json | 18 + .../predicate/holding_barbed_rod/level_5.json | 18 + .../tags/enchantment/non_treasure.json | 3 +- gm4_reeling_rods/generate_files.py | 58 +-- 12 files changed, 349 insertions(+), 193 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json diff --git a/gm4/utils.py b/gm4/utils.py index b25526c47b..8b0c9ac0cd 100644 --- a/gm4/utils.py +++ b/gm4/utils.py @@ -27,177 +27,177 @@ def run(cmd: list[str]|str) -> str: - """Run a shell command and return the stdout.""" - return subprocess.run(cmd, capture_output=True, encoding="utf8", shell=isinstance(cmd, str)).stdout.strip() + """Run a shell command and return the stdout.""" + return subprocess.run(cmd, capture_output=True, encoding="utf8", shell=isinstance(cmd, str)).stdout.strip() def X_int(val: str) -> int | None: - """Int casting that accepts character 'X' and returns None""" - return None if val.lower() == 'x' else int(val) + """Int casting that accepts character 'X' and returns None""" + return None if val.lower() == 'x' else int(val) def add_namespace(val: str, namespace: str) -> str: - """Adds a namsepace prefix to a string, if one does not already exist""" - if ":" not in val: - return f"{namespace}:{val}" - return val + """Adds a namsepace prefix to a string, if one does not already exist""" + if ":" not in val: + return f"{namespace}:{val}" + return val @dataclass @total_ordering class Version(): - """Class with methods useful for semver versions in the gm4 build pipeline""" - major: int|None - minor: int|None - patch: int|None - - def __init__(self, input: str): - self.major, self.minor, self.patch = map(X_int, input.split(".")) - - def __str__(self): - if type(None) in map(type, [self.major, self.minor, self.patch]): - warnings.warn(f"Version number was printed to string when one or more fields are not set") - return f"{self.major}.{self.minor}.{self.patch}" - - def int_rep(self) -> int: - """returns integer representation of version, for use in datapack scoreboards""" - if type(None) in map(type, [self.major, self.minor, self.patch]): - raise TypeError(f"Version number cannot be converted to integer when one or more fields are not set") - return 100_000*self.major + 1_000*self.minor + self.patch # type: ignore - - def __eq__(self, other: object) -> bool: - if other is None: - return False - elif isinstance(other, Version): - return self.major==other.major and self.minor==other.minor and self.patch==other.patch - raise TypeError - - def __lt__(self, other: object) -> bool: - if isinstance(other, Version): - if self.major is None or self.minor is None or self.patch is None \ - or other.major is None or other.minor is None or other.patch is None: - raise TypeError(f"Version numbers cannot be compared when one or more fields are not set") - if self.major < other.major: - return True - elif self.major == other.major: - if self.minor < other.minor: - return True - elif self.minor == other.minor: - if self.patch < other.patch: - return True - return False - raise TypeError - - def replace(self, **changes: Any): - params = asdict(self) | changes - params = {k:(v if v is not None else 'X') for k,v in params.items()} - return Version(f"{params['major']}.{params['minor']}.{params['patch']}") - + """Class with methods useful for semver versions in the gm4 build pipeline""" + major: int|None + minor: int|None + patch: int|None + + def __init__(self, input: str): + self.major, self.minor, self.patch = map(X_int, input.split(".")) + + def __str__(self): + if type(None) in map(type, [self.major, self.minor, self.patch]): + warnings.warn(f"Version number was printed to string when one or more fields are not set") + return f"{self.major}.{self.minor}.{self.patch}" + + def int_rep(self) -> int: + """returns integer representation of version, for use in datapack scoreboards""" + if type(None) in map(type, [self.major, self.minor, self.patch]): + raise TypeError(f"Version number cannot be converted to integer when one or more fields are not set") + return 100_000*self.major + 1_000*self.minor + self.patch # type: ignore + + def __eq__(self, other: object) -> bool: + if other is None: + return False + elif isinstance(other, Version): + return self.major==other.major and self.minor==other.minor and self.patch==other.patch + raise TypeError + + def __lt__(self, other: object) -> bool: + if isinstance(other, Version): + if self.major is None or self.minor is None or self.patch is None \ + or other.major is None or other.minor is None or other.patch is None: + raise TypeError(f"Version numbers cannot be compared when one or more fields are not set") + if self.major < other.major: + return True + elif self.major == other.major: + if self.minor < other.minor: + return True + elif self.minor == other.minor: + if self.patch < other.patch: + return True + return False + raise TypeError + + def replace(self, **changes: Any): + params = asdict(self) | changes + params = {k:(v if v is not None else 'X') for k,v in params.items()} + return Version(f"{params['major']}.{params['minor']}.{params['patch']}") + def nested_get(d: dict[str, Any], key: str) -> list[Any]: - """Recursively traverses a string-keyed dict (like minecraft json files) for the specified key, returning all that exist - returns empty list and throws no errors if key does not exist""" - ret_list: list[Any] = [] - for k, v in d.items(): - if k == key: - ret_list.append(d[k]) - elif isinstance(v, dict): - ret_list.extend(nested_get(d[k], key)) - elif isinstance(v, list): - for elem in d[k]: - if isinstance(elem, dict): - ret_list.extend(nested_get(elem, key)) #type: ignore ; NBT is hard to type due to its nested nature - return ret_list + """Recursively traverses a string-keyed dict (like minecraft json files) for the specified key, returning all that exist + returns empty list and throws no errors if key does not exist""" + ret_list: list[Any] = [] + for k, v in d.items(): + if k == key: + ret_list.append(d[k]) + elif isinstance(v, dict): + ret_list.extend(nested_get(d[k], key)) + elif isinstance(v, list): + for elem in d[k]: + if isinstance(elem, dict): + ret_list.extend(nested_get(elem, key)) #type: ignore ; NBT is hard to type due to its nested nature + return ret_list class NoneAttribute(): - """Object which returns None for any arbitrary attribute access. Used for default members""" - def __getattribute__(self, __name: str) -> None: - return None + """Object which returns None for any arbitrary attribute access. Used for default members""" + def __getattribute__(self, __name: str) -> None: + return None class MapOption(GenericModel, Generic[T]): - """A union-like type of dict and list, supporting common methods for both - - Written for use in resource_pack plugin's texture lists""" - __root__: list[T]|dict[str,T] = [] - - def entries(self) -> list[T]: - if isinstance(self.__root__, list): - return self.__root__ - return list(self.__root__.values()) - - def __getitem__(self, key: str|int) -> T: - if isinstance(key, int): - return self.entries()[key] - if isinstance(self.__root__, list): - raise KeyError(f"MapOption has no mapping data keys. Could not retrieve {key}") - return self.__root__[key] - - def items(self): - if isinstance(self.__root__, dict): - return self.__root__.items() - raise KeyError("MapOption has no mapping data keys. Can not retrieve items()") - - @validator("__root__", pre=True) # type: ignore ; v1 validator behaves strangely with type checking - def validate_root(cls, value: list[T]|dict[str,T]|T) -> list[T]|dict[str,T]: - if value is None: - value = [] - elif isinstance(value, ListOption): - value = value.entries() - if not isinstance(value, (list, tuple, dict)): # single element - value = [value] - return value # type: ignore + """A union-like type of dict and list, supporting common methods for both + - Written for use in resource_pack plugin's texture lists""" + __root__: list[T]|dict[str,T] = [] + + def entries(self) -> list[T]: + if isinstance(self.__root__, list): + return self.__root__ + return list(self.__root__.values()) + + def __getitem__(self, key: str|int) -> T: + if isinstance(key, int): + return self.entries()[key] + if isinstance(self.__root__, list): + raise KeyError(f"MapOption has no mapping data keys. Could not retrieve {key}") + return self.__root__[key] + + def items(self): + if isinstance(self.__root__, dict): + return self.__root__.items() + raise KeyError("MapOption has no mapping data keys. Can not retrieve items()") + + @validator("__root__", pre=True) # type: ignore ; v1 validator behaves strangely with type checking + def validate_root(cls, value: list[T]|dict[str,T]|T) -> list[T]|dict[str,T]: + if value is None: + value = [] + elif isinstance(value, ListOption): + value = value.entries() + if not isinstance(value, (list, tuple, dict)): # single element + value = [value] + return value # type: ignore # TODO 1.20.5: might not need this anymore class InvokeOnJsonNbt: - """Extendable mixin to run MutatingReducer's rules on nbt within advancements, loot_tables ect...""" - def __init__(self, ctx: Context): - self.ctx = ctx - raise RuntimeError("InvokeOnJsonNbt should not be directly instantiated. It is a mixin for MutatingReducers and should be interited instead") - - @contextmanager - def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: - """Class is mixed into MutatingReducer, who does have this method. Passed here for type completion""" - raise NotImplementedError() - - def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: - """Class is mixed into MutatingReducer, who does have this method. Passed here for type completion""" - raise NotImplementedError() - - - @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='nbt')) - @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='tag')) - def process_nbt_in_json(self, node: AstJsonObjectEntry): - mc = self.ctx.inject(Mecha) - if isinstance(mc.database.current, (Advancement, LootTable, ItemModifier, Predicate)): - if isinstance(node.value, AstJsonValue) and isinstance(node.value.value, str) \ - and node.value.value.startswith("{") and node.value.value.endswith("}"): # excludes location check block/fluid tags - easier than making rule that checks for 'set_nbt' functions on the same json level - try: - nbt = mc.parse(node.value.value.replace("\n", "\\\\n"), type=AstNbtCompound) - except DiagnosticError as exc: - # if parsing failed, give pretty traceback - for d in exc.diagnostics.exceptions: - yield set_location(replace(d, file=mc.database.current), node.value) - return replace(node, value="{}") - - ## TEMP - trial on yielding children rather than using invoke - # with self.use_diagnostics(captured_diagnostics:=DiagnosticCollection()): - # nbt = yield nbt # run all rules on child-node - # print(captured_diagnostics.exceptions) - # print(nbt) - # new_node = replace(node, value=AstJsonValue(value=mc.serialize(nbt, type=AstNbtCompound))) - - with self.use_diagnostics(captured_diagnostics:=DiagnosticCollection()): - processed_nbt = mc.serialize(self.invoke(nbt, type=AstNbtCompound)) - for exc in captured_diagnostics.exceptions: - yield propagate_location(exc, node.value) # set error location to nbt key-value that caused the problem and pass diagnostic back to mecha - - new_node = replace(node, value=AstJsonValue(value=processed_nbt)) - if new_node != node: - return new_node - - return node + """Extendable mixin to run MutatingReducer's rules on nbt within advancements, loot_tables ect...""" + def __init__(self, ctx: Context): + self.ctx = ctx + raise RuntimeError("InvokeOnJsonNbt should not be directly instantiated. It is a mixin for MutatingReducers and should be interited instead") + + @contextmanager + def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: + """Class is mixed into MutatingReducer, who does have this method. Passed here for type completion""" + raise NotImplementedError() + + def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: + """Class is mixed into MutatingReducer, who does have this method. Passed here for type completion""" + raise NotImplementedError() + + + @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='nbt')) + @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='tag')) + def process_nbt_in_json(self, node: AstJsonObjectEntry): + mc = self.ctx.inject(Mecha) + if isinstance(mc.database.current, (Advancement, LootTable, ItemModifier, Predicate)): + if isinstance(node.value, AstJsonValue) and isinstance(node.value.value, str) \ + and node.value.value.startswith("{") and node.value.value.endswith("}"): # excludes location check block/fluid tags - easier than making rule that checks for 'set_nbt' functions on the same json level + try: + nbt = mc.parse(node.value.value.replace("\n", "\\\\n"), type=AstNbtCompound) + except DiagnosticError as exc: + # if parsing failed, give pretty traceback + for d in exc.diagnostics.exceptions: + yield set_location(replace(d, file=mc.database.current), node.value) + return replace(node, value="{}") + + ## TEMP - trial on yielding children rather than using invoke + # with self.use_diagnostics(captured_diagnostics:=DiagnosticCollection()): + # nbt = yield nbt # run all rules on child-node + # print(captured_diagnostics.exceptions) + # print(nbt) + # new_node = replace(node, value=AstJsonValue(value=mc.serialize(nbt, type=AstNbtCompound))) + + with self.use_diagnostics(captured_diagnostics:=DiagnosticCollection()): + processed_nbt = mc.serialize(self.invoke(nbt, type=AstNbtCompound)) + for exc in captured_diagnostics.exceptions: + yield propagate_location(exc, node.value) # set error location to nbt key-value that caused the problem and pass diagnostic back to mecha + + new_node = replace(node, value=AstJsonValue(value=processed_nbt)) + if new_node != node: + return new_node + + return node def propagate_location(obj: T, parent_location_obj: Any) -> T: - """a set_location like function propagating diagnostic information for manually invoked rules""" - return set_location(obj, - SourceLocation(pos=parent_location_obj.location.pos+obj.location.pos, lineno=parent_location_obj.location.lineno, colno=parent_location_obj.location.colno+obj.location.colno), # type: ignore - SourceLocation(pos=parent_location_obj.location.pos+obj.end_location.pos, lineno=parent_location_obj.location.lineno, colno=parent_location_obj.location.colno+obj.end_location.colno) # type: ignore - ) + """a set_location like function propagating diagnostic information for manually invoked rules""" + return set_location(obj, + SourceLocation(pos=parent_location_obj.location.pos+obj.location.pos, lineno=parent_location_obj.location.lineno, colno=parent_location_obj.location.colno+obj.location.colno), # type: ignore + SourceLocation(pos=parent_location_obj.location.pos+obj.end_location.pos, lineno=parent_location_obj.location.lineno, colno=parent_location_obj.location.colno+obj.end_location.colno) # type: ignore + ) # CSV READING UTILS class CSVCell(str): @@ -214,7 +214,7 @@ def as_integer(self) -> int: Interprets the string contained in this CSVCell as an integer. Supported formats are: - base 10 integers (no prefix) - - prefixed hex color codes (# prefix and 6 digits) + - prefixed hex color codes (# prefix and 6 digits) - prefixed hex, octal, or binary (0x, 0o, or 0b and some amount of digits) - bool (True or False, case insensitive) Returns a integer representation of the value. @@ -232,7 +232,32 @@ def as_integer(self) -> int: if self.casefold() == 'false': return 0 return int(self) # default case, interpret as base 10 - + + def as_bool(self) -> bool: + """ + Interprets the string contained in this CSVCell as a boolean. + Returns `True` if the cell's content is: + - `TRUE` in any capitalization + - A positive number greater or equal to `1` + Returns `False` if the cell's content is: + - `FALSE` in any capitalization + - `0` or any number that truncates to zero + Raises a `ValueError` in all other cases. + """ + match self.casefold(): + case 'true': # TRUE / FALSE keywords + return True + case 'false': + return False + case other: + try: # test if contents can be parsed as a number + other = int(other) + if 0 <= other: # only positive numbers can be interpreted as a boolean + return 1 <= other + except ValueError: + pass # not a number + raise ValueError(f"Couldn't interpret CSVCell contents ('{self}') as a boolean.") + def to_color_code(self, encoding: str) -> 'CSVCell': """ Interprets the string contained in this CSVCell as a color code using the given encoding and returns a new CSVCell with that interpretation as its content. @@ -271,7 +296,7 @@ def __init__(self, column_names: List[str] | None = None, data: List[CSVCell] | f"Could not build CSVRow from supplied column names and data; Number of supplied column names ({len(column_names)}) does not match number of supplied data entries ({len(data)}).") self._data = {column_names[column_index] - : value for column_index, value in enumerate(data)} + : value for column_index, value in enumerate(data)} def __bool__(self): """ @@ -291,7 +316,7 @@ def __repr__(self) -> str: def get(self, key: str, default: str | Any) -> CSVCell: """ - Returns the value corrosponding to the key if it exists and is not the empty string. + Returns the value corresponding to the key if it exists and is not the empty string. Else returns the provided default. The provided default is cast to a string internally. """ value = self._data.get(key, CSVCell(default)) @@ -331,6 +356,7 @@ def __init__(self, column_names: List[str], rows: List[List[CSVCell]]) -> None: self._rows = rows def __iter__(self): + "Iterate over `CSVRow` objects contained within this `CSV`. Traverses in order, starting with the topmost row." self.__current = 0 self.__last = len(self._rows) return self diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json new file mode 100644 index 0000000000..1e735a0e5f --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json @@ -0,0 +1,22 @@ +{ + "description":{ + "text": "Barbed" + }, + "supported_items": "minecraft:fishing_rod", + "primary_items": "minecraft:fishing_rod", + "weight": 1, + "max_level": 5, + "min_cost": { + "base": 2, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 55, + "per_level_above_first": 9 + }, + "anvil_cost": 3, + "slots": [ + "any" + ], + "effects": {} +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction new file mode 100644 index 0000000000..2c0a568b9f --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction @@ -0,0 +1,7 @@ +# Applies the barbed damage to the hooked entity +# @s = hooked entity +# at bobber position +# with {damage} +# run from fished/select_type + +$damage @s $(damage) magic by @p[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 7d97085225..a30338b31b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -4,6 +4,19 @@ # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} # run from player/received_bit +# store fishing rod & caster properties +data remove storage gm4_reeling_rods:temp enchanted +execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted.reeling set value 1 +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:3} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:6} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:9} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:12} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:15} +data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos +execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 +execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 +execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1 + # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction deleted file mode 100644 index 56e5268f34..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/store_pos.mcfunction +++ /dev/null @@ -1,9 +0,0 @@ -# stores players postion -# @s = Player -# at @s -# run from player/bit_{bit}_{value} - -data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos -execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 -execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 -execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json new file mode 100644 index 0000000000..71a4a8225b --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json @@ -0,0 +1,18 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed", + "levels": 1 + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json new file mode 100644 index 0000000000..9f4cf88480 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json @@ -0,0 +1,18 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed", + "levels": 2 + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json new file mode 100644 index 0000000000..2d60bcd513 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json @@ -0,0 +1,18 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed", + "levels": 3 + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json new file mode 100644 index 0000000000..8e2fd83d79 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json @@ -0,0 +1,18 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed", + "levels": 4 + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json new file mode 100644 index 0000000000..5059ebeb28 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json @@ -0,0 +1,18 @@ +{ + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "slots": { + "weapon.*": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed", + "levels": 5 + } + ] + } + } + } + } +} diff --git a/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json b/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json index fdf6328f6d..5e9cb723ff 100644 --- a/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json +++ b/gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json @@ -1,5 +1,6 @@ { "values": [ - "gm4_reeling_rods:reeling" + "gm4_reeling_rods:reeling", + "gm4_reeling_rods:barbed" ] } diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 828a9c6f57..3c933e93cf 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -86,43 +86,49 @@ def create_bit_advancements(ctx: Context): } }) ctx.data[f"gm4_reeling_rods:player/bit_{bit}_{value}"] = Function([ - f"# player adv logic for getting bit {bit} at value {value}", + f"# player adv logic for getting bit {bit} at value {value}. Generated by generate_files.py.", f"# run from advancement fished/bit_{bit}_{value}\n", f"advancement revoke @s only gm4_reeling_rods:fished/bit_{bit}_{value}\n", "execute if entity @s[gamemode=adventure] run return fail\n", "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", "data modify storage gm4_reeling_rods:temp bit_data.UUID set from entity @s UUID", - "data remove storage gm4_reeling_rods:temp enchanted", - "execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted set value 1", - "function gm4_reeling_rods:player/store_pos", "tag @s add gm4_reeling_rods.player", "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", "tag @s remove gm4_reeling_rods.player" ]) + def create_select_type(ctx: Context, entities: CSV): - commandOrder: List[List[str]] = [["# non-dismount entities"],["# dismountable entities, action after failed dismount"]] - for entity in entities: - order = 1 if entity['can_dismount'] == "TRUE" else 0 - command = f"execute if entity @s[type={entity['id']}] run return run " - if entity['needs_enchantment'] == "TRUE": - command = command + "execute if data storage gm4_reeling_rods:temp enchanted run " - command = command + entity['command'] - commandOrder[order].append(command) - - finalFunction: List[str] = [ - "# GENERATED from generate_files.py", - "# Selects the right entity type or dismounts the entity", + lines = [ + "# Selects the right entity type or dismounts the entity. Generated by generate_files.py.", "# @s = fished entity", "# at bobber in entity", - "# run from player/find_fished_entity\n" + "# run from player/find_fished_entity", + "", + "# apply barbed damage", + "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} run function gm4_reeling_rods:fished/apply_barbed_damage with storage gm4_reeling_rods:temp enchanted.barbed", + "", + "# non-dismountable entities", + "", + "# dismounting logic", + "execute if function gm4_reeling_rods:is_passenger run return run ride @s dismount", + "", + "# dismountable entities", ] - # entities that don't dismount - for line in commandOrder[0]: - finalFunction.append(line) - # dismount logic - finalFunction.append("\n# dismounting logic\nexecute if function gm4_reeling_rods:is_passenger run return run ride @s dismount\n") - # entities that do dismount, only runs if not dismounting - for line in commandOrder[1]: - finalFunction.append(line) - ctx.data["gm4_reeling_rods:fished/select_type"] = Function(finalFunction) + + for entity in entities: + command = ( + f"execute if entity @s[type={entity['id']}] run return run " + + ( + "execute if data storage gm4_reeling_rods:temp enchanted.reeling run " + if entity["needs_enchantment"].as_bool() + else "" + ) + + entity["command"] + ) + if entity["can_dismount"].as_bool(): + lines.append(command) # dismountable entities should be handled last and are appended to the end of the function + else: + lines.insert(9, command) # non-dismountable entities should be handled first and are inserted before the dismountable entities + + ctx.data["gm4_reeling_rods:fished/select_type"] = Function(lines) From f2cb1fff2e8a67557d672a1e5c600bcc0446ac43 Mon Sep 17 00:00:00 2001 From: runcows Date: Sun, 8 Jun 2025 20:27:43 +0900 Subject: [PATCH 056/101] Fix overassigning ID causing breakage --- .../data/gm4_reeling_rods/function/id/clear.mcfunction | 2 +- .../gm4_reeling_rods/function/id/select_entities.mcfunction | 2 +- .../data/gm4_reeling_rods/function/id/set.mcfunction | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction index 50d3d6372c..951172ff10 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction @@ -1,6 +1,6 @@ # clears all id tags off of @s # @s = entity with tag gm4_reeling_rods.id.tagged -# run from tick +# run from id/loop tag @s remove gm4_reeling_rods.id.0.0 tag @s remove gm4_reeling_rods.id.1.0 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction index f93484ea5c..7f0071927d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/select_entities.mcfunction @@ -5,7 +5,7 @@ # set new id tags if needed # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber -execute as @e[type=!#gm4_reeling_rods:ignore,distance=..42] at @s run function gm4_reeling_rods:id/set +execute as @e[type=!#gm4_reeling_rods:ignore,tag=!gm4_reeling_rods.id.tagged,distance=..42] at @s run function gm4_reeling_rods:id/set # schedule again, since bobber still exists schedule function gm4_reeling_rods:id/loop 2t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction index 44f018c33d..a2ed608146 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction @@ -1,7 +1,7 @@ # function logic for setting an id on an entity # @s = entity to be assigned id # at @s -# run from tick +# run from id/select_entities # get new id execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players set $bit gm4_reeling_rods.math 0 From 5df7186714854286327bef6f8cdfb89eab21e4a8 Mon Sep 17 00:00:00 2001 From: runcows Date: Sun, 8 Jun 2025 20:45:23 +0900 Subject: [PATCH 057/101] Adjust enchantment cost & rarity --- .../data/gm4_reeling_rods/enchantment/barbed.json | 6 +++--- .../data/gm4_reeling_rods/enchantment/reeling.json | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json index 1e735a0e5f..c58a6749a9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json @@ -7,14 +7,14 @@ "weight": 1, "max_level": 5, "min_cost": { - "base": 2, + "base": 15, "per_level_above_first": 9 }, "max_cost": { - "base": 55, + "base": 65, "per_level_above_first": 9 }, - "anvil_cost": 3, + "anvil_cost": 7, "slots": [ "any" ], diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json index d5ab45c12a..e220ed8df2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json @@ -4,17 +4,17 @@ }, "supported_items": "minecraft:fishing_rod", "primary_items": "minecraft:fishing_rod", - "weight": 3, + "weight": 2, "max_level": 1, "min_cost": { - "base": 5, - "per_level_above_first": 8 + "base": 15, + "per_level_above_first": 9 }, "max_cost": { - "base": 55, - "per_level_above_first": 8 + "base": 65, + "per_level_above_first": 9 }, - "anvil_cost": 2, + "anvil_cost": 5, "slots": [ "any" ], From 6954f8dc62b81b5c27451c1837e49deada8fba41 Mon Sep 17 00:00:00 2001 From: runcows Date: Sun, 8 Jun 2025 21:47:52 +0900 Subject: [PATCH 058/101] Remove excess entity_data storage --- .../gm4_reeling_rods/function/fished/chested_horse.mcfunction | 1 - .../data/gm4_reeling_rods/function/fished/llama.mcfunction | 1 - 2 files changed, 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction index 6166ecb0a0..6afcc2b609 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction @@ -3,7 +3,6 @@ # at bobber in @s # run from fished/select_type -data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction index e8d351f0e5..6f8c5a6ea9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction @@ -3,7 +3,6 @@ # at bobber in @s # run from fished/select_type -data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} From b1bb5cebce73bbfedddb4d36a6354a2c9e638809 Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 15:10:24 +0200 Subject: [PATCH 059/101] Add Barbed Delayed Damage --- .../function/barbed/apply.mcfunction | 17 ++++++++++++ .../function/barbed/clear.mcfunction | 11 ++++++++ .../function/barbed/find_affected.mcfunction | 10 +++++++ .../function/barbed/find_attacker.mcfunction | 21 +++++++++++++++ .../function/barbed/update_timer.mcfunction | 26 +++++++++++++++++++ .../fished/apply_barbed_damage.mcfunction | 7 ----- .../gm4_reeling_rods/function/init.mcfunction | 6 +++++ .../player/find_fished_entity.mcfunction | 10 +++---- gm4_reeling_rods/generate_files.py | 2 +- 9 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction new file mode 100644 index 0000000000..7b9a34fa5e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -0,0 +1,17 @@ +# Applies the barbed damage to the hooked entity +# @s = hooked entity +# at bobber position +# with {damage} +# run from fished/select_type + +# immediate damage (amount scales with enchantment level) +$damage @s $(damage) magic by @p[tag=gm4_reeling_rods.player] + +# bleeding damage (more frequent with higher levels, but constant in amount) +data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_reeling_rods.player] UUID +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[1] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3] +execute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period +schedule function gm4_reeling_rods:barbed/find_affected 1t replace diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction new file mode 100644 index 0000000000..f7407dc641 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction @@ -0,0 +1,11 @@ +# stops bleeding damage +# @s = entity recently hit by a barbed fishing rod +# at @s +# run from barbed/update_timer + +scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid0 +scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid1 +scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid2 +scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid3 +scoreboard players reset @s gm4_reeling_rods.barbed_damage_period +scoreboard players reset @s gm4_reeling_rods.barbed_damage_timer diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction new file mode 100644 index 0000000000..d50c973c47 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction @@ -0,0 +1,10 @@ +# initiates bleeding damage on affected entities, de-schedules if no more entities are affected +# @s = undefined +# at undefined +# scheduled from barbed/apply and self + +# apply barbed damage +execute as @e[scores={gm4_reeling_rods.barbed_damage_timer=0..}] at @s run function gm4_reeling_rods:barbed/update_timer + +# reschedule if there are still barbed entities +execute if entity @e[scores={gm4_reeling_rods.barbed_damage_timer=0..},limit=1] run schedule function gm4_reeling_rods:barbed/find_affected 1t replace diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction new file mode 100644 index 0000000000..6095512db4 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction @@ -0,0 +1,21 @@ +# locates the attacker, as commands do not accept int-array formatted strings in macros +# @s = temporary snowball +# at location of snowball +# run from barbed/bleed + +# build uuid array +data modify storage gm4_reeling_rods:temp barbed_attacker_uuid set value [I;0,0,0,0] +execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[0] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid0 +execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[1] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid1 +execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[2] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid2 +execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[3] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid3 + +# move uuid to snowball +data modify entity @s Owner set from storage gm4_reeling_rods:temp barbed_attacker_uuid + +# tag owner +scoreboard players set $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 0 +execute on origin store success score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 run tag @s add gm4_reeling_rods.barbed_attacker + +# remove snowball +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction new file mode 100644 index 0000000000..07f9904d0e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction @@ -0,0 +1,26 @@ +# updates the bleeding timer +# @s = entity recently hit by a barbed fishing rod +# at @s +# run from barbed/find_affected + +# advance timer +scoreboard players add @s gm4_reeling_rods.barbed_damage_timer 1 + +# clear if timer exceeds 3s +execute if score @s gm4_reeling_rods.barbed_damage_timer matches 61.. run return run function gm4_reeling_rods:barbed/clear + +# return unless phase of timer is 0 +scoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer = @s gm4_reeling_rods.barbed_damage_timer +scoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer %= @s gm4_reeling_rods.barbed_damage_period +execute unless score $phase gm4_reeling_rods.barbed_damage_timer matches 0 run return fail + +# find attacker +# | tags attacker with gm4_reeling_rods.barbed_attacker +# | sets $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 +execute summon snowball run function gm4_reeling_rods:barbed/find_attacker + +# apply damage +# | if the attacker was found, attribute it to the attacker, if not do not attribute it to anyone +execute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 magic by @p[tag=gm4_reeling_rods.barbed_attacker] +execute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 magic +particle damage_indicator ~ ~ ~ .3 .3 .3 1 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction deleted file mode 100644 index 2c0a568b9f..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/apply_barbed_damage.mcfunction +++ /dev/null @@ -1,7 +0,0 @@ -# Applies the barbed damage to the hooked entity -# @s = hooked entity -# at bobber position -# with {damage} -# run from fished/select_type - -$damage @s $(damage) magic by @p[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 12306cf526..4ded53b6fb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -5,6 +5,12 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" +scoreboard objectives add gm4_reeling_rods.barbed_damage_timer dummy +scoreboard objectives add gm4_reeling_rods.barbed_damage_period dummy +scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid0 dummy +scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid1 dummy +scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid2 dummy +scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid3 dummy scoreboard objectives add gm4_reeling_rods.rods_cast minecraft.used:minecraft.fishing_rod "gm4_reeling rods cast" # set_lookup_table generated in generate_files.py diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index a30338b31b..48fbb44167 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -7,11 +7,11 @@ # store fishing rod & caster properties data remove storage gm4_reeling_rods:temp enchanted execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted.reeling set value 1 -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:3} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:6} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:9} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:12} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {damage:15} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 25,damage:3} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 16,damage:6} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 12,damage:9} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 8,damage:12} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 6,damage:15} data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 3c933e93cf..e26f4b88b7 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -106,7 +106,7 @@ def create_select_type(ctx: Context, entities: CSV): "# run from player/find_fished_entity", "", "# apply barbed damage", - "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} run function gm4_reeling_rods:fished/apply_barbed_damage with storage gm4_reeling_rods:temp enchanted.barbed", + "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", "", "# non-dismountable entities", "", From 3994e72fb0277a622ee7d46d3f94aa4279074bc5 Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 15:12:49 +0200 Subject: [PATCH 060/101] Fix Bleeding Damage not Starting --- .../data/gm4_reeling_rods/function/barbed/apply.mcfunction | 1 + 1 file changed, 1 insertion(+) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index 7b9a34fa5e..81caacd1c3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -14,4 +14,5 @@ execute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data ge execute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2] execute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3] execute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period +scoreboard players set @s gm4_reeling_rods.barbed_damage_timer 0 schedule function gm4_reeling_rods:barbed/find_affected 1t replace From 8129bce0bc417bba3ecd2e9fc047ed89f42d2d7a Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 15:56:00 +0200 Subject: [PATCH 061/101] Adjust Damage & Particles --- .../gm4_reeling_rods/function/barbed/apply.mcfunction | 3 ++- .../function/barbed/update_timer.mcfunction | 8 +++++--- .../function/player/find_fished_entity.mcfunction | 10 +++++----- gm4_reeling_rods/generate_files.py | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index 81caacd1c3..c713a1f789 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -5,7 +5,8 @@ # run from fished/select_type # immediate damage (amount scales with enchantment level) -$damage @s $(damage) magic by @p[tag=gm4_reeling_rods.player] +$damage @s $(damage) cactus by @p[tag=gm4_reeling_rods.player] +playsound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1.82 # bleeding damage (more frequent with higher levels, but constant in amount) data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_reeling_rods.player] UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction index 07f9904d0e..fd59e88a7b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction @@ -21,6 +21,8 @@ execute summon snowball run function gm4_reeling_rods:barbed/find_attacker # apply damage # | if the attacker was found, attribute it to the attacker, if not do not attribute it to anyone -execute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 magic by @p[tag=gm4_reeling_rods.barbed_attacker] -execute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 magic -particle damage_indicator ~ ~ ~ .3 .3 .3 1 4 +execute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus by @p[tag=gm4_reeling_rods.barbed_attacker] +execute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus +playsound minecraft:block.pointed_dripstone.drip_lava neutral @a[distance=..6] ~ ~ ~ 1 1.8 +execute anchored eyes run particle damage_indicator ^ ^ ^ .2 .2 .2 0 3 +execute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 48fbb44167..05a82d99df 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -7,11 +7,11 @@ # store fishing rod & caster properties data remove storage gm4_reeling_rods:temp enchanted execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted.reeling set value 1 -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 25,damage:3} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 16,damage:6} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 12,damage:9} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 8,damage:12} -execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 6,damage:15} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 31,damage:3} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 26,damage:6} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 21,damage:9} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 16,damage:12} +execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 11,damage:15} data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index e26f4b88b7..0be5c06bcc 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -106,7 +106,7 @@ def create_select_type(ctx: Context, entities: CSV): "# run from player/find_fished_entity", "", "# apply barbed damage", - "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", + "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", "", "# non-dismountable entities", "", From 7697bd7f1dc8af91f09a81dcdbc123ef388cbb80 Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 16:47:56 +0200 Subject: [PATCH 062/101] Add Custom Death Messages --- .../function/barbed/apply.mcfunction | 10 ++++++++++ .../function/barbed/on_bleeding_death.mcfunction | 10 ++++++++++ .../function/barbed/on_scratch_death.mcfunction | 10 ++++++++++ .../function/barbed/update_timer.mcfunction | 14 ++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index c713a1f789..a03f8172a4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -5,9 +5,19 @@ # run from fished/select_type # immediate damage (amount scales with enchantment level) +execute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule showDeathMessages +gamerule showDeathMessages false $damage @s $(damage) cactus by @p[tag=gm4_reeling_rods.player] playsound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1.82 +# handle death (@e only selects entities which are alive) +# | this is of importance for entities which display death messages or re-spawn +tag @s add gm4_reeling_rods.victim +execute at @s unless entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death +tag @s remove gm4_reeling_rods.victim +execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule showDeathMessages true +scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer + # bleeding damage (more frequent with higher levels, but constant in amount) data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_reeling_rods.player] UUID execute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction new file mode 100644 index 0000000000..65ad8ebe22 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction @@ -0,0 +1,10 @@ +# handles entities bleeding to death +# @s = entity who died by bleeding to death from barbed damage +# at @s +# run from barbed/update_timer + +# death message +tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] + +# reset barbed state +function gm4_reeling_rods:barbed/clear diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction new file mode 100644 index 0000000000..131e09bbc7 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction @@ -0,0 +1,10 @@ +# handles entities scratched to death +# @s = entity who died by immediate damage from a barbed rod +# at @s +# run from barbed/apply + +# death message +tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_reeling_rods.player]"}]}] + +# reset barbed state +function gm4_reeling_rods:barbed/clear diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction index fd59e88a7b..b69aa491d2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction @@ -19,10 +19,24 @@ execute unless score $phase gm4_reeling_rods.barbed_damage_timer matches 0 run r # | sets $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 execute summon snowball run function gm4_reeling_rods:barbed/find_attacker +# prepare to handle player death +execute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule showDeathMessages +gamerule showDeathMessages false + # apply damage # | if the attacker was found, attribute it to the attacker, if not do not attribute it to anyone +# | use cactus damage type as it has no knockback and respects armor +# | print custom death message to obscure cactus death message execute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus by @p[tag=gm4_reeling_rods.barbed_attacker] execute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus playsound minecraft:block.pointed_dripstone.drip_lava neutral @a[distance=..6] ~ ~ ~ 1 1.8 execute anchored eyes run particle damage_indicator ^ ^ ^ .2 .2 .2 0 3 execute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @s + +# handle death (@e only selects entities which are alive) +# | this is of importance for entities which display death messages or re-spawn +tag @s add gm4_reeling_rods.victim +execute at @s unless entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death +tag @s remove gm4_reeling_rods.victim +execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule showDeathMessages true +scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer From b9ee649fba37881a5b1af1a4a5c97d346a3bec9b Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 17:08:46 +0200 Subject: [PATCH 063/101] Adjust Enchantment Weights --- .../data/gm4_reeling_rods/enchantment/barbed.json | 11 ++++++----- .../data/gm4_reeling_rods/enchantment/reeling.json | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json index c58a6749a9..744e8d7933 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json @@ -2,19 +2,20 @@ "description":{ "text": "Barbed" }, + "exclusive_set": "gm4_reeling_rods:reeling", "supported_items": "minecraft:fishing_rod", "primary_items": "minecraft:fishing_rod", "weight": 1, "max_level": 5, "min_cost": { - "base": 15, - "per_level_above_first": 9 + "base": 1, + "per_level_above_first": 10 }, "max_cost": { - "base": 65, - "per_level_above_first": 9 + "base": 51, + "per_level_above_first": 10 }, - "anvil_cost": 7, + "anvil_cost": 1, "slots": [ "any" ], diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json index e220ed8df2..776e733956 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json @@ -2,19 +2,20 @@ "description":{ "text": "Reeling" }, + "exclusive_set": "gm4_reeling_rods:barbed", "supported_items": "minecraft:fishing_rod", "primary_items": "minecraft:fishing_rod", - "weight": 2, + "weight": 1, "max_level": 1, "min_cost": { - "base": 15, - "per_level_above_first": 9 + "base": 20, + "per_level_above_first": 0 }, "max_cost": { - "base": 65, - "per_level_above_first": 9 + "base": 70, + "per_level_above_first": 0 }, - "anvil_cost": 5, + "anvil_cost": 8, "slots": [ "any" ], From 71bbf4a6aebf0026d8ac0db9fff56a6ac81548c6 Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 17:42:24 +0200 Subject: [PATCH 064/101] Fix Death Messages & Properly Reset Players on Respawn --- .../function/barbed/apply.mcfunction | 17 ++++++----------- ...update_timer.mcfunction => bleed.mcfunction} | 2 +- .../function/barbed/clear.mcfunction | 2 +- .../function/barbed/find_affected.mcfunction | 4 ++-- .../barbed/on_bleeding_death.mcfunction | 7 +++++-- .../function/barbed/on_scratch_death.mcfunction | 5 ++++- .../barbed/schedule_bleeding.mcfunction | 16 ++++++++++++++++ .../tags/entity_type/support_death_message.json | 8 ++++++++ 8 files changed, 43 insertions(+), 18 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/{update_timer.mcfunction => bleed.mcfunction} (92%) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index a03f8172a4..d40c63c8e7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -13,17 +13,12 @@ playsound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1 # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim -execute at @s unless entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death +execute at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death + +# if the victim is still alive, schedule bleeding damage +execute at @s if entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/schedule_bleeding + +# reset scores, gamerule and tag tag @s remove gm4_reeling_rods.victim execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule showDeathMessages true scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer - -# bleeding damage (more frequent with higher levels, but constant in amount) -data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_reeling_rods.player] UUID -execute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0] -execute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[1] -execute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2] -execute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3] -execute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period -scoreboard players set @s gm4_reeling_rods.barbed_damage_timer 0 -schedule function gm4_reeling_rods:barbed/find_affected 1t replace diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction index b69aa491d2..47a1251eb4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/update_timer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction @@ -36,7 +36,7 @@ execute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @ # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim -execute at @s unless entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death +execute at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death tag @s remove gm4_reeling_rods.victim execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule showDeathMessages true scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction index f7407dc641..36cadb1fa5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction @@ -1,7 +1,7 @@ # stops bleeding damage # @s = entity recently hit by a barbed fishing rod # at @s -# run from barbed/update_timer +# run from barbed/bleed, barbed/on_bleeding_death, and barbed/on_scratch_death scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid0 scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction index d50c973c47..4f645c471e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction @@ -1,10 +1,10 @@ # initiates bleeding damage on affected entities, de-schedules if no more entities are affected # @s = undefined # at undefined -# scheduled from barbed/apply and self +# scheduled from barbed/schedule_bleeding and self # apply barbed damage -execute as @e[scores={gm4_reeling_rods.barbed_damage_timer=0..}] at @s run function gm4_reeling_rods:barbed/update_timer +execute as @e[scores={gm4_reeling_rods.barbed_damage_timer=0..}] at @s run function gm4_reeling_rods:barbed/bleed # reschedule if there are still barbed entities execute if entity @e[scores={gm4_reeling_rods.barbed_damage_timer=0..},limit=1] run schedule function gm4_reeling_rods:barbed/find_affected 1t replace diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction index 65ad8ebe22..0117e6dc39 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction @@ -1,10 +1,13 @@ # handles entities bleeding to death # @s = entity who died by bleeding to death from barbed damage # at @s -# run from barbed/update_timer +# run from barbed/bleed # death message -tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] +execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] +execute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner +execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] +execute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner # reset barbed state function gm4_reeling_rods:barbed/clear diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction index 131e09bbc7..eb1bcf8554 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction @@ -4,7 +4,10 @@ # run from barbed/apply # death message -tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_reeling_rods.player]"}]}] +execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_reeling_rods.player]"}]}] +execute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner +execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_reeling_rods.player]"}]}] +execute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner # reset barbed state function gm4_reeling_rods:barbed/clear diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction new file mode 100644 index 0000000000..f5a1b11deb --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction @@ -0,0 +1,16 @@ +# schedules bleeding damage for the entity that was just hit by barbed +# @s = entity just hit by barbed that has not died from the immediate damage +# at bobber position +# run from barbed/apply + +# store attacker uuid and period +data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_reeling_rods.player] UUID +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[1] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2] +execute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3] +execute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period + +# initiate timer +scoreboard players set @s gm4_reeling_rods.barbed_damage_timer 0 +schedule function gm4_reeling_rods:barbed/find_affected 1t replace diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json new file mode 100644 index 0000000000..bec44856dc --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json @@ -0,0 +1,8 @@ +{ + "values": [ + "minecraft:cat", + "minecraft:parrot", + "minecraft:player", + "minecraft:wolf" + ] +} From eb64212c2c58eb48ab07679881a1bc12b8e4819f Mon Sep 17 00:00:00 2001 From: Bloo Date: Sun, 8 Jun 2025 22:14:44 +0200 Subject: [PATCH 065/101] Fix Bleeding Damage not Triggering for non-Player Entities --- .../data/gm4_reeling_rods/function/barbed/apply.mcfunction | 2 +- .../data/gm4_reeling_rods/function/barbed/bleed.mcfunction | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index d40c63c8e7..192ec24b5e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -13,7 +13,7 @@ playsound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1 # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim -execute at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death +execute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death # if the victim is still alive, schedule bleeding damage execute at @s if entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/schedule_bleeding diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction index 47a1251eb4..5f262a8af5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction @@ -36,7 +36,7 @@ execute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @ # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim -execute at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death +execute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death tag @s remove gm4_reeling_rods.victim execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule showDeathMessages true scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer From 3d3acffb0f2b7bcd4e23cbaf08813bc20151b103 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 10:58:38 +0900 Subject: [PATCH 066/101] ID rewrite to use scores & optimization --- .../function/id/assign.mcfunction | 22 ------- .../function/id/clear.mcfunction | 50 +++++---------- .../function/id/get_next.mcfunction | 64 +++++++++++++++---- .../function/id/loop.mcfunction | 7 +- .../function/id/set.mcfunction | 23 +++++-- .../gm4_reeling_rods/function/init.mcfunction | 18 +++++- .../player/find_fished_entity.mcfunction | 3 +- .../function/player/received_bit.mcfunction | 2 +- gm4_reeling_rods/generate_files.py | 14 ++-- 9 files changed, 120 insertions(+), 83 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction deleted file mode 100644 index fc2f0c5a20..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/assign.mcfunction +++ /dev/null @@ -1,22 +0,0 @@ -# assigns @s bit tags -# @s = entity to set tags -# with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} -# run from id/set - -$tag @s add $(bit_0) -$tag @s add $(bit_1) -$tag @s add $(bit_2) -$tag @s add $(bit_3) -$tag @s add $(bit_4) -$tag @s add $(bit_5) -$tag @s add $(bit_6) -$tag @s add $(bit_7) -$tag @s add $(bit_8) -$tag @s add $(bit_9) -$tag @s add $(bit_10) -$tag @s add $(bit_11) -$tag @s add $(bit_12) -$tag @s add $(bit_13) -$tag @s add $(bit_14) -$tag @s add $(bit_15) -tag @s add gm4_reeling_rods.id.tagged diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction index 951172ff10..2b12ec093b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/clear.mcfunction @@ -1,37 +1,21 @@ -# clears all id tags off of @s +# clears id of @s # @s = entity with tag gm4_reeling_rods.id.tagged # run from id/loop -tag @s remove gm4_reeling_rods.id.0.0 -tag @s remove gm4_reeling_rods.id.1.0 -tag @s remove gm4_reeling_rods.id.2.0 -tag @s remove gm4_reeling_rods.id.3.0 -tag @s remove gm4_reeling_rods.id.4.0 -tag @s remove gm4_reeling_rods.id.5.0 -tag @s remove gm4_reeling_rods.id.6.0 -tag @s remove gm4_reeling_rods.id.7.0 -tag @s remove gm4_reeling_rods.id.8.0 -tag @s remove gm4_reeling_rods.id.9.0 -tag @s remove gm4_reeling_rods.id.10.0 -tag @s remove gm4_reeling_rods.id.11.0 -tag @s remove gm4_reeling_rods.id.12.0 -tag @s remove gm4_reeling_rods.id.13.0 -tag @s remove gm4_reeling_rods.id.14.0 -tag @s remove gm4_reeling_rods.id.15.0 -tag @s remove gm4_reeling_rods.id.0.1 -tag @s remove gm4_reeling_rods.id.1.1 -tag @s remove gm4_reeling_rods.id.2.1 -tag @s remove gm4_reeling_rods.id.3.1 -tag @s remove gm4_reeling_rods.id.4.1 -tag @s remove gm4_reeling_rods.id.5.1 -tag @s remove gm4_reeling_rods.id.6.1 -tag @s remove gm4_reeling_rods.id.7.1 -tag @s remove gm4_reeling_rods.id.8.1 -tag @s remove gm4_reeling_rods.id.9.1 -tag @s remove gm4_reeling_rods.id.10.1 -tag @s remove gm4_reeling_rods.id.11.1 -tag @s remove gm4_reeling_rods.id.12.1 -tag @s remove gm4_reeling_rods.id.13.1 -tag @s remove gm4_reeling_rods.id.14.1 -tag @s remove gm4_reeling_rods.id.15.1 +scoreboard players reset @s gm4_reeling_rods.id_bit.0 +scoreboard players reset @s gm4_reeling_rods.id_bit.1 +scoreboard players reset @s gm4_reeling_rods.id_bit.2 +scoreboard players reset @s gm4_reeling_rods.id_bit.3 +scoreboard players reset @s gm4_reeling_rods.id_bit.4 +scoreboard players reset @s gm4_reeling_rods.id_bit.5 +scoreboard players reset @s gm4_reeling_rods.id_bit.6 +scoreboard players reset @s gm4_reeling_rods.id_bit.7 +scoreboard players reset @s gm4_reeling_rods.id_bit.8 +scoreboard players reset @s gm4_reeling_rods.id_bit.9 +scoreboard players reset @s gm4_reeling_rods.id_bit.10 +scoreboard players reset @s gm4_reeling_rods.id_bit.11 +scoreboard players reset @s gm4_reeling_rods.id_bit.12 +scoreboard players reset @s gm4_reeling_rods.id_bit.13 +scoreboard players reset @s gm4_reeling_rods.id_bit.14 +scoreboard players reset @s gm4_reeling_rods.id_bit.15 tag @s remove gm4_reeling_rods.id.tagged diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction index b791d423d6..dbfdbc9859 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction @@ -1,17 +1,55 @@ # Gets the next id -# with {bit} -# run from id/set and self - -# Data storage gm4_reeling_rods:id next - # bit_0..15 : "gm4_reeling_rods.id.<0..15>.[0|1]" +# run from id/set +## Binary Counter # change bit 0 -> 1, return nothing else to do -$execute if data storage gm4_reeling_rods:id {next:{bit_$(bit):"gm4_reeling_rods.id.$(bit).0"}} \ - run return run data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).1" - # change bit 1 -> 0, then go on to next bit -$data modify storage gm4_reeling_rods:id next.bit_$(bit) set value "gm4_reeling_rods.id.$(bit).0" -execute if score $bit gm4_reeling_rods.math matches 15 run return 1 -# next bit -execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players add $bit gm4_reeling_rods.math 1 -function gm4_reeling_rods:id/get_next with storage gm4_reeling_rods:id + +# bit.0 +execute if score $next gm4_reeling_rods.id_bit.0 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.0 1 +scoreboard players set $next gm4_reeling_rods.id_bit.0 0 +# bit.1 +execute if score $next gm4_reeling_rods.id_bit.1 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.1 1 +scoreboard players set $next gm4_reeling_rods.id_bit.1 0 +# bit.2 +execute if score $next gm4_reeling_rods.id_bit.2 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.2 1 +scoreboard players set $next gm4_reeling_rods.id_bit.2 0 +# bit.3 +execute if score $next gm4_reeling_rods.id_bit.3 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.3 1 +scoreboard players set $next gm4_reeling_rods.id_bit.3 0 +# bit.4 +execute if score $next gm4_reeling_rods.id_bit.4 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.4 1 +scoreboard players set $next gm4_reeling_rods.id_bit.4 0 +# bit.5 +execute if score $next gm4_reeling_rods.id_bit.5 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.5 1 +scoreboard players set $next gm4_reeling_rods.id_bit.5 0 +# bit.6 +execute if score $next gm4_reeling_rods.id_bit.6 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.6 1 +scoreboard players set $next gm4_reeling_rods.id_bit.6 0 +# bit.7 +execute if score $next gm4_reeling_rods.id_bit.7 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.7 1 +scoreboard players set $next gm4_reeling_rods.id_bit.7 0 +# bit.8 +execute if score $next gm4_reeling_rods.id_bit.8 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.8 1 +scoreboard players set $next gm4_reeling_rods.id_bit.8 0 +# bit.9 +execute if score $next gm4_reeling_rods.id_bit.9 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.9 1 +scoreboard players set $next gm4_reeling_rods.id_bit.9 0 +# bit.10 +execute if score $next gm4_reeling_rods.id_bit.10 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.10 1 +scoreboard players set $next gm4_reeling_rods.id_bit.10 0 +# bit.11 +execute if score $next gm4_reeling_rods.id_bit.11 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.11 1 +scoreboard players set $next gm4_reeling_rods.id_bit.11 0 +# bit.12 +execute if score $next gm4_reeling_rods.id_bit.12 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.12 1 +scoreboard players set $next gm4_reeling_rods.id_bit.12 0 +# bit.13 +execute if score $next gm4_reeling_rods.id_bit.13 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.13 1 +scoreboard players set $next gm4_reeling_rods.id_bit.13 0 +# bit.14 +execute if score $next gm4_reeling_rods.id_bit.14 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.14 1 +scoreboard players set $next gm4_reeling_rods.id_bit.14 0 +# bit.15 +execute if score $next gm4_reeling_rods.id_bit.15 matches 0 run return run scoreboard players set $next gm4_reeling_rods.id_bit.15 1 +scoreboard players set $next gm4_reeling_rods.id_bit.15 0 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction index b287c26da0..30c28361c4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction @@ -2,7 +2,8 @@ # run from player/cast_line \ & scheduled id/select_entities -# clear ids for new assignment -execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear # assign new ids if there's a bobber -execute as @e[type=minecraft:fishing_bobber] at @s run function gm4_reeling_rods:id/select_entities +execute as @e[type=minecraft:fishing_bobber] at @s run return run function gm4_reeling_rods:id/select_entities + +# no fishing bobber, clear ids +execute as @e[tag=gm4_reeling_rods.id.tagged] run function gm4_reeling_rods:id/clear diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction index a2ed608146..0bf1187a05 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/set.mcfunction @@ -1,11 +1,26 @@ -# function logic for setting an id on an entity +# set an id on an entity # @s = entity to be assigned id # at @s # run from id/select_entities # get new id -execute store result storage gm4_reeling_rods:id bit int 1 run scoreboard players set $bit gm4_reeling_rods.math 0 -function gm4_reeling_rods:id/get_next with storage gm4_reeling_rods:id +function gm4_reeling_rods:id/get_next # assign new id -function gm4_reeling_rods:id/assign with storage gm4_reeling_rods:id next +scoreboard players operation @s gm4_reeling_rods.id_bit.0 = $next gm4_reeling_rods.id_bit.0 +scoreboard players operation @s gm4_reeling_rods.id_bit.1 = $next gm4_reeling_rods.id_bit.1 +scoreboard players operation @s gm4_reeling_rods.id_bit.2 = $next gm4_reeling_rods.id_bit.2 +scoreboard players operation @s gm4_reeling_rods.id_bit.3 = $next gm4_reeling_rods.id_bit.3 +scoreboard players operation @s gm4_reeling_rods.id_bit.4 = $next gm4_reeling_rods.id_bit.4 +scoreboard players operation @s gm4_reeling_rods.id_bit.5 = $next gm4_reeling_rods.id_bit.5 +scoreboard players operation @s gm4_reeling_rods.id_bit.6 = $next gm4_reeling_rods.id_bit.6 +scoreboard players operation @s gm4_reeling_rods.id_bit.7 = $next gm4_reeling_rods.id_bit.7 +scoreboard players operation @s gm4_reeling_rods.id_bit.8 = $next gm4_reeling_rods.id_bit.8 +scoreboard players operation @s gm4_reeling_rods.id_bit.9 = $next gm4_reeling_rods.id_bit.9 +scoreboard players operation @s gm4_reeling_rods.id_bit.10 = $next gm4_reeling_rods.id_bit.10 +scoreboard players operation @s gm4_reeling_rods.id_bit.11 = $next gm4_reeling_rods.id_bit.11 +scoreboard players operation @s gm4_reeling_rods.id_bit.12 = $next gm4_reeling_rods.id_bit.12 +scoreboard players operation @s gm4_reeling_rods.id_bit.13 = $next gm4_reeling_rods.id_bit.13 +scoreboard players operation @s gm4_reeling_rods.id_bit.14 = $next gm4_reeling_rods.id_bit.14 +scoreboard players operation @s gm4_reeling_rods.id_bit.15 = $next gm4_reeling_rods.id_bit.15 +tag @s add gm4_reeling_rods.id.tagged diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 4ded53b6fb..80536d7d73 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -4,7 +4,6 @@ scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" -scoreboard objectives add gm4_reeling_rods.entities dummy "gm4_reeling entity specific" scoreboard objectives add gm4_reeling_rods.barbed_damage_timer dummy scoreboard objectives add gm4_reeling_rods.barbed_damage_period dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid0 dummy @@ -12,6 +11,23 @@ scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid1 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid2 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid3 dummy scoreboard objectives add gm4_reeling_rods.rods_cast minecraft.used:minecraft.fishing_rod "gm4_reeling rods cast" +# id +scoreboard objectives add gm4_reeling_rods.id_bit.0 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.1 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.2 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.3 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.4 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.5 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.6 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.7 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.8 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.9 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.10 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.11 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.12 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.13 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.14 dummy +scoreboard objectives add gm4_reeling_rods.id_bit.15 dummy # set_lookup_table generated in generate_files.py function gm4_reeling_rods:set_lookup_table diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction index 05a82d99df..ced9a2b695 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction @@ -21,6 +21,5 @@ execute store result score $motionZ gm4_reeling_rods.math run data get storage g $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ at @s as @e[distance=..42, limit=1, type=!#gm4_reeling_rods:ignore, \ - tag=$(bit_0), tag=$(bit_1), tag=$(bit_2), tag=$(bit_3), tag=$(bit_4), tag=$(bit_5), tag=$(bit_6), tag=$(bit_7), \ - tag=$(bit_8), tag=$(bit_9), tag=$(bit_10), tag=$(bit_11), tag=$(bit_12), tag=$(bit_13), tag=$(bit_14), tag=$(bit_15)\ + scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ ] unless entity @s[tag=smithed.entity] run function gm4_reeling_rods:fished/select_type diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction index fac36d8a3c..f610f62b68 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -4,7 +4,7 @@ # with {bit, UUID} # run from player/bit_{bit}_{value} -$data modify storage gm4_reeling_rods:players "$(UUID)".bit_$(bit) set from storage gm4_reeling_rods:temp bit_data.bit_tag +$data modify storage gm4_reeling_rods:players "$(UUID)".bit_$(bit) set from storage gm4_reeling_rods:temp bit_data.bit_score # fail if not all bits $execute store result score $bit_count gm4_reeling_rods.math run data get storage gm4_reeling_rods:players "$(UUID)" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 0be5c06bcc..04d85b4fbd 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -75,9 +75,15 @@ def create_bit_advancements(ctx: Context): "fishing_rod_hooked":{ "trigger":"minecraft:fishing_rod_hooked", "conditions":{ - "entity":{ - "nbt": "{" + f"Tags:[\"gm4_reeling_rods.id.{bit}.{value}\"]" + "}" - } + "entity": [ + { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + f"gm4_reeling_rods.id_bit.{bit}": value + } + } + ] } } }, @@ -90,7 +96,7 @@ def create_bit_advancements(ctx: Context): f"# run from advancement fished/bit_{bit}_{value}\n", f"advancement revoke @s only gm4_reeling_rods:fished/bit_{bit}_{value}\n", "execute if entity @s[gamemode=adventure] run return fail\n", - "data modify storage gm4_reeling_rods:temp bit_data set value {bit_tag:\"" + f"gm4_reeling_rods.id.{bit}.{value}\", bit:\"{bit}\"" + "}", + "data modify storage gm4_reeling_rods:temp bit_data set value {bit_score:\"" + f"gm4_reeling_rods.id_bit.{bit}={value}\", bit:\"{bit}\"" + "}", "data modify storage gm4_reeling_rods:temp bit_data.UUID set from entity @s UUID", "tag @s add gm4_reeling_rods.player", "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", From 8ca0478d3d7a9e3bf92bec802b7647afdbb885a1 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 11:00:07 +0900 Subject: [PATCH 067/101] Swap enchantment name for translation string --- .../data/gm4_reeling_rods/enchantment/barbed.json | 5 +++-- .../data/gm4_reeling_rods/enchantment/reeling.json | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json index 744e8d7933..5a84154998 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json @@ -1,6 +1,7 @@ { - "description":{ - "text": "Barbed" + "description": { + "translate": "gm4.reeling_rods.enchantment.barbed", + "fallback": "Barbed" }, "exclusive_set": "gm4_reeling_rods:reeling", "supported_items": "minecraft:fishing_rod", diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json index 776e733956..392ae08292 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json @@ -1,6 +1,7 @@ { - "description":{ - "text": "Reeling" + "description": { + "translate": "gm4.reeling_rods.enchantment.reeling", + "fallback": "Reeling" }, "exclusive_set": "gm4_reeling_rods:barbed", "supported_items": "minecraft:fishing_rod", From e5340a83ece926147c15d45bcbfbdf5c12324d06 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 12:01:17 +0900 Subject: [PATCH 068/101] Big Reorganization --- .../function/barbed/apply.mcfunction | 2 +- .../function/get_lookup.mcfunction | 2 +- .../is_passenger.mcfunction | 2 +- .../item_frame.mcfunction | 4 +- .../leash_knot/action.mcfunction | 8 +-- .../leash_knot/change_leader.mcfunction | 2 +- .../leash_knot/leaded_by_knot.mcfunction | 2 +- .../painting.mcfunction | 4 +- .../gm4_reeling_rods/function/init.mcfunction | 6 +- ...function => find_hooked_entity.mcfunction} | 9 +-- .../function/player/owns_bobber.mcfunction | 2 +- .../function/player/received_bit.mcfunction | 2 +- .../function/pull_items.mcfunction | 4 +- .../{fished => reeling}/bee.mcfunction | 2 +- .../chest_boat/action.mcfunction | 6 +- .../chest_boat/passenger_transfer.mcfunction | 2 +- .../chested_horse.mcfunction | 2 +- .../empty_container_entity.mcfunction | 2 +- .../{fished => reeling}/horse.mcfunction | 2 +- .../{fished => reeling}/llama.mcfunction | 2 +- .../minecart/action.mcfunction | 6 +- .../minecart/passenger_transfer.mcfunction | 2 +- .../mooshroom/action.mcfunction | 6 +- .../mooshroom/passenger_transfer.mcfunction | 2 +- .../{fished => reeling}/sheep.mcfunction | 2 +- .../{fished => reeling}/snow_golem.mcfunction | 2 +- .../stealable/order/equipment_1.mcfunction | 16 +++-- .../stealable/order/equipment_2.mcfunction | 16 +++-- .../stealable/order/equipment_3.mcfunction | 16 +++-- .../stealable/order/equipment_4.mcfunction | 16 +++-- .../stealable/order/equipment_5.mcfunction | 16 +++-- .../stealable/order/equipment_6.mcfunction | 16 +++-- .../stealable/order/hands_1.mcfunction | 6 +- .../stealable/order/hands_2.mcfunction | 6 +- .../stealable/steal_equipment.mcfunction | 14 ++-- .../stealable/steal_hand.mcfunction | 6 +- .../stealable/steal_slot/chest.mcfunction | 2 +- .../stealable/steal_slot/feet.mcfunction | 2 +- .../stealable/steal_slot/head.mcfunction | 2 +- .../stealable/steal_slot/legs.mcfunction | 2 +- .../stealable/steal_slot/mainhand.mcfunction | 2 +- .../stealable/steal_slot/offhand.mcfunction | 2 +- .../stealable/steal_slot/saddle.mcfunction | 2 +- .../{ => reeling}/summon_entity.mcfunction | 2 +- .../villager/action.mcfunction | 8 +-- .../villager/add_gossip.mcfunction | 2 +- .../villager/sell_out.mcfunction | 2 +- .../{fished => reeling}/wolf.mcfunction | 2 +- .../function/summon_item.mcfunction | 2 +- gm4_reeling_rods/entities.csv | 64 +++++++++---------- gm4_reeling_rods/generate_files.py | 8 +-- 51 files changed, 166 insertions(+), 153 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{ => hooked_entity}/is_passenger.mcfunction (73%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => hooked_entity}/item_frame.mcfunction (88%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => hooked_entity}/leash_knot/action.mcfunction (61%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => hooked_entity}/leash_knot/change_leader.mcfunction (84%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => hooked_entity}/leash_knot/leaded_by_knot.mcfunction (79%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => hooked_entity}/painting.mcfunction (82%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/player/{find_fished_entity.mcfunction => find_hooked_entity.mcfunction} (86%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/bee.mcfunction (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/chest_boat/action.mcfunction (72%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/chest_boat/passenger_transfer.mcfunction (82%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/chested_horse.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{ => reeling}/empty_container_entity.mcfunction (97%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/horse.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/llama.mcfunction (95%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/minecart/action.mcfunction (71%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/minecart/passenger_transfer.mcfunction (83%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/mooshroom/action.mcfunction (80%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/mooshroom/passenger_transfer.mcfunction (82%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/sheep.mcfunction (98%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/snow_golem.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_1.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_2.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_3.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_4.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_5.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/equipment_6.mcfunction (51%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/hands_1.mcfunction (58%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/order/hands_2.mcfunction (58%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_equipment.mcfunction (54%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_hand.mcfunction (65%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/chest.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/feet.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/head.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/legs.mcfunction (91%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/mainhand.mcfunction (94%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/offhand.mcfunction (93%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/stealable/steal_slot/saddle.mcfunction (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{ => reeling}/summon_entity.mcfunction (66%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/villager/action.mcfunction (74%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/villager/add_gossip.mcfunction (96%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/villager/sell_out.mcfunction (92%) rename gm4_reeling_rods/data/gm4_reeling_rods/function/{fished => reeling}/wolf.mcfunction (92%) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction index 192ec24b5e..93cb08ac48 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction @@ -2,7 +2,7 @@ # @s = hooked entity # at bobber position # with {damage} -# run from fished/select_type +# run from hooked_entity/select_type # immediate damage (amount scales with enchantment level) execute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule showDeathMessages diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction index 274d5f13b9..a0edd6f2b3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction @@ -1,5 +1,5 @@ # Adds a value from the lookup table to Y motion -# with (lookup_key) +# with {lookup_key} # run from get_motion_to_player $scoreboard players operation $motionY gm4_reeling_rods.math += $$(lookup_key) gm4_reeling_rods.lookup diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/is_passenger.mcfunction similarity index 73% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/is_passenger.mcfunction index 6282558dac..4094996fa6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/is_passenger.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/is_passenger.mcfunction @@ -1,6 +1,6 @@ # checks if @s is a passenger # @s = entity to check # at @s -# run from fished/select_type +# run from hooked_entity/select_type return run execute on vehicle if entity @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction similarity index 88% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction index 4f19a9da83..b0b1fc83ae 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction @@ -1,8 +1,8 @@ -# Action for reeled item frame or glow item frame +# Action for hooked item frame or glow item frame # @s = item frame or glow item frame # at bobber in @s # with {type} -# run from fished/select_type +# run from hooked_entity/select_type $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction similarity index 61% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction index c8724472c3..9e1d261297 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction @@ -1,14 +1,14 @@ -# Action for reeled leash knot +# Action for hooked leash knot # @s = leash knot # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type tag @s add gm4_reeling_rods.leash_knot # distance=..10 is leash distance (1.21.6 CHANGES TO 12) execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ - if function gm4_reeling_rods:fished/leash_knot/leaded_by_knot \ - run function gm4_reeling_rods:fished/leash_knot/change_leader + if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \ + run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/change_leader.mcfunction similarity index 84% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/change_leader.mcfunction index d8c636f7aa..b05ffcb826 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/change_leader.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/change_leader.mcfunction @@ -1,7 +1,7 @@ # Changes a leashed entities leader from a leash knot to a tagged player # @s = entity leaded to leash knot # at leash knot -# run from fished/leash_knot/action +# run from hooked_entity/leash_knot/action data remove entity @s leash data modify entity @s leash.UUID set from entity @p[tag=gm4_reeling_rods.player] UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/leaded_by_knot.mcfunction similarity index 79% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/leaded_by_knot.mcfunction index c8d23ccc6b..2d8177a07b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/leash_knot/leaded_by_knot.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/leaded_by_knot.mcfunction @@ -1,6 +1,6 @@ # Checks if an entity is leashed by the knot in question # @s = a leashable entity # at owner -# run from fished/leash_knot/action +# run from hooked_entity/leash_knot/action return run execute on leasher if entity @s[tag=gm4_reeling_rods.leash_knot] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction index 09ed0a9379..2a51ad8b44 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction @@ -1,7 +1,7 @@ -# Action for reeled painting +# Action for hooked painting # @s = painting # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 80536d7d73..13da5fa709 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -2,15 +2,15 @@ execute unless score reeling_rods gm4_modules matches 1 run data modify storage execute unless score reeling_rods gm4_earliest_version < reeling_rods gm4_modules run scoreboard players operation reeling_rods gm4_earliest_version = reeling_rods gm4_modules scoreboard players set reeling_rods gm4_modules 1 -scoreboard objectives add gm4_reeling_rods.math dummy "gm4_reeling math" -scoreboard objectives add gm4_reeling_rods.lookup dummy "gm4_reeling lookup table" +scoreboard objectives add gm4_reeling_rods.math dummy +scoreboard objectives add gm4_reeling_rods.lookup dummy scoreboard objectives add gm4_reeling_rods.barbed_damage_timer dummy scoreboard objectives add gm4_reeling_rods.barbed_damage_period dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid0 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid1 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid2 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid3 dummy -scoreboard objectives add gm4_reeling_rods.rods_cast minecraft.used:minecraft.fishing_rod "gm4_reeling rods cast" +scoreboard objectives add gm4_reeling_rods.rods_cast minecraft.used:minecraft.fishing_rod # id scoreboard objectives add gm4_reeling_rods.id_bit.0 dummy scoreboard objectives add gm4_reeling_rods.id_bit.1 dummy diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction similarity index 86% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction index ced9a2b695..13558590d7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_fished_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction @@ -1,4 +1,4 @@ -# Finds the entity the player fished +# Finds the entity the player hooked # @s = player who fished # at @s # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} @@ -20,6 +20,7 @@ execute store result score $motionZ gm4_reeling_rods.math run data get storage g # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ - at @s as @e[distance=..42, limit=1, type=!#gm4_reeling_rods:ignore, \ - scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ - ] unless entity @s[tag=smithed.entity] run function gm4_reeling_rods:fished/select_type + at @s as @e[\ + distance=..42, limit=1, type=!#gm4_reeling_rods:ignore, \ + scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ + ] unless entity @s[tag=smithed.entity] run function gm4_reeling_rods:hooked_entity/select_type diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction index 4e2a119250..da45021cf7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/owns_bobber.mcfunction @@ -1,6 +1,6 @@ # Checks if a fishing bobber belongs to the targeted owner # @s = a fishing bobber # at owner -# run from player/find_fished_entity +# run from player/find_hooked_entity return run execute on origin if entity @s[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction index f610f62b68..8bd8354fe9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/received_bit.mcfunction @@ -11,7 +11,7 @@ $execute store result score $bit_count gm4_reeling_rods.math run data get storag execute unless score $bit_count gm4_reeling_rods.math matches 16 run return fail # all bits received -$function gm4_reeling_rods:player/find_fished_entity with storage gm4_reeling_rods:players "$(UUID)" +$function gm4_reeling_rods:player/find_hooked_entity with storage gm4_reeling_rods:players "$(UUID)" # clear storage $data remove storage gm4_reeling_rods:players "$(UUID)" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction index 0808709205..f0fedc1d33 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction @@ -1,7 +1,7 @@ # Separates an entity that needs it # @s = entity with items to be yoinked # at @s -# run from fished/* & fished/*/action & fished/stealable/steal_slot/* +# run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp @@ -10,4 +10,4 @@ execute unless data entity @s Items[] run return 0 # Entities with Items tag data modify storage gm4_reeling_rods:temp motion_vector set from storage gm4_reeling_rods:temp entity_data.Motion -function gm4_reeling_rods:empty_container_entity +function gm4_reeling_rods:reeling/empty_container_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction index a9ba29734d..5ba4399274 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/bee.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction @@ -1,7 +1,7 @@ # Action for reeled bee # @s = bee # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # fail if no nectar execute unless data entity @s {HasNectar:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction similarity index 72% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction index 06f9ddcca2..c2e5410bcd 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction @@ -2,7 +2,7 @@ # @s = chest_boat type # at bobber in @s # with {boat_type} -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} @@ -10,8 +10,8 @@ execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" -execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute at @s on passengers run function gm4_reeling_rods:fished/chest_boat/passenger_transfer +execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp +execute at @s on passengers run function gm4_reeling_rods:reeling/chest_boat/passenger_transfer tp @s ~ -1000 ~ playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/passenger_transfer.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/passenger_transfer.mcfunction index 3cbec803a6..6ea64eff5f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chest_boat/passenger_transfer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/passenger_transfer.mcfunction @@ -1,7 +1,7 @@ # transfer old passenger to new boat # @s = passengers of chest boat type # at old chest boat type -# run from fished/chest_boat/action +# run from reeling/chest_boat/action ride @s dismount ride @s mount @e[type=#gm4:boats,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction index 6afcc2b609..57d5400801 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction @@ -1,7 +1,7 @@ # Action for reeled #gm4_reeling_rods:chested_horse # @s = #gm4_reeling_rods:chested_horse # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction similarity index 97% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction index 46adc389b8..fc7359566e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/empty_container_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction @@ -32,4 +32,4 @@ function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp data remove storage gm4_reeling_rods:temp entity_data.Items[0] # run again if needed -execute if data storage gm4_reeling_rods:temp entity_data.Items[] run function gm4_reeling_rods:empty_container_entity +execute if data storage gm4_reeling_rods:temp entity_data.Items[] run function gm4_reeling_rods:reeling/empty_container_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction index f59c8bc772..c77087ab38 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction @@ -1,7 +1,7 @@ # Action for reeled horse # @s = horse # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction similarity index 95% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction index 6f8c5a6ea9..a895bc4741 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction @@ -1,7 +1,7 @@ # Action for reeled llama or trader llama # @s = llama or trader llama # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction similarity index 71% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction index b4626eebe2..65c6fb0e58 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction @@ -2,7 +2,7 @@ # @s = *_minecart # at bobber in @s # with {block} -# run from fished/select_type +# run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} @@ -10,8 +10,8 @@ function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" -execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute at @s on passengers run function gm4_reeling_rods:fished/minecart/passenger_transfer +execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp +execute at @s on passengers run function gm4_reeling_rods:reeling/minecart/passenger_transfer tp @s ~ -1000 ~ playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction similarity index 83% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction index b98fc0079a..5fc26382dc 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/minecart/passenger_transfer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction @@ -1,7 +1,7 @@ # transfer old passenger to new minecart # @s = passengers of *_minecart # at old *_minecart -# run from fished/minecart/action +# run from reeling/minecart/action ride @s dismount ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction similarity index 80% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction index 820a5c3bbd..3af38e95fa 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction @@ -1,7 +1,7 @@ # Action for reeled mooshroom # @s = mooshroom # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # fail if baby execute unless data entity @s {Age:0} run return fail @@ -18,8 +18,8 @@ data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:cow" -execute at @s run function gm4_reeling_rods:summon_entity with storage gm4_reeling_rods:temp -execute at @s on passengers run function gm4_reeling_rods:fished/mooshroom/passenger_transfer +execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp +execute at @s on passengers run function gm4_reeling_rods:reeling/mooshroom/passenger_transfer tp @s ~ -1000 ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction index 6b232e3410..2b28ce8ae4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/mooshroom/passenger_transfer.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction @@ -1,7 +1,7 @@ # transfer old passenger to new cow # @s = passengers of mooshroom # at old mooshroom -# run from fished/mooshroom/action +# run from reeling/mooshroom/action ride @s dismount ride @s mount @e[type=minecraft:cow,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction similarity index 98% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction index 69a3b48410..f95a691e4b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/sheep.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction @@ -1,7 +1,7 @@ # Action for reeled sheep # @s = sheep # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type execute if data entity @s {Sheared:1} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction index c58b1466e2..78968977ae 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction @@ -1,7 +1,7 @@ # Action for reeled snow_golem # @s = snow_golem # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_1.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_1.mcfunction index 06a58548bb..53c7aef045 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_1.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_1.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_2.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_2.mcfunction index ffd205171c..b60673774a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_2.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_2.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_3.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_3.mcfunction index 6d1cda57b4..5a5399568c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_3.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_3.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_4.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_4.mcfunction index 6047318da9..e786d8157d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_4.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_4.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_5.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_5.mcfunction index 246b79f7f8..3b986da543 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_5.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_5.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_6.mcfunction similarity index 51% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_6.mcfunction index 3a37173fa6..082a9a49d1 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/equipment_6.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_6.mcfunction @@ -1,23 +1,25 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/steal_equipment +# run from reeling/stealable/steal_equipment # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/feet + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.mainhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/head + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/legs + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.offhand * \ + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ - run return run function gm4_reeling_rods:fished/stealable/steal_slot/chest + run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction similarity index 58% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction index fe84d0c6cd..9dbc173cfa 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_1.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction @@ -1,9 +1,9 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_hand # at bobber in @s -# run from fished/stealable/steal_hand +# run from reeling/stealable/steal_hand -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction similarity index 58% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction index 498c62b036..2ed8104e0a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/order/hands_2.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction @@ -1,9 +1,9 @@ # Checks slots to steal # @s = #gm4_reeling_rods:steal_hand # at bobber in @s -# run from fished/stealable/steal_hand +# run from reeling/stealable/steal_hand -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/offhand -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:fished/stealable/steal_slot/mainhand +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand +execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction similarity index 54% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction index 317b72d931..626101ae2e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_equipment.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction @@ -1,13 +1,13 @@ # Pick an order to check equipment slots for stealing # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/select_type & fished/villager/action +# run from hooked_entity/select_type & fished/villager/action execute store result score $order gm4_reeling_rods.math run random value 1..6 -execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:fished/stealable/order/equipment_1 -execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:fished/stealable/order/equipment_2 -execute if score $order gm4_reeling_rods.math matches 3 run return run function gm4_reeling_rods:fished/stealable/order/equipment_3 -execute if score $order gm4_reeling_rods.math matches 4 run return run function gm4_reeling_rods:fished/stealable/order/equipment_4 -execute if score $order gm4_reeling_rods.math matches 5 run return run function gm4_reeling_rods:fished/stealable/order/equipment_5 -execute if score $order gm4_reeling_rods.math matches 6 run return run function gm4_reeling_rods:fished/stealable/order/equipment_6 +execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_1 +execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_2 +execute if score $order gm4_reeling_rods.math matches 3 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_3 +execute if score $order gm4_reeling_rods.math matches 4 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_4 +execute if score $order gm4_reeling_rods.math matches 5 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_5 +execute if score $order gm4_reeling_rods.math matches 6 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction similarity index 65% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction index 2e85b70436..fd73e6b97c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_hand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction @@ -1,9 +1,9 @@ # Pick an order to check hand slots for stealing # @s = #gm4_reeling_rods:steal_hand # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type execute store result score $order gm4_reeling_rods.math run random value 1..2 -execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:fished/stealable/order/hands_1 -execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:fished/stealable/order/hands_2 +execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:reeling/stealable/order/hands_1 +execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:reeling/stealable/order/hands_2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction index 4ec5d24396..80cf97c369 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction @@ -1,7 +1,7 @@ # Steal Chest # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/equipment_* +# run from reeling/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction index 72b9ea1b1b..88171fd7a5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction @@ -1,7 +1,7 @@ # Steal Feet # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/equipment_* +# run from reeling/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction index 9379cdb3d0..cc4fb722e0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction @@ -1,7 +1,7 @@ # Steal Head # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/equipment_* +# run from reeling/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction similarity index 91% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction index e4426af741..3d427b33f0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction @@ -1,7 +1,7 @@ # Steal Legs # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/equipment_* +# run from reeling/stealable/order/equipment_* data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction similarity index 94% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction index f37fb2a617..4d3f40410b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction @@ -1,7 +1,7 @@ # Steal Mainhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/* +# run from reeling/stealable/order/* data modify storage gm4_reeling_rods:temp item_data.Item set value {} # need SelectedItem to work with players diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction similarity index 93% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction index 28f7de3b1b..f08769b6f2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction @@ -1,7 +1,7 @@ # Steal Offhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from fished/stealable/order/* +# run from reeling/stealable/order/* data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction index f7735cf843..ced2e5b53f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/stealable/steal_slot/saddle.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction @@ -1,7 +1,7 @@ # Steal Saddle # @s = #gm4_reeling_rods:steal_saddle # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # fail if no saddle execute unless data entity @s equipment.saddle run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction similarity index 66% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction index 83e23266a2..af96df885a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction @@ -1,5 +1,5 @@ # Summons a generic entity with data # with {entity_type, entity_data} -# run from fished/{minecart/chest_boat}/action +# run from reeling/{minecart/chest_boat/mooshroom}/action $summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction similarity index 74% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction index c27198142b..bd108cdde2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction @@ -1,25 +1,25 @@ # Action for reeled villager # @s = villager # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # store mainhand data for a potential trade steal data modify storage gm4_reeling_rods:temp entity_data set value {} data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s equipment.mainhand # try to steal -execute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:fished/stealable/steal_equipment +execute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:reeling/stealable/steal_equipment # if not mainhand, return execute unless score $slot gm4_reeling_rods.math matches 1 run return fail ## mainhand stolen (TRADED ITEM) # find trade and sell it out -function gm4_reeling_rods:fished/villager/sell_out with storage gm4_reeling_rods:temp entity_data +function gm4_reeling_rods:reeling/villager/sell_out with storage gm4_reeling_rods:temp entity_data # adds 20 "major_negative" gossip of the player to the villager data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @p[tag=gm4_reeling_rods.player] UUID -function gm4_reeling_rods:fished/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip +function gm4_reeling_rods:reeling/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip # angry particles particle minecraft:angry_villager ~ ~ ~ 0.3 0.3 0.3 20 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction similarity index 96% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction index 76fce999ac..b2b680cf77 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/add_gossip.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction @@ -2,7 +2,7 @@ # @s = villager # at bobber in @s # with {Target} -# run from fished/villager/action +# run from reeling/villager/action $execute store success score $success gm4_reeling_rods.math run \ data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction index 67b923541f..2100fff4af 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/villager/sell_out.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction @@ -2,7 +2,7 @@ # @s = villager # at bobber in @s # with {mainhand} -# run from fished/villager/action +# run from reeling/villager/action # for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though $data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction similarity index 92% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction index 7aefb557b4..b9df535663 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/fished/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction @@ -1,7 +1,7 @@ # Action for reeled wolf # @s = wolf # at bobber in @s -# run from fished/select_type +# run from hooked_entity/select_type # fail if no Owner and if no armor execute unless data entity @s Owner run return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction index 091e2dd2a7..d69d6929fb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction @@ -1,4 +1,4 @@ # Summons item with data -# run from pull_items and empty_container_entity +# run from pull_items & reeling/empty_container_entity $summon minecraft:item ~ ~ ~ $(item_data) diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index ec7c03742d..ce10e17ab1 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -1,33 +1,33 @@ -id,needs_enchantment,can_dismount,command -#gm4_reeling_rods:chested_horse,TRUE,TRUE,"function gm4_reeling_rods:fished/chested_horse" -#gm4_reeling_rods:llamas,TRUE,TRUE,"function gm4_reeling_rods:fished/llama" -#gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_equipment" -#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_hand" -#gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:fished/stealable/steal_slot/saddle" -minecraft:bee,TRUE,TRUE,"function gm4_reeling_rods:fished/bee" -minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:fished/horse" -minecraft:mooshroom,TRUE,TRUE,"function gm4_reeling_rods:fished/mooshroom/action" -minecraft:sheep,TRUE,TRUE,"function gm4_reeling_rods:fished/sheep" -minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:fished/snow_golem" -minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:fished/villager/action" -minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:fished/wolf" +id,needs_reeling,can_dismount,command +#gm4_reeling_rods:chested_horse,TRUE,TRUE,"function gm4_reeling_rods:reeling/chested_horse" +#gm4_reeling_rods:llamas,TRUE,TRUE,"function gm4_reeling_rods:reeling/llama" +#gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_equipment" +#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_hand" +#gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_slot/saddle" +minecraft:bee,TRUE,TRUE,"function gm4_reeling_rods:reeling/bee" +minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:reeling/horse" +minecraft:mooshroom,TRUE,TRUE,"function gm4_reeling_rods:reeling/mooshroom/action" +minecraft:sheep,TRUE,TRUE,"function gm4_reeling_rods:reeling/sheep" +minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:reeling/snow_golem" +minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:reeling/villager/action" +minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:reeling/wolf" +minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" +minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" +minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" +minecraft:tnt_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:tnt'}" +minecraft:acacia_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}" +minecraft:bamboo_chest_raft,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" +minecraft:birch_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}" +minecraft:cherry_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:cherry_boat'}" +minecraft:dark_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" +minecraft:jungle_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:jungle_boat'}" +minecraft:mangrove_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" +minecraft:oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:oak_boat'}" +minecraft:pale_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" +minecraft:spruce_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:spruce_boat'}" minecraft:shulker,FALSE,TRUE,"execute at @s facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1" -minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:chest'}" -minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:furnace'}" -minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:hopper'}" -minecraft:tnt_minecart,TRUE,FALSE,"function gm4_reeling_rods:fished/minecart/action {block:'minecraft:tnt'}" -minecraft:acacia_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:acacia_boat'}" -minecraft:bamboo_chest_raft,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" -minecraft:birch_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:birch_boat'}" -minecraft:cherry_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:cherry_boat'}" -minecraft:dark_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" -minecraft:jungle_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:jungle_boat'}" -minecraft:mangrove_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" -minecraft:oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:oak_boat'}" -minecraft:pale_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" -minecraft:spruce_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:fished/chest_boat/action {boat_type:'minecraft:spruce_boat'}" -minecraft:end_crystal,FALSE,FALSE,"damage @s 1" -minecraft:glow_item_frame,FALSE,FALSE,"function gm4_reeling_rods:fished/item_frame {type:'minecraft:glow_item_frame'}" -minecraft:item_frame,FALSE,FALSE,"function gm4_reeling_rods:fished/item_frame {type:'minecraft:item_frame'}" -minecraft:leash_knot,FALSE,FALSE,"function gm4_reeling_rods:fished/leash_knot/action" -minecraft:painting,FALSE,FALSE,"function gm4_reeling_rods:fished/painting" +minecraft:end_crystal,FALSE,FALSE,"damage @s 1 minecraft:player_attack by @p[tag=gm4_reeling_rods.player]" +minecraft:glow_item_frame,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:glow_item_frame'}" +minecraft:item_frame,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:item_frame'}" +minecraft:leash_knot,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/leash_knot/action" +minecraft:painting,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/painting" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 04d85b4fbd..17e8c0612a 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -109,7 +109,7 @@ def create_select_type(ctx: Context, entities: CSV): "# Selects the right entity type or dismounts the entity. Generated by generate_files.py.", "# @s = fished entity", "# at bobber in entity", - "# run from player/find_fished_entity", + "# run from player/find_hooked_entity", "", "# apply barbed damage", "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", @@ -117,7 +117,7 @@ def create_select_type(ctx: Context, entities: CSV): "# non-dismountable entities", "", "# dismounting logic", - "execute if function gm4_reeling_rods:is_passenger run return run ride @s dismount", + "execute if function gm4_reeling_rods:hooked_entity/is_passenger run return run ride @s dismount", "", "# dismountable entities", ] @@ -127,7 +127,7 @@ def create_select_type(ctx: Context, entities: CSV): f"execute if entity @s[type={entity['id']}] run return run " + ( "execute if data storage gm4_reeling_rods:temp enchanted.reeling run " - if entity["needs_enchantment"].as_bool() + if entity["needs_reeling"].as_bool() else "" ) + entity["command"] @@ -137,4 +137,4 @@ def create_select_type(ctx: Context, entities: CSV): else: lines.insert(9, command) # non-dismountable entities should be handled first and are inserted before the dismountable entities - ctx.data["gm4_reeling_rods:fished/select_type"] = Function(lines) + ctx.data["gm4_reeling_rods:hooked_entity/select_type"] = Function(lines) From a1f8bddd3e18ff25a8ad30e8927c280de5963db2 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 12:02:45 +0900 Subject: [PATCH 069/101] Add Bloo to credits --- gm4_reeling_rods/beet.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index 92b9f78089..b98439580f 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -28,7 +28,8 @@ meta: video: null wiki: https://wiki.gm4.co/wiki/Reeling_Rods credits: - Creator: + Creators: - runcows + - Bloo #Icon Design: #- runcows From d6f68b4fc7243f0536890c62c3a58511c1bc6afc Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 12:07:36 +0900 Subject: [PATCH 070/101] Missed renaming for reorganization --- gm4_reeling_rods/generate_files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 17e8c0612a..6ab8865212 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -8,7 +8,7 @@ def beet_default(ctx: Context): """NOTE: generates files - set_lookup_table - advancements and reward functions for every bit state of an entity's tagged id - - fished/select_type + - hooked_entity/select_type """ create_lookup_file(ctx) create_bit_advancements(ctx) @@ -107,7 +107,7 @@ def create_bit_advancements(ctx: Context): def create_select_type(ctx: Context, entities: CSV): lines = [ "# Selects the right entity type or dismounts the entity. Generated by generate_files.py.", - "# @s = fished entity", + "# @s = hooked entity", "# at bobber in entity", "# run from player/find_hooked_entity", "", From 0c0f6a6238bc31bf93210b1da82dd13022240917 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 9 Jun 2025 12:11:37 +0900 Subject: [PATCH 071/101] minor changes --- gm4_reeling_rods/generate_files.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 6ab8865212..00f4423049 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -7,7 +7,7 @@ def beet_default(ctx: Context): """NOTE: generates files - set_lookup_table - - advancements and reward functions for every bit state of an entity's tagged id + - advancements and reward functions for every bit state of an entity's scoreboard id - hooked_entity/select_type """ create_lookup_file(ctx) @@ -31,11 +31,19 @@ def beet_default(ctx: Context): Can have armor on them through commands (not dispensed), but doesn't render Probably shouldn't theft armor that can't be applied by players, that's the realm of datapackers Using hand item theft function + - CANT STEAL PILLAGER BANNER. Is that bad? Nugget idea? Try to use drop chances for armor and if it fails drop armor material? What about datapack armor?... I worry about compatibility Probably want to implement drop chances one way though + Drowned Trident Theft + Super easy. Just lure them on land and then yoink it + Probably want to balance that + Drop Chances + Should implement for balance + Maybe just have gear break if the drop chance fails? + That's the best idea so far I think \\ ---[ REJECTED FOR A REASON ]--- \\ Enderman : From fc7a39a98ee0c4941f21bbdd887dd5b53ee07757 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 10 Jun 2025 06:20:02 +0900 Subject: [PATCH 072/101] Fix item data not being reset all the time --- .../data/gm4_reeling_rods/function/reeling/bee.mcfunction | 1 + .../function/reeling/chest_boat/action.mcfunction | 1 + .../function/reeling/minecart/action.mcfunction | 1 + .../function/reeling/mooshroom/action.mcfunction | 2 ++ .../data/gm4_reeling_rods/function/reeling/sheep.mcfunction | 2 +- .../gm4_reeling_rods/function/reeling/snow_golem.mcfunction | 1 + .../data/gm4_reeling_rods/function/reeling/wolf.mcfunction | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction index 5ba4399274..7f714d28ac 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction @@ -7,6 +7,7 @@ execute unless data entity @s {HasNectar:1b} run return fail # Steal +data modify storage gm4_reeling_rods:temp item_data set value {} data merge entity @s {HasNectar:0b,AngerTime:300} data modify entity @s AngryAt set from entity @p[tag=gm4_reeling_rods.player] UUID data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction index c2e5410bcd..b916597432 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction @@ -5,6 +5,7 @@ # run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction index 65c6fb0e58..c58a14e2c4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction @@ -5,6 +5,7 @@ # run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp entity_data set from entity @s +data modify storage gm4_reeling_rods:temp item_data set value {} $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} function gm4_reeling_rods:pull_items data remove storage gm4_reeling_rods:temp entity_data.UUID diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction index 3af38e95fa..5df92f1115 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction @@ -5,6 +5,8 @@ # fail if baby execute unless data entity @s {Age:0} run return fail + +data modify storage gm4_reeling_rods:temp item_data set value {} # set item id to correct mushroom type execute if data entity @s {Type:"red"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:red_mushroom" execute if data entity @s {Type:"brown"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:brown_mushroom" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction index f95a691e4b..0d985c2759 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction @@ -6,7 +6,7 @@ execute if data entity @s {Sheared:1} run return fail data modify entity @s Sheared set value true - +data modify storage gm4_reeling_rods:temp item_data set value {} execute if data entity @s {Color:0b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:white_wool",count:1} execute if data entity @s {Color:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:orange_wool",count:1} execute if data entity @s {Color:2b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:magenta_wool",count:1} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction index 78968977ae..2372429b18 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction @@ -6,6 +6,7 @@ # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail +data modify storage gm4_reeling_rods:temp item_data set value {} data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction index b9df535663..19c29bef16 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction @@ -7,6 +7,7 @@ execute unless data entity @s Owner run return fail execute unless data entity @s equipment.body run return fail +data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body item replace entity @s armor.body with air function gm4_reeling_rods:pull_items From 54110bb15768f90d76f337ed6b55008812a237e2 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 10 Jun 2025 06:30:12 +0900 Subject: [PATCH 073/101] Change barbed to explode tnt minecarts --- gm4_reeling_rods/generate_files.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 00f4423049..99b921dc0c 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -121,6 +121,7 @@ def create_select_type(ctx: Context, entities: CSV): "", "# apply barbed damage", "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", + "execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] run return run data modify entity @s fuse set value 0s", "", "# non-dismountable entities", "", @@ -143,6 +144,6 @@ def create_select_type(ctx: Context, entities: CSV): if entity["can_dismount"].as_bool(): lines.append(command) # dismountable entities should be handled last and are appended to the end of the function else: - lines.insert(9, command) # non-dismountable entities should be handled first and are inserted before the dismountable entities + lines.insert(10, command) # non-dismountable entities should be handled first and are inserted before the dismountable entities ctx.data["gm4_reeling_rods:hooked_entity/select_type"] = Function(lines) From 7cd9565b3ab70227f66dda980571ccccc2cf0617 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 10 Jun 2025 22:57:48 +0900 Subject: [PATCH 074/101] Rework hooked_entity/select_type to use bolt in file instead of generating file --- gm4_reeling_rods/beet.yaml | 3 + .../hooked_entity/end_crystal.mcfunction | 6 ++ .../hooked_entity/select_type.mcfunction | 26 ++++++++ .../function/hooked_entity/shulker.mcfunction | 6 ++ gm4_reeling_rods/entities.csv | 66 +++++++++---------- gm4_reeling_rods/generate_files.py | 58 ++++------------ 6 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index b98439580f..038f49501e 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -9,6 +9,9 @@ pipeline: - generate_files - gm4.plugins.extend.module +require: + - bolt + meta: gm4: versioning: diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction new file mode 100644 index 0000000000..2d8b8e5acc --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction @@ -0,0 +1,6 @@ +# Action for hooked end_crystal +# @s = end_crystal +# at bobber in @s +# run from hooked_entity/select_type + +damage @s 1 minecraft:player_attack by @p[tag=gm4_reeling_rods.player] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction new file mode 100644 index 0000000000..5bf9fb085c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction @@ -0,0 +1,26 @@ +# Selects the right entity type or dismounts the entity. +# @s = hooked entity +# at bobber in entity +# run from player/find_hooked_entity + +# apply barbed damage +execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} \ + unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed +execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] run return run data modify entity @s fuse set value 0s + +raw # non-dismountable entities +for entity in ctx.meta['non_dismountable_entities']: + if entity['needs_reeling'].as_bool(): + execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function'] + else: + execute if entity @s[type=entity['id']] run return run function entity['function'] + +raw # dismounting logic +execute if function gm4_reeling_rods:hooked_entity/is_passenger run return run ride @s dismount + +raw # dismountable entities +for entity in ctx.meta['dismountable_entities']: + if entity['needs_reeling'].as_bool(): + execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function'] + else: + execute if entity @s[type=entity['id']] run return run function entity['function'] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction new file mode 100644 index 0000000000..fff2b7575b --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction @@ -0,0 +1,6 @@ +# Action for hooked shulker +# @s = shulker +# at bobber in @s +# run from hooked_entity/select_type + +execute at @s facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1 diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index ce10e17ab1..d7457485da 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -1,33 +1,33 @@ -id,needs_reeling,can_dismount,command -#gm4_reeling_rods:chested_horse,TRUE,TRUE,"function gm4_reeling_rods:reeling/chested_horse" -#gm4_reeling_rods:llamas,TRUE,TRUE,"function gm4_reeling_rods:reeling/llama" -#gm4_reeling_rods:steal_equipment,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_equipment" -#gm4_reeling_rods:steal_hand,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_hand" -#gm4_reeling_rods:steal_saddle,TRUE,TRUE,"function gm4_reeling_rods:reeling/stealable/steal_slot/saddle" -minecraft:bee,TRUE,TRUE,"function gm4_reeling_rods:reeling/bee" -minecraft:horse,TRUE,TRUE,"function gm4_reeling_rods:reeling/horse" -minecraft:mooshroom,TRUE,TRUE,"function gm4_reeling_rods:reeling/mooshroom/action" -minecraft:sheep,TRUE,TRUE,"function gm4_reeling_rods:reeling/sheep" -minecraft:snow_golem,TRUE,TRUE,"function gm4_reeling_rods:reeling/snow_golem" -minecraft:villager,TRUE,TRUE,"function gm4_reeling_rods:reeling/villager/action" -minecraft:wolf,TRUE,TRUE,"function gm4_reeling_rods:reeling/wolf" -minecraft:chest_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" -minecraft:furnace_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" -minecraft:hopper_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" -minecraft:tnt_minecart,TRUE,FALSE,"function gm4_reeling_rods:reeling/minecart/action {block:'minecraft:tnt'}" -minecraft:acacia_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}" -minecraft:bamboo_chest_raft,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" -minecraft:birch_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}" -minecraft:cherry_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:cherry_boat'}" -minecraft:dark_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" -minecraft:jungle_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:jungle_boat'}" -minecraft:mangrove_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" -minecraft:oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:oak_boat'}" -minecraft:pale_oak_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" -minecraft:spruce_chest_boat,TRUE,FALSE,"function gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:spruce_boat'}" -minecraft:shulker,FALSE,TRUE,"execute at @s facing entity @a[tag=gm4_reeling_rods.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1" -minecraft:end_crystal,FALSE,FALSE,"damage @s 1 minecraft:player_attack by @p[tag=gm4_reeling_rods.player]" -minecraft:glow_item_frame,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:glow_item_frame'}" -minecraft:item_frame,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:item_frame'}" -minecraft:leash_knot,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/leash_knot/action" -minecraft:painting,FALSE,FALSE,"function gm4_reeling_rods:hooked_entity/painting" +id,needs_reeling,can_dismount,function +#gm4_reeling_rods:chested_horse,TRUE,TRUE,"gm4_reeling_rods:reeling/chested_horse" +#gm4_reeling_rods:llamas,TRUE,TRUE,"gm4_reeling_rods:reeling/llama" +#gm4_reeling_rods:steal_equipment,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_equipment" +#gm4_reeling_rods:steal_hand,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_hand" +#gm4_reeling_rods:steal_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/saddle" +minecraft:bee,TRUE,TRUE,"gm4_reeling_rods:reeling/bee" +minecraft:horse,TRUE,TRUE,"gm4_reeling_rods:reeling/horse" +minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom/action" +minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" +minecraft:snow_golem,TRUE,TRUE,"gm4_reeling_rods:reeling/snow_golem" +minecraft:villager,TRUE,TRUE,"gm4_reeling_rods:reeling/villager/action" +minecraft:wolf,TRUE,TRUE,"gm4_reeling_rods:reeling/wolf" +minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" +minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" +minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" +minecraft:tnt_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:tnt'}" +minecraft:acacia_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}" +minecraft:bamboo_chest_raft,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" +minecraft:birch_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}" +minecraft:cherry_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:cherry_boat'}" +minecraft:dark_oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" +minecraft:jungle_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:jungle_boat'}" +minecraft:mangrove_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" +minecraft:oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:oak_boat'}" +minecraft:pale_oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" +minecraft:spruce_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:spruce_boat'}" +minecraft:shulker,FALSE,TRUE,"gm4_reeling_rods:hooked_entity/shulker" +minecraft:end_crystal,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/end_crystal" +minecraft:glow_item_frame,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:glow_item_frame'}" +minecraft:item_frame,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:item_frame'}" +minecraft:leash_knot,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/leash_knot/action" +minecraft:painting,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/painting" diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index 99b921dc0c..d701df545a 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -2,20 +2,27 @@ from beet import Context, Advancement, Function import math from pathlib import Path -from gm4.utils import CSV +from gm4.utils import CSV, CSVRow def beet_default(ctx: Context): - """NOTE: generates files - - set_lookup_table - - advancements and reward functions for every bit state of an entity's scoreboard id - - hooked_entity/select_type + """ + - generates set_lookup_table.mcfunction + - generates advancements and reward functions for every bit state of an entity's scoreboard id + - reads csv to ctx.meta for hooked_entity/select_type.mcfunction """ create_lookup_file(ctx) create_bit_advancements(ctx) entity_list = CSV.from_file(Path('gm4_reeling_rods','entities.csv')) - - create_select_type(ctx, entity_list) + dismountable_entities: list[CSVRow] = [] + non_dismountable_entities: list[CSVRow] = [] + for entity_type in entity_list: + if entity_type['can_dismount'].as_bool(): + dismountable_entities.append(entity_type) + continue + non_dismountable_entities.append(entity_type) + ctx.meta['dismountable_entities'] = dismountable_entities + ctx.meta['non_dismountable_entities'] = non_dismountable_entities ''' My goal for right now is to go to the maximum scope and then have things cut back. Push this idea as far as I can, then reign it in. @@ -110,40 +117,3 @@ def create_bit_advancements(ctx: Context): "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", "tag @s remove gm4_reeling_rods.player" ]) - - -def create_select_type(ctx: Context, entities: CSV): - lines = [ - "# Selects the right entity type or dismounts the entity. Generated by generate_files.py.", - "# @s = hooked entity", - "# at bobber in entity", - "# run from player/find_hooked_entity", - "", - "# apply barbed damage", - "execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed", - "execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] run return run data modify entity @s fuse set value 0s", - "", - "# non-dismountable entities", - "", - "# dismounting logic", - "execute if function gm4_reeling_rods:hooked_entity/is_passenger run return run ride @s dismount", - "", - "# dismountable entities", - ] - - for entity in entities: - command = ( - f"execute if entity @s[type={entity['id']}] run return run " - + ( - "execute if data storage gm4_reeling_rods:temp enchanted.reeling run " - if entity["needs_reeling"].as_bool() - else "" - ) - + entity["command"] - ) - if entity["can_dismount"].as_bool(): - lines.append(command) # dismountable entities should be handled last and are appended to the end of the function - else: - lines.insert(10, command) # non-dismountable entities should be handled first and are inserted before the dismountable entities - - ctx.data["gm4_reeling_rods:hooked_entity/select_type"] = Function(lines) From ec3c85369c6f30d9aa93e3aa9471d26bd8c6672d Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 11 Jun 2025 11:09:11 +0900 Subject: [PATCH 075/101] Add drop chance usage to reeling --- .../reeling/stealable/break_slot/chest.mcfunction | 8 ++++++++ .../reeling/stealable/break_slot/feet.mcfunction | 8 ++++++++ .../reeling/stealable/break_slot/head.mcfunction | 8 ++++++++ .../reeling/stealable/break_slot/legs.mcfunction | 8 ++++++++ .../reeling/stealable/break_slot/mainhand.mcfunction | 8 ++++++++ .../reeling/stealable/break_slot/offhand.mcfunction | 8 ++++++++ .../reeling/stealable/check_drop_chance.mcfunction | 6 ++++++ .../reeling/stealable/steal_slot/chest.mcfunction | 7 +++++++ .../reeling/stealable/steal_slot/feet.mcfunction | 7 +++++++ .../reeling/stealable/steal_slot/head.mcfunction | 7 +++++++ .../reeling/stealable/steal_slot/legs.mcfunction | 7 +++++++ .../reeling/stealable/steal_slot/mainhand.mcfunction | 7 +++++++ .../reeling/stealable/steal_slot/offhand.mcfunction | 7 +++++++ .../tags/entity_type/ignore_drop_chances.json | 11 +++++++++++ 14 files changed, 107 insertions(+) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction new file mode 100644 index 0000000000..848f3b59de --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction @@ -0,0 +1,8 @@ +# Break Chest Slot +# @s = #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/chest + +item replace entity @s armor.chest with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction new file mode 100644 index 0000000000..273568928c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction @@ -0,0 +1,8 @@ +# Break Feet Slot +# @s = #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/feet + +item replace entity @s armor.feet with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction new file mode 100644 index 0000000000..b500f1ab82 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction @@ -0,0 +1,8 @@ +# Break Head Slot +# @s = #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/Head + +item replace entity @s armor.head with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction new file mode 100644 index 0000000000..12ebd7c65c --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction @@ -0,0 +1,8 @@ +# Break Legs Slot +# @s = #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/legs + +item replace entity @s armor.legs with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction new file mode 100644 index 0000000000..23d46220b5 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction @@ -0,0 +1,8 @@ +# Break Mainhand Slot +# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/mainhand + +item replace entity @s weapon.mainhand with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction new file mode 100644 index 0000000000..f73553d30a --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction @@ -0,0 +1,8 @@ +# Break Offhand Slot +# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment +# at bobber in @s +# run from reeling/stealable/steal_slot/offhand + +item replace entity @s weapon.offhand with minecraft:air +playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction new file mode 100644 index 0000000000..bc6f1fb292 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction @@ -0,0 +1,6 @@ +# checks drop chance against random +# run from reeling/stealable/steal_slot/* + +execute store result score $rand gm4_reeling_rods.math run random value 1..1000 +execute if score $rand gm4_reeling_rods.math <= $drop_chance gm4_reeling_rods.math run return 1 +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction index 80cf97c369..89de3b2667 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute if data entity @s drop_chances.chest store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.chest 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/chest + data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest item replace entity @s armor.chest with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction index 88171fd7a5..b2049af2fa 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute if data entity @s drop_chances.feet store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.feet 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/feet + data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet item replace entity @s armor.feet with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction index cc4fb722e0..dcd9687d51 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute if data entity @s drop_chances.head store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.head 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/head + data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head item replace entity @s armor.head with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction index 3d427b33f0..4cf2e5731f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute if data entity @s drop_chances.legs store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.legs 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/legs + data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs item replace entity @s armor.legs with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction index 4d3f40410b..173c6bfc81 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute unless entity @s[type=vex] if data entity @s drop_chances.mainhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.mainhand 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/mainhand + data modify storage gm4_reeling_rods:temp item_data.Item set value {} # need SelectedItem to work with players data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction index f08769b6f2..a87318e64a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction @@ -3,6 +3,13 @@ # at bobber in @s # run from reeling/stealable/order/* +scoreboard players set $drop_chance gm4_reeling_rods.math 85 +execute if data entity @s drop_chances.offhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.offhand 1000 +execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ + unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ + unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ + run return run function gm4_reeling_rods:reeling/stealable/break_slot/offhand + data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json new file mode 100644 index 0000000000..2562dee1e3 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json @@ -0,0 +1,11 @@ +{ + "values": [ + "minecraft:allay", + "minecraft:armor_stand", + "minecraft:fox", + "minecraft:player", + "minecraft:villager", + "minecraft:wandering_trader", + "minecraft:witch" + ] +} From aa51550ce20ef1a13f8416e21a2851fdccebf911 Mon Sep 17 00:00:00 2001 From: runcows Date: Fri, 27 Jun 2025 10:11:41 +0900 Subject: [PATCH 076/101] Drop Chance Rework - if 0%, playsound and fail - else, yoink - there are exceptions for stealing mainhand Also did some reorganization to make this easier to update in the future --- .../function/reeling/chested_horse.mcfunction | 12 +++--------- .../function/reeling/horse.mcfunction | 13 +++---------- .../function/reeling/llama.mcfunction | 11 +++-------- .../stealable/break_slot/chest.mcfunction | 8 -------- .../stealable/break_slot/feet.mcfunction | 8 -------- .../stealable/break_slot/head.mcfunction | 8 -------- .../stealable/break_slot/legs.mcfunction | 8 -------- .../stealable/break_slot/offhand.mcfunction | 8 -------- .../stealable/steal_slot/body.mcfunction | 17 +++++++++++++++++ .../stealable/steal_slot/chest.mcfunction | 9 +++------ .../steal_slot/chested_horse.mcfunction | 16 ++++++++++++++++ .../stealable/steal_slot/feet.mcfunction | 9 +++------ .../stealable/steal_slot/head.mcfunction | 9 +++------ .../stealable/steal_slot/legs.mcfunction | 9 +++------ .../stealable/steal_slot/mainhand.mcfunction | 15 ++++++++++----- .../stealable/steal_slot/offhand.mcfunction | 9 +++------ .../stealable/steal_slot/saddle.mcfunction | 4 ++++ .../reeling/stealable/zero_chance.mcfunction | 5 +++++ .../function/reeling/wolf.mcfunction | 15 --------------- .../tags/entity_type/ignore_drop_chances.json | 11 ----------- gm4_reeling_rods/entities.csv | 2 +- 21 files changed, 77 insertions(+), 129 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction index 57d5400801..8c9ced17b5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction @@ -3,12 +3,6 @@ # at bobber in @s # run from hooked_entity/select_type -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle -execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -function gm4_reeling_rods:pull_items -execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b -item replace entity @s saddle with minecraft:air - -execute if data storage gm4_reeling_rods:temp item_data.Item run \ - playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ +# chest, then saddle +execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \ + run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction index c77087ab38..049fec52ad 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/horse.mcfunction @@ -3,13 +3,6 @@ # at bobber in @s # run from hooked_entity/select_type -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body -execute store result score $armored gm4_reeling_rods.math if items entity @s armor.body * -function gm4_reeling_rods:pull_items -execute if score $armored gm4_reeling_rods.math matches 0 run item replace entity @s saddle with minecraft:air -execute if score $armored gm4_reeling_rods.math matches 1 run item replace entity @s armor.body with minecraft:air - -execute if data storage gm4_reeling_rods:temp item_data.Item run \ - playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ +# armor, then saddle +execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/body \ + run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction index a895bc4741..43c3b59ea7 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction @@ -3,11 +3,6 @@ # at bobber in @s # run from hooked_entity/select_type -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body -execute if data entity @s {ChestedHorse:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} -function gm4_reeling_rods:pull_items -execute if data storage gm4_reeling_rods:temp item_data.Item run \ - playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ -execute if data entity @s {ChestedHorse:1b} run return run data modify entity @s ChestedHorse set value 0b -item replace entity @s armor.body with minecraft:air +# chest, then carpet +execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \ + run function gm4_reeling_rods:reeling/stealable/steal_slot/body diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction deleted file mode 100644 index 848f3b59de..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/chest.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Break Chest Slot -# @s = #gm4_reeling_rods:steal_equipment -# at bobber in @s -# run from reeling/stealable/steal_slot/chest - -item replace entity @s armor.chest with minecraft:air -playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction deleted file mode 100644 index 273568928c..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/feet.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Break Feet Slot -# @s = #gm4_reeling_rods:steal_equipment -# at bobber in @s -# run from reeling/stealable/steal_slot/feet - -item replace entity @s armor.feet with minecraft:air -playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction deleted file mode 100644 index b500f1ab82..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/head.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Break Head Slot -# @s = #gm4_reeling_rods:steal_equipment -# at bobber in @s -# run from reeling/stealable/steal_slot/Head - -item replace entity @s armor.head with minecraft:air -playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction deleted file mode 100644 index 12ebd7c65c..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/legs.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Break Legs Slot -# @s = #gm4_reeling_rods:steal_equipment -# at bobber in @s -# run from reeling/stealable/steal_slot/legs - -item replace entity @s armor.legs with minecraft:air -playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction deleted file mode 100644 index f73553d30a..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/offhand.mcfunction +++ /dev/null @@ -1,8 +0,0 @@ -# Break Offhand Slot -# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment -# at bobber in @s -# run from reeling/stealable/steal_slot/offhand - -item replace entity @s weapon.offhand with minecraft:air -playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction new file mode 100644 index 0000000000..c72541fbbf --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction @@ -0,0 +1,17 @@ +# Steal Body +# @s = wolf, llama or horse +# at bobber in @s +# run from hooked_entity/select_type & reeling/llama & reeling/horse + +# fail if no body slot +execute unless data entity @s equipment.body run return fail +# fail if 0% drop chance +execute if data entity @s {drop_chances:{body:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +# yoink +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body +function gm4_reeling_rods:pull_items +item replace entity @s armor.body with minecraft:air + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ +return 8 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction index 89de3b2667..6c29f1d98b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction @@ -3,13 +3,10 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute if data entity @s drop_chances.chest store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.chest 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ - unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ - run return run function gm4_reeling_rods:reeling/stealable/break_slot/chest +# fail if 0% drop chance +execute if data entity @s {drop_chances:{chest:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest item replace entity @s armor.chest with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction new file mode 100644 index 0000000000..34368379af --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction @@ -0,0 +1,16 @@ +# Steal Chested Horse chest and items inside +# @s = #gm4_reeling_rods:chested_horse or llama / trader llama +# at bobber in @s +# run from reeling/llama & reeling/chested_horse + +# fail if not chested horse +execute unless data entity @s {ChestedHorse:1b} run return fail + +data modify storage gm4_reeling_rods:temp item_data set value {} +data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} +function gm4_reeling_rods:pull_items +data modify entity @s ChestedHorse set value 0b + +playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ + +return 9 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction index b2049af2fa..9b2d346c9b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction @@ -3,13 +3,10 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute if data entity @s drop_chances.feet store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.feet 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ - unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ - run return run function gm4_reeling_rods:reeling/stealable/break_slot/feet +# fail if 0% drop chance +execute if data entity @s {drop_chances:{feet:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet item replace entity @s armor.feet with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction index dcd9687d51..9e958eb9cf 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction @@ -3,13 +3,10 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute if data entity @s drop_chances.head store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.head 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ - unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ - run return run function gm4_reeling_rods:reeling/stealable/break_slot/head +# fail if 0% drop chance +execute if data entity @s {drop_chances:{head:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head item replace entity @s armor.head with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction index 4cf2e5731f..f328b8dda0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction @@ -3,13 +3,10 @@ # at bobber in @s # run from reeling/stealable/order/equipment_* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute if data entity @s drop_chances.legs store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.legs 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ - unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ - run return run function gm4_reeling_rods:reeling/stealable/break_slot/legs +# fail if 0% drop chance +execute if data entity @s {drop_chances:{legs:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs item replace entity @s armor.legs with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction index 173c6bfc81..2e1c11cdd8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction @@ -3,15 +3,20 @@ # at bobber in @s # run from reeling/stealable/order/* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute unless entity @s[type=vex] if data entity @s drop_chances.mainhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.mainhand 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ +## drop chance fail conditions +# to use default drop chances, we'd use 85 here as 8.5%, but we're setting it to 11.5% to match looting 3 chances +scoreboard players set $drop_chance gm4_reeling_rods.math 115 +execute if data entity @s drop_chances.mainhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.mainhand 1000 +# villager and vex should ignore 0% drop chance on mainhand, otherwise fail if 0% +execute if entity @s[type=!vex,type=!villager] if score $drop_chance gm4_reeling_rods.math matches 0 run return run function gm4_reeling_rods:reeling/stealable/zero_chance +# drowned holding trident needs to roll chance +execute if entity @s[type=drowned] if items entity @s weapon.mainhand trident \ unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ run return run function gm4_reeling_rods:reeling/stealable/break_slot/mainhand +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} -# need SelectedItem to work with players +# need SelectedItem to work with players since players don't use equipment.mainhand data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand item replace entity @s weapon.mainhand with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction index a87318e64a..78b2e5af84 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction @@ -3,13 +3,10 @@ # at bobber in @s # run from reeling/stealable/order/* -scoreboard players set $drop_chance gm4_reeling_rods.math 85 -execute if data entity @s drop_chances.offhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.offhand 1000 -execute unless entity @s[type=#gm4_reeling_rods:ignore_drop_chances] \ - unless score $drop_chance gm4_reeling_rods.math matches 1000.. \ - unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ - run return run function gm4_reeling_rods:reeling/stealable/break_slot/offhand +# fail if 0% drop chance +execute if data entity @s {drop_chances:{offhand:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance +## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction index ced2e5b53f..798605765f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction @@ -5,6 +5,8 @@ # fail if no saddle execute unless data entity @s equipment.saddle run return fail +# fail if 0% drop chance +execute if data entity @s {drop_chances:{saddle:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # yoink data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle @@ -12,3 +14,5 @@ function gm4_reeling_rods:pull_items item replace entity @s saddle with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ + +return 7 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction new file mode 100644 index 0000000000..bd1edee817 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction @@ -0,0 +1,5 @@ +# slot has a 0% drop chance, play sound and fail +# run from reeling/stealable/steal_slot/* + +playsound minecraft:item.spyglass.stop_using neutral @a[distance=16] ~ ~ ~ +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction deleted file mode 100644 index 19c29bef16..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/wolf.mcfunction +++ /dev/null @@ -1,15 +0,0 @@ -# Action for reeled wolf -# @s = wolf -# at bobber in @s -# run from hooked_entity/select_type - -# fail if no Owner and if no armor -execute unless data entity @s Owner run return fail -execute unless data entity @s equipment.body run return fail - -data modify storage gm4_reeling_rods:temp item_data set value {} -data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body -item replace entity @s armor.body with air -function gm4_reeling_rods:pull_items - -playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json deleted file mode 100644 index 2562dee1e3..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore_drop_chances.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "values": [ - "minecraft:allay", - "minecraft:armor_stand", - "minecraft:fox", - "minecraft:player", - "minecraft:villager", - "minecraft:wandering_trader", - "minecraft:witch" - ] -} diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index d7457485da..312138a1dd 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -10,7 +10,7 @@ minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom/action" minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" minecraft:snow_golem,TRUE,TRUE,"gm4_reeling_rods:reeling/snow_golem" minecraft:villager,TRUE,TRUE,"gm4_reeling_rods:reeling/villager/action" -minecraft:wolf,TRUE,TRUE,"gm4_reeling_rods:reeling/wolf" +minecraft:wolf,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/body" minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" From 488b4562afdcc2cf4acf6cd4760d4b3a3d12c800 Mon Sep 17 00:00:00 2001 From: runcows Date: Fri, 27 Jun 2025 10:47:27 +0900 Subject: [PATCH 077/101] Formatting Changes --- .../function/get_motion_to_player.mcfunction | 6 ++---- .../function/hooked_entity/item_frame.mcfunction | 2 +- .../hooked_entity/leash_knot/action.mcfunction | 5 ++--- .../function/hooked_entity/painting.mcfunction | 2 +- .../function/hooked_entity/select_type.mcfunction | 2 +- .../data/gm4_reeling_rods/function/init.mcfunction | 2 +- .../function/player/cast_line.mcfunction | 1 - .../gm4_reeling_rods/function/pull_items.mcfunction | 2 +- .../function/reeling/chest_boat/action.mcfunction | 5 ++++- .../function/reeling/empty_container_entity.mcfunction | 10 +++++----- .../function/reeling/minecart/action.mcfunction | 5 ++++- .../function/reeling/mooshroom/action.mcfunction | 5 +---- .../gm4_reeling_rods/function/reeling/sheep.mcfunction | 3 ++- .../function/reeling/snow_golem.mcfunction | 1 + .../reeling/stealable/steal_equipment.mcfunction | 2 +- .../reeling/stealable/steal_slot/body.mcfunction | 6 +++--- .../reeling/stealable/steal_slot/chest.mcfunction | 5 +++-- .../stealable/steal_slot/chested_horse.mcfunction | 2 +- .../reeling/stealable/steal_slot/feet.mcfunction | 5 +++-- .../reeling/stealable/steal_slot/head.mcfunction | 5 +++-- .../reeling/stealable/steal_slot/legs.mcfunction | 5 +++-- .../reeling/stealable/steal_slot/mainhand.mcfunction | 3 ++- .../reeling/stealable/steal_slot/offhand.mcfunction | 3 ++- .../reeling/stealable/steal_slot/saddle.mcfunction | 7 +++---- .../function/reeling/stealable/zero_chance.mcfunction | 1 + .../function/reeling/summon_entity.mcfunction | 2 +- .../function/reeling/villager/action.mcfunction | 5 ++--- .../function/reeling/villager/add_gossip.mcfunction | 2 +- .../function/reeling/villager/sell_out.mcfunction | 1 + 29 files changed, 56 insertions(+), 49 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 9fa9183796..177d93747a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -1,7 +1,6 @@ # Gets motion vector to launch item to player # run from pull_items - data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] # Store item pos @@ -10,14 +9,13 @@ execute store result score $itemX gm4_reeling_rods.math run data get storage gm4 execute store result score $itemY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[1] 1 execute store result score $itemZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[2] 1 -# Player postion is stored in $motionX... ect from store_player_pos.mcfunction +# Player postion is stored in $motionX... ect from player/find_hooked_entity # Get delta from item to player scoreboard players operation $motionX gm4_reeling_rods.math -= $itemX gm4_reeling_rods.math scoreboard players operation $motionY gm4_reeling_rods.math -= $itemY gm4_reeling_rods.math scoreboard players operation $motionZ gm4_reeling_rods.math -= $itemZ gm4_reeling_rods.math - # store Motion, y to be edited after execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.1 run scoreboard players get $motionX gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.1 run scoreboard players get $motionY gm4_reeling_rods.math @@ -32,7 +30,7 @@ scoreboard players operation $motionZ gm4_reeling_rods.math *= $motionZ gm4_reel scoreboard players operation $lookup_key gm4_reeling_rods.math = $motionX gm4_reeling_rods.math scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp lookup_key int 1 \ - run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math + run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math # store motion Y, scaled up execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction index b0b1fc83ae..b493e498d5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction @@ -10,7 +10,7 @@ execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull execute unless data entity @s Item run return run kill @s data remove entity @s Item -execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"$(type)"}}} \ +$execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"$(type)"}}} \ run return run playsound minecraft:entity.item_frame.break neutral @a[distance=..16] ~ ~ ~ playsound minecraft:entity.item_frame.remove_item neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction index 9e1d261297..5f94716d0e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction @@ -7,9 +7,8 @@ tag @s add gm4_reeling_rods.leash_knot # distance=..10 is leash distance (1.21.6 CHANGES TO 12) execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ - if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \ - run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader - + if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \ + run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction index 2a51ad8b44..52b146d268 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction @@ -5,6 +5,6 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items -kill @s +kill @s playsound minecraft:entity.painting.break neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction index 5bf9fb085c..1e29770858 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction @@ -5,7 +5,7 @@ # apply barbed damage execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} \ - unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed + unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] run return run data modify entity @s fuse set value 0s raw # non-dismountable entities diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction index 13da5fa709..fde93b9391 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction @@ -29,7 +29,7 @@ scoreboard objectives add gm4_reeling_rods.id_bit.13 dummy scoreboard objectives add gm4_reeling_rods.id_bit.14 dummy scoreboard objectives add gm4_reeling_rods.id_bit.15 dummy -# set_lookup_table generated in generate_files.py +# set_lookup_table is generated in generate_files.py function gm4_reeling_rods:set_lookup_table schedule function gm4_reeling_rods:tick 5t diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction index 879eb641b7..bee0f7935c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/cast_line.mcfunction @@ -4,5 +4,4 @@ # run from tick scoreboard players set @s gm4_reeling_rods.rods_cast 0 - function gm4_reeling_rods:id/loop diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction index f0fedc1d33..310e8d0660 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction @@ -1,7 +1,7 @@ # Separates an entity that needs it # @s = entity with items to be yoinked # at @s -# run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/* +# run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction index b916597432..9f52a08f75 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction @@ -4,10 +4,13 @@ # with {boat_type} # run from hooked_entity/select_type -data modify storage gm4_reeling_rods:temp entity_data set from entity @s +# steal data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items + +# replace with boat +data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction index fc7359566e..43007ed4ab 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction @@ -4,8 +4,8 @@ # run from pull_items # Assumptions - # storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player - # in storage gm4_reeling_rods:temp entity_data is an Items[] array of item data objects +# | storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player +# | in storage gm4_reeling_rods:temp entity_data is an Items[] array of item data objects # pull item data to be processed data modify storage gm4_reeling_rods:temp item_data.Item set from storage gm4_reeling_rods:temp entity_data.Items[0] @@ -18,11 +18,11 @@ execute store result score $randomX gm4_reeling_rods.math run random value -10.. execute store result score $randomY gm4_reeling_rods.math run random value 0..10 execute store result score $randomZ gm4_reeling_rods.math run random value -10..10 execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.006 run \ - scoreboard players operation $motionX gm4_reeling_rods.math += $randomX gm4_reeling_rods.math + scoreboard players operation $motionX gm4_reeling_rods.math += $randomX gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.006 run \ - scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math + scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.006 run \ - scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math + scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math # scale 0.01 for same magnitude as main item, currently 0.006 to be slower # summon item with data diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction index c58a14e2c4..b612640802 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction @@ -4,10 +4,13 @@ # with {block} # run from hooked_entity/select_type -data modify storage gm4_reeling_rods:temp entity_data set from entity @s +# steal data modify storage gm4_reeling_rods:temp item_data set value {} $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} function gm4_reeling_rods:pull_items + +# replace with minecart +data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction index 5df92f1115..b5f4d4c261 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction @@ -6,13 +6,11 @@ # fail if baby execute unless data entity @s {Age:0} run return fail +# steal data modify storage gm4_reeling_rods:temp item_data set value {} -# set item id to correct mushroom type execute if data entity @s {Type:"red"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:red_mushroom" execute if data entity @s {Type:"brown"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:brown_mushroom" -# set item count to 5 data modify storage gm4_reeling_rods:temp item_data.Item.count set value 5 -# yoink function gm4_reeling_rods:pull_items # replace with cow @@ -22,7 +20,6 @@ data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:cow" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp execute at @s on passengers run function gm4_reeling_rods:reeling/mooshroom/passenger_transfer - tp @s ~ -1000 ~ playsound entity.mooshroom.shear neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction index 0d985c2759..9eeeb74afb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction @@ -3,8 +3,10 @@ # at bobber in @s # run from hooked_entity/select_type +# fail if sheared execute if data entity @s {Sheared:1} run return fail +# steal data modify entity @s Sheared set value true data modify storage gm4_reeling_rods:temp item_data set value {} execute if data entity @s {Color:0b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:white_wool",count:1} @@ -23,7 +25,6 @@ execute if data entity @s {Color:12b} run data modify storage gm4_reeling_rods:t execute if data entity @s {Color:13b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:green_wool",count:1} execute if data entity @s {Color:14b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:red_wool",count:1} execute if data entity @s {Color:15b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:black_wool",count:1} - function gm4_reeling_rods:pull_items playsound minecraft:entity.sheep.shear neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction index 2372429b18..8a5ee517f4 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction @@ -6,6 +6,7 @@ # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail +# steal data modify storage gm4_reeling_rods:temp item_data set value {} data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction index 626101ae2e..69be3320af 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction @@ -1,7 +1,7 @@ # Pick an order to check equipment slots for stealing # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from hooked_entity/select_type & fished/villager/action +# run from hooked_entity/select_type & reeling/villager/action execute store result score $order gm4_reeling_rods.math run random value 1..6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction index c72541fbbf..8a8b8f8564 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction @@ -3,11 +3,11 @@ # at bobber in @s # run from hooked_entity/select_type & reeling/llama & reeling/horse -# fail if no body slot +# fails execute unless data entity @s equipment.body run return fail -# fail if 0% drop chance execute if data entity @s {drop_chances:{body:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -# yoink + +# steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body function gm4_reeling_rods:pull_items diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction index 6c29f1d98b..5ea5b9a4a1 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction @@ -6,11 +6,12 @@ # fail if 0% drop chance execute if data entity @s {drop_chances:{chest:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -## steal slot +# steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest -item replace entity @s armor.chest with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s armor.chest with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 4 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction index 34368379af..ac340ffee6 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction @@ -6,11 +6,11 @@ # fail if not chested horse execute unless data entity @s {ChestedHorse:1b} run return fail +# steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} function gm4_reeling_rods:pull_items data modify entity @s ChestedHorse set value 0b playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ - return 9 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction index 9b2d346c9b..522971108c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction @@ -6,11 +6,12 @@ # fail if 0% drop chance execute if data entity @s {drop_chances:{feet:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -## steal slot +# steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet -item replace entity @s armor.feet with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s armor.feet with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 6 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction index 9e958eb9cf..72aadd04a8 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction @@ -6,11 +6,12 @@ # fail if 0% drop chance execute if data entity @s {drop_chances:{head:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -## steal slot +# steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head -item replace entity @s armor.head with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s armor.head with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 3 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction index f328b8dda0..d82c016ba0 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction @@ -6,11 +6,12 @@ # fail if 0% drop chance execute if data entity @s {drop_chances:{legs:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -## steal slot +# steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs -item replace entity @s armor.legs with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s armor.legs with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 5 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction index 2e1c11cdd8..3434d65e0c 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction @@ -19,8 +19,9 @@ data modify storage gm4_reeling_rods:temp item_data.Item set value {} # need SelectedItem to work with players since players don't use equipment.mainhand data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand -item replace entity @s weapon.mainhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s weapon.mainhand with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 1 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction index 78b2e5af84..aade2f7619 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction @@ -9,8 +9,9 @@ execute if data entity @s {drop_chances:{offhand:0.0f}} run return run function ## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand -item replace entity @s weapon.offhand with minecraft:air data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items +item replace entity @s weapon.offhand with minecraft:air + playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 2 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction index 798605765f..284f8a74ef 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction @@ -3,16 +3,15 @@ # at bobber in @s # run from hooked_entity/select_type -# fail if no saddle +# fails execute unless data entity @s equipment.saddle run return fail -# fail if 0% drop chance execute if data entity @s {drop_chances:{saddle:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance -# yoink + +# steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle function gm4_reeling_rods:pull_items item replace entity @s saddle with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ - return 7 diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction index bd1edee817..2afb04172d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction @@ -1,4 +1,5 @@ # slot has a 0% drop chance, play sound and fail +# at @s # run from reeling/stealable/steal_slot/* playsound minecraft:item.spyglass.stop_using neutral @a[distance=16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction index af96df885a..abac26ccfa 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction @@ -1,5 +1,5 @@ # Summons a generic entity with data # with {entity_type, entity_data} -# run from reeling/{minecart/chest_boat/mooshroom}/action +# run from reeling/{minecart|chest_boat|mooshroom}/action $summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction index bd108cdde2..104fe35583 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction @@ -17,11 +17,10 @@ execute unless score $slot gm4_reeling_rods.math matches 1 run return fail # find trade and sell it out function gm4_reeling_rods:reeling/villager/sell_out with storage gm4_reeling_rods:temp entity_data -# adds 20 "major_negative" gossip of the player to the villager +# add 20 "major_negative" gossip of the player to the villager data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @p[tag=gm4_reeling_rods.player] UUID function gm4_reeling_rods:reeling/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip -# angry particles +# feedback particle minecraft:angry_villager ~ ~ ~ 0.3 0.3 0.3 20 3 -# angry sound playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction index b2b680cf77..124843ef67 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction @@ -5,7 +5,7 @@ # run from reeling/villager/action $execute store success score $success gm4_reeling_rods.math run \ - data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] + data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] execute unless score $success gm4_reeling_rods.math matches 1 run data modify storage gm4_reeling_rods:temp entity_data.gossip merge value {Type:"major_negative",Value:0} diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction index 2100fff4af..1dc0f5d815 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction @@ -5,5 +5,6 @@ # run from reeling/villager/action # for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though +# | needs more investigation $data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0} $data modify entity @s Offers.Recipes[{sell:$(mainhand)}].uses set from entity @s Offers.Recipes[{sell:$(mainhand)}].maxUses From 4e6c945f9c18250ca8c974fb4511487acf5cdc09 Mon Sep 17 00:00:00 2001 From: runcows Date: Fri, 27 Jun 2025 11:00:50 +0900 Subject: [PATCH 078/101] Update to 1.21.6 - extend leash knot search range to 12 blocks - add happy_ghast to leashable tag list - add happy_ghast harness reeling --- .../function/hooked_entity/leash_knot/action.mcfunction | 4 ++-- .../data/gm4_reeling_rods/tags/entity_type/leashable.json | 1 + .../data/gm4_reeling_rods/tags/entity_type/steal_body.json | 6 ++++++ gm4_reeling_rods/entities.csv | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction index 5f94716d0e..b32d05023f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction @@ -5,8 +5,8 @@ tag @s add gm4_reeling_rods.leash_knot -# distance=..10 is leash distance (1.21.6 CHANGES TO 12) -execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..10] \ +# distance=..12 is leash distance +execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..12] \ if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \ run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json index c82c3002cb..162cc4b03e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json @@ -18,6 +18,7 @@ "minecraft:frog", "minecraft:glow_squid", "minecraft:goat", + { "id": "minecraft:happy_ghast", "required": false }, "minecraft:hoglin", "minecraft:horse", "minecraft:iron_golem", diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json new file mode 100644 index 0000000000..b6bdf88134 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json @@ -0,0 +1,6 @@ +{ + "values": [ + { "id": "minecraft:happy_ghast", "required": false }, + "minecraft:wolf" + ] +} diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 312138a1dd..4e1d52e9a5 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -1,6 +1,7 @@ id,needs_reeling,can_dismount,function #gm4_reeling_rods:chested_horse,TRUE,TRUE,"gm4_reeling_rods:reeling/chested_horse" #gm4_reeling_rods:llamas,TRUE,TRUE,"gm4_reeling_rods:reeling/llama" +#gm4_reeling_rods:steal_body,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/body" #gm4_reeling_rods:steal_equipment,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_equipment" #gm4_reeling_rods:steal_hand,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_hand" #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/saddle" @@ -10,7 +11,6 @@ minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom/action" minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" minecraft:snow_golem,TRUE,TRUE,"gm4_reeling_rods:reeling/snow_golem" minecraft:villager,TRUE,TRUE,"gm4_reeling_rods:reeling/villager/action" -minecraft:wolf,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/body" minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" From dd5665aec983b9620912fafd7a3d929741e02209 Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 30 Jun 2025 13:52:21 +0900 Subject: [PATCH 079/101] Fix item frame yoinking not respecting fixed tag --- .../function/hooked_entity/item_frame.mcfunction | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction index b493e498d5..3d6db6119e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction @@ -4,6 +4,9 @@ # with {type} # run from hooked_entity/select_type +# fail if fixed +execute if data entity @s {Fixed:1b} run return fail + $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items From 7b531547383fca5c6f234a625983cb9750eec47b Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 1 Jul 2025 05:02:20 +0900 Subject: [PATCH 080/101] Set module to not run if hooked entity is Invulnerable --- .../function/hooked_entity/select_type.mcfunction | 7 ++++--- .../function/player/find_hooked_entity.mcfunction | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction index 1e29770858..4ce4eb8462 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction @@ -4,9 +4,10 @@ # run from player/find_hooked_entity # apply barbed damage -execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless data entity @s {Invulnerable:1b} \ - unless entity @s[type=player,gamemode=creative] run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed -execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] run return run data modify entity @s fuse set value 0s +execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless entity @s[type=player,gamemode=creative] \ + run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed +execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] \ + run return run data modify entity @s fuse set value 0s raw # non-dismountable entities for entity in ctx.meta['non_dismountable_entities']: diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction index 13558590d7..e15738325d 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction @@ -23,4 +23,5 @@ $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ at @s as @e[\ distance=..42, limit=1, type=!#gm4_reeling_rods:ignore, \ scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ - ] unless entity @s[tag=smithed.entity] run function gm4_reeling_rods:hooked_entity/select_type + ] unless entity @s[tag=smithed.entity] unless data entity @s {Invulnerable:1b} \ + run function gm4_reeling_rods:hooked_entity/select_type From ec6b70f0f0f7449b2b97276a39e3eade7d570f00 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 1 Jul 2025 05:30:27 +0900 Subject: [PATCH 081/101] Upload Icon --- gm4_reeling_rods/pack.png | Bin 0 -> 182942 bytes gm4_reeling_rods/pack.svg | 126 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 gm4_reeling_rods/pack.png create mode 100644 gm4_reeling_rods/pack.svg diff --git a/gm4_reeling_rods/pack.png b/gm4_reeling_rods/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..61680dcdc44b46280920e583c9b919ee51c74bb3 GIT binary patch literal 182942 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 z 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%0A&7ieyKs>8FeOQ$ZI#MXd&x=u6_ z`=s`}j5XCUr8DCZWd4pY*U%s8TOZ0|KIaGct0;B*x^CuA@6^9Il@} zd?qcf=&7MzxlN;f*j;8RT(l_pL=F?FA46Cf12$O5%pv?>n@VJXW%sc@ zI!(rINb-oP)SHUL{fSF=UQqV{O;M`t(8LUv%@C6N@~94)?l(%Ko_yF48R@ zv4Bf3vx#+-l@9)pIqjtqq&X(S{02p0spL)T%%GH-9m0 z_s4foJRd3ilF56M2q>VZD0@?{EpK$JtlRplTS@M9?xw2}u_mVMY%sRGt;>Dy z7}xwcz`f}UjG*T)`tWJovjboLQk%=hC{7>zdIKZ$ky$C%-#LDru9nGoC zv%%YYp94xIXx`eXj9B=+)l4`ew`3c{4@4xC%Q$~mfhK85nN2Rx4$Yy! z&8;F)vHw3D*Z&6WWp%%+A7ZQ2oU^ikvED<Pb$ToMM31{I4MABHIKh z>k5Xa;_BEF0h5y-8F>s;nr`KnFht$1Uyo#3q`Q&PZ5wr*gzRaC?Kc{U$H_i%!Aj5b&T zU*r4xHOxjk-A=J3-NXkL@w44?bHC^QGJG619zS^n0C87+xzi_Jmy}v4Jh^vrBFeE2 z+(HWKZ>~i8v?M!A?vM7ZqG#h2WmOsCS=> z>{!kSbO}Eh=(d;L1xIxD`(d^q&+{*Yp`io!dD&NS=#6fV`Aj){bIL-i^S7#~a07<( zpB+#I@vQFteOT6zBU@b#GR-#iu`_F-$dj_r!CPnAff1tRLQQGZk~ovdb2kGU2Q>d1 z)q@5ab?^!~BgJb8m8nHd`vbfJ+INFtnXeS!%d(csliPB^nBD9~Ct9z+9+Ag0G1A~) zq)E!@dbBlcm&c?LbmIBVa$et|uIJr0NKG$-!z+e5l;en%U)|eC32J)jOWLJ+8uFu& z>-V3qW)|U&-@ACKV7pgYl<8#MV+Q+H)OZQey8d>Hi3W1ap}s>Tm{Fm=sgy~a?qE^p z)FAoSvvx<|i!mO#v*3bcnz)cdr-)G=KQyHw8JZBQ?pmnbTp#8 zP}XzX16laD%zeOJWP}c0zXIY^zR0J; zfbkyM+X78mr1FJrSssI4=Fra^C_|V#$uUF03SqY5n6)-QBoIHlw=r#>&QwoRW(=AV zj&EV6%HF9DvlVcmrbBMumoUHo;mYZ6w&1wvP*}@Ip{P5k=0;A<{7YZbfNRFVkP8}H zo+yjk1CH5Yh9|~st68<2DEl?P5aXJ=hj_%4Q50D zZHMcyN50}EX7$OiudxJ%CyF(1Bc7e|o#+aF9Y6o>`QPuOPFC~B2{Mv~e`9W6-v~b# zxSjnRq5Xl+Vn7o>H^Ki*Is9TZv9Ku7PmW_N1|5?&h23<$w%UcS_b!Tp0FXKCD zd2w7eiyaim4uAsL4iNQt7D^Pr+{0?oirH#cmc8Z z2r3)bsMBv-CIl^%B?fODnR@`01FQ5r?mRJK;tV)JXOumua~e;}$XPmLf9roa(Ysg> zi-P+p-6r=yc5p_b{gd%UMkH4xl8Z-b<$n0dlk+86i-A52pa>laiqP{fj68*@Q6}c{ zv#+?oFAB|IL5d1As3ORS2K*bDz4d_>HKrwuQc0Nzrt6Sk{nGF~)-0_nU6buFTfyZM z2}vsT>lVctu%Cm(T0Ru_c!=T^duBY68evmx4D+gj& z58Cr<6rZgCRhi;nM4Y3o)vE&aTRGe8Y-}!XaQa7#U%V-*xco``H}39nt0TzAj*XA! z0NJK+vWfq7L?Exie(Z5O4BYazaoqg7(4m7k;qDkTZt#wTY^CmQx~g2qNimS2Hx~(H zp1tWD?dyLTAoX42b{iObeQ4Pje|u1wQ1A`BiN!@nQA!6WSvR{80BUqV+_nn3T7>=^ z1y{XOXOUeJE0!|X>>Y@v!(j0lC5LCw06w$Y}nTf^5_Ciq70aZ!$y!Z*b zZQEGZ@I7M8wH`1VuBK&)DFSA1Xj^_$N2NIiZrW={`VfQGv3t?lKiXXq6u^Ac(9%yrwLA=xgLHk!2O%J7c=#f z6G&??U)fsDyIW5z9&0jj9*3}cYZ_Qon3Khho*hhDqt5Uk5&;!N!1c*I`8&sq*_uQr z>-84@1wB|AIzT0{F;i)6*4L;~%(7eZ)OJ)ZK;aMUTQ9wi60W-%q*-qEv=-<9)Tyu) zl@4c1$eix{5Bj{#1{C8)R{l^Xc5jT+C8#dw&war=ax$PR&eX;6G6s3QH}wvcZyD;` z0erY3!DamS()q-xq73A~=Qa4S!-g+Xgcr?UYI;sp?Oz9-0DP23?57T+?P(L$EKR`4 zrWp&gwnWheNE|DXf7hv--{W9VSHf_p&wAuxq7%zj$gTAE^mp{}7wd)}&)1K-53#RL z0c3yT-wY+qICSPr2H&AHB)6)kDhw4aqwX6Un>7~wk~rojGQu%-|J^%q;Us{(;B-5y zi^+3;J_%ay6nFweK_ zfP(qFU$sv8pcz`&KN!jD*S>WV$*%P-{&xeQ63#Ld;KiNf75kM7r|2>gqTX=E{YXq^ z-yOdh$RQ==-wK_u1V8qfVDFRb-tA30HBpv=g&dMZ!Wp@0MIsp;XjVMFNBJ;FVU|5G zi=HLI*1R80?{uh~Kx&>6wdzx?DYA{{@a_xRE~i%>D;2iYGy6}g#&y98R1*HQ%*t)= zt!LX50~+aMldQXG1E@?swk5T2b!i7UX*$18!tZ~&;(weqefNyzRNXrUNLg!&RNBHQ zsN*V0@f=B<*ZXQy`3)wle{H+o9#G__LISYs4QGx ze9Nb2VeDcq$U3EO#*b?*FVOLT+P^w*`8eo3mb(oO=Yj5%qVa7P=Pn<3Rhl~>m)lkLNj_b%hWrlOtfK@%smGBf? z31MfH2##TnitDxh`4{ifxPqQSU;jy2L+pV3#roRMPh~#(%3X;`Y@C_k+Kgl2WxbBA zhwtl;*||tv`3ANMTx%qf=A*{)Gi3_-74&K)#0=z$C`EEgcv~2kfV0a78`bafxWu1h ze{Q(0jod*iraI*~u6_k8EE0N^RQ+4hPBLuqs3Gtt_7go}EZfM<+ z-EjK(lk~=8c_G=*Y+grHq*Gv!;oM~thTqjM?Q={L#{0vRm-4)i>jn?Any_msse^wcJRZ|Rg z6jRC=3a{DaPh?_sTFl~kLUnJ3A=9|xlbcgRl*c10(SloE?Rz}#8`?kB&2z&IwtOKf&u5Pyh^!O&FgjeWex)i82 z5TE?CJKHs=#A;lUr=@3*k=bpP&MFq1Mx>MVzGB4|n5nJiIpG}DRL=X}r~Yuo zD%ryYCF{oZ8A>#`NhvS3)8XE0xzQem%+FNeq%3w31A`=Y<<-|ZT6XW0ZrlKOIfecW zjXzqjzkDv0Prq%TOZ03Zvx>IDOifZxEXSAfm#&k4m)shbAg|WS?hAX=`JtCp-fn+5gSIyjS6e}KH{hMAP__Z}G%pf1;;aRpGe?~yD z3l-fn6WybWJo_hCCf`0!)BwvMb}EwF74_!qnGIL$f}f1gAk4|e*0BIPv;pmx_-$X< zpGdI;EPP7F4m*$GzOjJ5bHXn@H+NyHU%a~G*o8l<^E1(mN=k}}1^qW@d6gq`3{_Kw zJ)dBns2!>9e>p~P4dk8G)Vgv6U;11=})zy(KEI7xjIQmt1?H=A3c~*=i^R`jiW&W8?dplBA(C0ojBQN67 zat|qfcgO&LygROEQH?|PCnVqa_sKWk1 zFuu1>Cq~x$npN%B&8t77n)12)cQd$zM(>bzXi0-CzzXnP1(NF0W}<|kglC0!9x}J` zCwn{fSectE7&;NUSwf==2Nwnhtum9-EHO{+6=42$nv!L^(Z>sS4R0h~KH;itgZT5! zAkZ}gYfsv^TWkQX%y^r6u0%sqCx2UHdB2-?86llb`$J!_?K%2=;IZ}i{H(%%dRapm zm71&zbuY@R6f&y~d*D*#&(-V1@5tXsd{SC~mD(Si3T9qT9E3>@s|n7W0pHEX;|n{w z`FWRP`wwX(@%*-kw6v&%oWad#)2HTo){AUXRzs4lXHAam3*UR&m2 zPHqX_h*xJ|85!*m<|^%S`F2sD>a5E@(S9!-j4|1L zJ?Z9(KzAx+e~?!rdHbwvy9JVa;k`SdKODM$^r>qPUQlMRS;Q|TUR)Z{X5U?9PC+=k zO51@!tIV$0qpLc9ZHMV$_h5ItFrS&+<~HXx@#`Wz6(Gcj_w(Ho2lG zp!x$HxpsZ`75+#Bh+I?bD%2%!tTpOZa>##H&bIFqRZis#(v!>mQTgG$M>%%AVmlbF z%$bz*B5^o58w4FyX59AZ{#0(yMHjfC_wHdut!`CEh9j^vo_dA%>+zdGk*1dJGaHRh zxI$7TTD7l-2`D3TI(96{uUdW1hMwNQ%+5^$ogBL*{fvF#1`Hy^s?2!p(JQhJlqu}~ zM4L=SK@6B=-%!4%YmxeOoLJifYgKE-&W-N1#)d8>HKy09nbU7RekJ;3D&Rvsm;!VL zJq|y@KT@Zj5xust zwe{rzp-nH5ny2 zyudDkjwCewjzONOl!+x(|17rOr3^dwaFcLph2a4mI{`m#SQqvb#)GAd z;8y89PAM>aVDvOV<9h6@e4t^D=g!>T^bNY38=!L|B&YqapaBc{wiQ4<>n2sGTr~Ne zx-=dfKJ4Bi(luDk0-RJ?k-A>^poR&C7CrDZf;+5+2vdvvKF=-?@0ebYEwz(`YvGK) zg!O83Rz+jQKt|-H5@SieV#RvVaUXJRG49bV<&ZE<-nu4~y5TzhSI;7^%FRMUB;PsU zk`{+}gQk9{sYXZ;!_S@ip?T^;T_9ybN$^GD#ZfU?(e{xzh-`XE3k~?|-71MPVI)(g z-nMvXVQH>krWlDXhh=Ze=Lslv{Tj89cHi0PQW$*m>QAQ!HeTm~f?EF%lw#igtow0V zls>=m=}kfs%kFU@DK85%=db1Y)AE{N@U0ZE2T^u8Ml ztnLfqEzT${n7fB%p;kWpyh?r?O0i5gtcrQ!;OwF~D}RiR@MX(0mR(v3MwM6^ zL}*o#aw<_0vu@3cSS6>pJC{}k4wsipkqG)fqMF=WH1Y)WGVb&ymod7$esj|ZCDBVU zsM*>2!WVYG%jBa)4tm#bV0DUCBX;R0M?%VyK!O*$QxNr;B%I4X zM~8}9+Mb5na5gU96l%%?7I1!MrqF{cjD{0r$8o3qofRw(nynY(Vt&G;|4c^Z9fW(?fCUm|4Uj9X65+Bp&vz%`IQB9Zmvt?f#4^tKy%{=woY^d`xcdsJSDuMi zkt;;2w^t?E(2AUVhY#3+NMQQ|&nN(t0=EAQ5uXueSn`bQtF%c^be@GYV0?g~B!58K z*$Us%=e3!opmLrRInpywDl9V6Hx${IV8B!lz|;+E>kMl#0Luz650g~}BhiG1#3Xfz zdkjxcZ&vQL*USXN!dg{A=xw5t06?K>J>m;XQ0}$C;Ojj1u?g6Vs7Ep;tVgP+=jOV9 z_s?QdatgQKsX1G@zjk*a&fmkk`%gZO{NC~7npz?%$S$(xdbD3a?gUs_@A<5Sj?$p4 zCz6o0rfG`?QZ-i{nSofw8ev&3xE*pcQf;dVo6l-hhV^`d6kuV)>J9m^XT*oWVBR34 zd}VT-LriIB(I?jsI`VY1LU?PaD&6K8lIu(c7_Vv_EUD8@H2vt>emN$B`6$zo>gMU+ zTXXg~Z`Roy?eO9b5#6j4L0xE7q3ogyYsZducpOjAiTUl&|KpEZRJJ;s0ekeqGfL|! zUT(v0J?ll{JYVb@bUdM*=MY>Rt%voPL}%}7$_TF9U8%-kO5?1|6%-7ab$V@jt%$nF z+=9G3EjZF_wE%OylUs2TG*{sc+A~m`aCUKC$_`^oN^on~-)RXWqm= z$YsUx+M9QIcokCJwUZGnuJ5SkDZj&>uC6W@W@T%8eL5q)4>S%A25F#KjlY=1DW|>Y z9jg%tuJP!%FtuF7i%`&ypP;^$tIsbIDojbu35H%iEO0o>Zr=;`oKVQGpzO36%yYtT zpU`@^=QA@tfigN39O++4MQaklU~$b-5E~oVip?S+>D+%kHypQj3@at37*Xiq4M1=~ z-Z^;(VEKOW;vLu&jF|#bH*2mRt?s`Ij!%HZPvn@Bb6eC8h$ey}iv*oSGYTP_;MK-X zU*yve`!P+E|9O2qPrdlu^FU*!o7q`eSv|cAL_U?Z=O0rCo^}zr@R=#xiVyLRM2E+A z%cg>lqw9r649-J5d6gts*2vv%|8UB>wXJ0C1%QIiY!X}AG-2ZXS4i>~lk@>bHK0ZE zIUvpcxwgnVxTwg4www(9YVUXX3&*9cZ%S?DrsgijHufdOFse@BqJT~bT8krQ7gW6$ zs(C-|stLt5<@cn2{#IQfi|!PC^RNRbK&+Nlm#B3ED^qos>OGcv;*RdQM~ea3Z|`3} zdQV&7wU5m%s~~Kv@xi)5w4)vFeexa1T{SWqriP8!GGt3?ZuL`L6t`w3rM}5P&X^Crh5=7MUJ`fnR-v+qrDGFoVnEs{_2w zgF*XWf?e`4j@bX5GU`^(gRA}Si!e-ilzB6C^n|u`VQ*XGg6_g&&ki80 zij(NP&6V^YNq*^3O$s<3pGv||N0OQUh~AP? zXXm^T+vM&&`?|#@bM%F-p^ia@SnA)6FO!zyNYLs=ZAzl$Tp+Nl8OW)cfbwK15=~-P}`2E5#@t;h&L~cdM10+frSij3`sosAk&?3+julfiNqQ9Ml2)~nlUo+H` z*%n|$&&X&YnC$RS&xqRfSicI$88G=)C1p+mZQX8KrYvza9hIFP?HOFMK9?2wwCt zvT#Licx9V3y8ZH-+*-LA+=i3wZ?Nl!DbqqjBV8SxjGkJ)Mu1yI6(b}*B7YFAT74z} z1RU;LkMM>G4#+tDnSAQ3E(GE#SL4fZ8L@S5fkuq3qZ zuL@V!mn-MP6jWxYTLluMhskY=7i|)`RgWkBYZEET%mV<0l;e~7N2BOtPkhjK}r={S5w~kEy zZpn38^`=mYuC8L}Hi-UU{ra5U$?rmS+2mW^6cPL^W%3yhd()Z>QCc7EW=V;T^$mQ6 zz~EcuhvTiiYjcid97xFGIAKWuyY~!8%4y)2@hyvXXkv(hgSvHhY>ak{R^LN>Kz?!o z+A`v|!^Ju^i!MPBvsIXwj<+{&&3M8qX8#iY^R5YDRY^B-Bw3#}#CCV3yV_lpy0D~_ zl$h)VuX0JIOmz9E#jkFw8yNs!7dF=#ie|#?Wi04xB@8*cZOa7{Tf-WG9~2sqgFE}I zJqi{{N`~^|0{9sPwUf3Wunh zU?3KV2NEgnpsw#f7(W%|IhK08^jP9G^xB`CUTN*Prv?QVHfMoYCHC^}Gmpa86)-D> z0AgJ}VV0p`QaiN1gJ{eXXvr(|nEIWr0g#}g2EAMEFRW3E8CyW8$4wt9A& z!;)JYx1A#GDwf9g(?75JCP%PBwE4>$XG`+WkL;{8qBMk1tSt{tev5B)v)cEY?|x4qAOJZ2 zTOFEsILjjnx$*?PvE8W1Fv~)SHhc^G-D)y%4WSgrw4t4zcU>%h+dm}IhG;VzwXU^Gi;Nz>8f@5 z6IgJXeJP+UeL#}Q)_tR{%Tr43XUrex$AN1_KGw?11aXzyPG~lw0MM%0YHy;)?<6D3 zccoxdpjFiez`M&I%T2w$F=BlRInVs9$oInPG{uPDYQsAxYXRy9@dlt$vLUJ2&_9pWv zf*AZrb&+o}fh&JX0fz?W47Z;?aqzYJ;A+an5_`nmAgx#5Q{KeCx5`k>bq_*Sv^(w9;KSqb}gDckCXwRd7smPkXT zRKBK8fhGWXOiHjMPoZJb2=h|>MG!B|oqPz%<=x#A!^R^wjbv7VNNl#J_f)*k?i=Lq z5)EPr&C$}sGDP18uBv#TMY0-%4oPIV|J)dhrs{!p1Ayr<5T8D74wS_l6!X_xtyzQRP38-Uli$9&)zi0imI=PKdm1ZcAP`8Gb~O z?NKOT$t>ghxgmxa&&Ii5twiEXNErq!S(h3$qN6eYQpN6=$vY7)yN((wognauiJN9v ziAPFg_4Rgg+u}ou>Y-TZ0gMN+^syFDY%FtxB|H|H*5)X6GrnyEVKRxuBZL)~{i#sW9$IxYf!W5j z#VqFcqW>VYl|T#}oVECYwFzrh#!RlXKIlTS&!`_P4m0#1heYlUiL&*6Mn0;~M!iKK zI8`_(6$F`(r!~^Xo!@oU$COO%u`?b=gQBEQ)Jho$274vxMnTwWpE-qMWtcy2YROV> z++By}{>;j( zxYx%0A6SS2O}bb>aDRm?iz7l6uuyRFUs`%PXL#6#3zg=gu>tsFDq*(h}R)e#Bv?Y*-Qe)mL7s!M2fx9t0LP8OGrSc(y`Elmf6m~!xHNR9fr!H}SKUm^3-*wjEwk5ml z#Uo=MlpTd4df$V9lc~2$LZz#FUrYL)FidKLE0(j&-q_06GzVMGWdz0Ce22gy1E^iP zN4s3PU9FMf-Xh;?W7Z-N1lVt-$&%7cVoFjbh^b!w!oqWcm<*@ zoP*bp);Nd4qX^Kud*t2@D)2DuVkuc0@e zQU+h!Z4jQk6C_7|DC6p~ARqO508nviQ3XB#b**l=x^To_f?{_oflqw32xKf*qx>!g6AvAY{?sdoR{zB{-~P`AiDPT50_6Ak%)WvbvS!c zN||$?=6{IS#tM2?i)D4lZhsO{IgjbCb=3NQJ7N;h2h z=YgR8tT3wK&N&LSXQ+Js8?O)1zgV_Nz0JBcL^Oz%=yC3mPRwBZM+*a4E^W70(o@Db_lMIxqWYxmfQjL;Jg1<>#PeCMe-e-+ zaOKlRc^NwqWT#ksmh1CIszZL6ajv9R#4+!}{+_2D20y{*-m>0dQ|G{>uqdY!-yd)a zgj#u6sh!kHnBa(v(|lHX!~iwVuX+|dM^q^G+8*=X2&)*E1kn^5AU_{ZNhm|SA7Av7 zSVEjTIlz-%CH!UxomL|??MbsIbO`R2)|)zg-mbg|VDuJ|-a&KS$(*y|3zj?G0iZGY zBp(QGQNvw54qmtox$Rbyslzfup5@KdlY?7h;8S(nniQ6|BK0td%+iNj01qn~RwG~8 zyCY+Sy6ks(ZvIzu=xM_e>m9JpcFVsHlDSoPuG$BhPXM-!JSDfg0c8ihoS-CKg%7XQ z#Uh_Jsx-Xc^=KWt<+{H#O){#;mgPy4*(C>;7zs7=C zcpMTXdq6}&uFRGwSf4cLK{_$!*B;KI7L~fa2hS}*EGOlU(XdAu$BY<48H8^y>?*V9 zt(XB7&G3|th$U=IDs8slSvXnni>-YSICC?D9!z{eOPMJw_StI+pAl1ibJa3JbfHk< zbi$DS2VIa-bk=I@sy%GyH8HU)Rngw1Hov&=*AqNUBh3ny*i|>Yx!e{pUYw2fy!m7e zmHCsXkn6)`buKWJsDT%ctN{{Hf6U_oTHeUpxsAj&VB!p&{-|2#2Fry1rjdc&+HV`) z?N>Lnlgaev3hEPj=xwD{J}>o0Lok}IHN>FAX(7PVRlmaN=h$Z`>UitQP*R&8W7aZ8 z-ojCK&9O{qJ=>?-9^D*;zl=Tra5sM|pi51VbNCiy$p{H7P^Rhmb*lBINxtI?lV&E# zVt|!c4MNpjkQydCcaQ$)%NJG5*X%Zw0HmK1eA%s~V+2^G3w6gl|IPNj6$f(Yv~h#8 zf=GtTL@_65TL=Hm1M=`=^l?|g^O-Xrfr`7tG%@;n@0!;k_J7g>%6KH&5vAVn_>6M??C~7?^wPthHRIF-4#=S+bz#GvO>#} zNDD;Bkl^h#-_kd{hT@G~FT30uxhZNHgyf^E)rto72af5YV%-R5+sUKBBH5Uia3gI6 zszV(g20OBzci|e=sdi);L-wr!tgd*MXlRW*n}Q|V&_AcpNc~ZnTYJDUaXCeT;B}}= z=Kz}}T7$P@WIe{Xu&cQ+Y>{TuV(3p|PBy0nJ*#DfPXW+x3E)iIrsu*99Omx2*tGqA z1`njtelJa+w}PObvKOzHwL8hhx~=oEMjoKvNC51K-OS1;eJMM$Nlxrizi;~IT;Jp; z=}}bW?tgrQ(0;5BG2d~=$f?PyBsVOyIGF%wd80vA^o(zj+PaL}==4I$opnr;ru4!14 zp{E*p>gX%TCcIY0hAA#O@$W-{PqBR~X6d|TFMz!ih%F+KDi;1uk_<}VuX2jB^J}R$ z6utF3SMp#8svt=5Y*SXv5?kA8wlcFUl9lB-ttZz43S5o?TflS76ITxa`e@CVBnJKi zEkbp^5YDhj=pxSDY4C#z#XBE6*8+b9AR!&CRbhCrEdv& z9=Jm-?x5+90wQ3BaD?#1`*K!?_`bFWi>o$fIuQ?zGn2U+x@g_Q&j?ZNh`)@1X9iNv zeWqg_9^#_i80~nSdR8=N{>1RN77mHhwOMQ1(%p_OcXA>it1aW9yhY&wkW(L(!H`#$ zelH3Q!kt}H|J&SzSTN~d#HZv@5Fb>dmpyIiwHGOcvZ> zmcz_`>C`$SmFJ_;dkY?1rd1WFoM%sY@l(N_+)T|9uvoI8Em?Uw?PH#Uo~_a)D^RjD zA>j+_C1>iHu9q1gblQF0GTT;3N?XKiSr{TwhpW4oYbqK>ojyuRG!!aDd;ONgJaL6TY@o zut~E8l0EimARLhMnM{`3+wfLn>RBul4a*lG{yq<=rg9$nQMZBWV7Q7_F^T>oby>D} zz%$22_Qt2=NN7&axrVNxBKP)FX&K1d`IQJW=ec?#ul<>F^g2~1AuwTo>}C%Vu}NUf z+8&OTwm90^HIQp(HSJd#6q{6R-_e@h3d9Oh;HqNajzt#nDHXe!2>12$LV3e{Ul%R@ z@I#n@lx}G|9(-h@6q5WU-FAbd9)ImjYI1 z>+W&@tp=_o1iSN>z+OwHsyWr=C!T@JdQI+*ZsH2tuaKP5n2tm~APdQr*qho;uKkJ2 z^*PuS3lV5gYvVnqQh7DWha1dg7$ zSw$Z}qHDWmFm_8QL>m_X$a=tu#KlVqhkGq$1%g;>5Unq`oWkK&KOns6?olfRX}EBG9}5zQ4W1d59uyDIw4MR$@fI@-t z8w8FqA2-*@u@-Eq`2} zP^}5H&XC)*F9Js7Io5&5%qjD^&kI(qfgZ#z?itkM(1Ih+0k3r6)^k3Cbz|F#Ojst* zzAx@))+&SW;`e& zx+S$0Z{mq1^}kXmJ#gGF4}-}{eli`fLu?d{ZLgR=b)>KYnrW}U9R!2Hq!t4g3!j|w z1AkQYp4UFmX{t`h8{dN1T;1iAi|*4iG)LW*6W?GzK5JNFJ{w`6ku-BaO1 zeZsHRF&$8XRn1#%n7ysAiG93`0hOAk2JX10Tq>0Ll>MILazK449 zIjPrG9d9AY?MzXKgD71tBmT6@CpJ|=_46`3I$9S12tExvn8*b#F!J)W?o`Wi>1zBC z_DkO*06Sb&!@T+?l8(bej6~%m`~P(pP#&T7{R%-3vo$MM{_TRiy8%PAqa|gdf2?u~ zRBJZ?^FuaZKd?YW9KJA{6GpJgP1@x$!j#e06GJ;2_L)wQRra0F-IxK% znuBlD0^b-qDQAGFx7(X(3FT{DJY(r;N5Z6kuI%Z6nBVHKRmbapsR%k}1~8(?tvxPY z!~)iPZl6~LM?BWm*W+&Ev$j>!9leXAYYB-tL`|*GcmcM~h6(WbwAy1U$!((v-*qqr zw@z<3d)NDJ-?#t{ETr^Hibqj1XEa8t<8-WlWx|ua$jcZwDpxH_1y5MoA|Qk1oacQT zsz*O#2>*fGx0KK-cJY`y`_)GJh&F$B2SISk1d|mORE^P2#4Z9ST~LX>L6sqzu?Xl- z+oV_eNtAjL3is;g({v`l)Nv#wNMrJM22DKWcgqe??8<4t6r1Q+KD65+(~s_tBi+5V zz`${ztDBh31qYsc|EW$&I*+6pig6vFrgi6d=67v(JB2WdWdbnPz+wN({kNnx=(8le z?9FVJf7>JA2hjsf@-?s&5=L%I-KrJj2lUbo{Ml_GpysPsY9~^gLq`0LZ0}gte^zr` z658&_?*q$-y;dXatj17l)zmhK$LA{?YKKM6tBo2CumEb&xT@9hpFk3JWA zX?LmYp>M?*P6(H2zk#3(I(&sGP7?!>F*F51(4Pt`BIXxZN8yX!mN1@DxQnJ?iNr3z zQtYF*Fm{e5$R!o1l#9kf4$S!3GG->&ZhIWfX`tJ(i2I&hzIbgHXXtK$n_xEqgn;i! zC>KFvUk4V>|5W6L0%c{86}u8$;Zx`LQcs~&y1$EPps-o7UsKuj020yj2dE(gL@3Ao`HI$@xaE3$)$Nq#sFS9($aw8GnhxZRT52{e?6^!!K-v z#a5~uR}BE6KZ6erPw@fKoL#9_+aeYebBshH#}FMDP&A2WV_jHWvgd_}D4N6vhv5C~ zsiM2Fi2Vk+o#`YBC2~+rkO+t0)Kb{*h^`N74s&_lm=x_eO5GEPrnYguGfY}(+v`wJ z$?j#@* z!l2h?lrrtO=z{BiiPCJO2GDQM$d5x7jfUpUc!2=*7brzS{blg(fB);UJ>;}$-ikAn zP-k|R^~5k_*l50bR!~Eac{GZ(Xf7hvT_n{&@ ag60orlf$$9%ScES6(6ZQ%)0;5?|%R^q?||q literal 0 HcmV?d00001 diff --git a/gm4_reeling_rods/pack.svg b/gm4_reeling_rods/pack.svg new file mode 100644 index 0000000000..1b652976c7 --- /dev/null +++ b/gm4_reeling_rods/pack.svg @@ -0,0 +1,126 @@ + + + + From c795a351cb5cbca7e6f1a2c325a37c0c93fa2961 Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 1 Jul 2025 11:02:52 +0900 Subject: [PATCH 082/101] Uncomment Icon Design in beet.yaml --- gm4_reeling_rods/beet.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index 038f49501e..8ab5f751b5 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -34,5 +34,5 @@ meta: Creators: - runcows - Bloo - #Icon Design: - #- runcows + Icon Design: + - runcows From 56a137bedb7175a73cd71b2daa576abc218fd86c Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 8 Jul 2025 05:36:58 +0900 Subject: [PATCH 083/101] Initial Guidebook and Readme --- gm4_reeling_rods/README.md | 15 +-- .../guidebook/reeling_rods.json | 110 ++++++++++++++++++ 2 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json diff --git a/gm4_reeling_rods/README.md b/gm4_reeling_rods/README.md index cd7081bc0d..b9e4fe8600 100644 --- a/gm4_reeling_rods/README.md +++ b/gm4_reeling_rods/README.md @@ -1,13 +1,10 @@ # Reeling Rods -Reel in more than just fish with these rods! Yoink the chest from the chest boat and more! +Reel in more than just fish with these rods. Yoink the chest from the chest boat, deal some damage, and more! ### Features -Fishing Rods can now yoink many more things! -- Pull Paintings off walls -- Reel in items from Item Frames -- Snatch leashed mobs from leash knots -- Try and fail to pull in an end crystal -Adds a new enchantment for fishing rods to take your yoinking up a notch! With it you can -- Separate chest boats and all minecart variants -- Steal items from allays +- All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle. + +Adds 2 fishing rod enchantments, Reeling and Barbed. +- Reeling revolves around stealing from entities. Pull the chest from chest boats and so much more! +- Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage. diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json new file mode 100644 index 0000000000..b9697f4236 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json @@ -0,0 +1,110 @@ +{ + "id": "reeling_rods", + "name": "Reeling Rods", + "module_type": "module", + "icon": { + "id": "minecraft:fishing_rod" + }, + "criteria": { + "obtain_fishing_rod": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "minecraft:fishing_rod" + } + ] + } + }, + "obtain_reeling_rod": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "minecraft:fishing_rod", + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:reeling" + } + ] + } + } + ] + } + }, + "obtain_barbed_rod": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "minecraft:fishing_rod", + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed" + } + ] + } + } + ] + } + } + }, + "sections": [ + { + "name": "description", + "enable": [], + "requirements": [ + [ + "obtain_fishing_rod" + ] + ], + "pages": [ + [ + { + "insert": "title" + }, + { + "translate": "text.gm4.guidebook.reeling_rods.description", + "fallback": "All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle." + } + ] + ] + }, + { + "name": "reeling", + "enable": [], + "requirements": [ + [ + "obtain_reeling_rod" + ] + ], + "pages": [ + [ + { + "translate": "text.gm4.guidebook.reeling_rods.reeling", + "fallback": "Reeling is an enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" + } + ] + ] + }, + { + "name": "barbed", + "enable": [], + "requirements": [ + [ + "obtain_barbed_rod" + ] + ], + "pages": [ + [ + { + "translate": "text.gm4.guidebook.reeling_rods.barbed", + "fallback": "Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage." + } + ] + ] + } + ] +} From c4668b225336fe161b49fa76da2ceebcb100862f Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 8 Jul 2025 08:59:30 +0900 Subject: [PATCH 084/101] Automated Guidebook Building Stuff --- gm4/modeldata_registry.json | 1 + gm4_guidebook/triggers.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gm4/modeldata_registry.json b/gm4/modeldata_registry.json index 3d0cd6842e..376bb5def0 100644 --- a/gm4/modeldata_registry.json +++ b/gm4/modeldata_registry.json @@ -527,6 +527,7 @@ "fishing_rod": { "gm4_end_fishing:gui/advancement/end_fishing": 1, "gm4_end_fishing:guidebook_icon/end_fishing": 2, + "gm4_reeling_rods:guidebook_icon/reeling_rods": 3, "gm4_metallurgy:shamir/hypexperia": 110, "gm4_animi_shamir:shamir/animi": 124 }, diff --git a/gm4_guidebook/triggers.json b/gm4_guidebook/triggers.json index b4b7ed6745..1638c317e0 100644 --- a/gm4_guidebook/triggers.json +++ b/gm4_guidebook/triggers.json @@ -1,6 +1,6 @@ { "__important__": "Generated by generate_guidebooks.py. Don't manually update this", - "__next__": 119, + "__next__": 120, "animi_shamir": 91, "apple_trees": 83, "arborenda_shamir": 20, @@ -81,6 +81,7 @@ "potion_liquids": 32, "potion_swords": 62, "record_crafting": 97, + "reeling_rods": 119, "relocators": 70, "resurrecting_skeletons": 41, "resurrecting_zombies": 46, From 03b65707f25ff40c6e4e6e8faa2b1f678e8aafd5 Mon Sep 17 00:00:00 2001 From: runcows <124551271+runcows@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:06:40 +0900 Subject: [PATCH 085/101] Update gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction Co-authored-by: Bloo --- .../data/gm4_reeling_rods/function/id/loop.mcfunction | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction index 30c28361c4..2fc18e92c5 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/loop.mcfunction @@ -1,6 +1,5 @@ # checks for bobbers and stops when there are none -# run from player/cast_line \ - & scheduled id/select_entities +# run from player/cast_line and scheduled from id/select_entities # assign new ids if there's a bobber execute as @e[type=minecraft:fishing_bobber] at @s run return run function gm4_reeling_rods:id/select_entities From 5964b5fc6cf7058d5a65df7b4b208db5619ac78c Mon Sep 17 00:00:00 2001 From: runcows <124551271+runcows@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:06:51 +0900 Subject: [PATCH 086/101] Update gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction Co-authored-by: Bloo --- gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction index bc976ad19c..dfcd00fbc3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/tick.mcfunction @@ -1,5 +1,5 @@ # checks if players have cast a line, then will assign ids to entities around bobber -execute as @a[scores={gm4_reeling_rods.rods_cast=1..}] at @s run function gm4_reeling_rods:player/cast_line +execute as @a[scores={gm4_reeling_rods.rods_cast=1..}] run function gm4_reeling_rods:player/cast_line # 5 ticks is good enough response time schedule function gm4_reeling_rods:tick 5t From 71e90bda8abb97b0767cea5d3211343b4c3ae530 Mon Sep 17 00:00:00 2001 From: runcows Date: Fri, 11 Jul 2025 17:44:56 +0900 Subject: [PATCH 087/101] A couple of header comments --- .../function/get_motion_to_player.mcfunction | 6 ++++-- .../data/gm4_reeling_rods/function/id/get_next.mcfunction | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 177d93747a..3b21461c42 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -1,4 +1,6 @@ -# Gets motion vector to launch item to player +# Gets motion vector to launch item to player. X and Z motion is 10% the block distance between the player and item. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion. +# @s = entity with items to be yoinked +# at @s # run from pull_items data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] @@ -32,7 +34,7 @@ scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionY gm4_r execute store result storage gm4_reeling_rods:temp lookup_key int 1 \ run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math -# store motion Y, scaled up +# Get Y motion, scaled up to match the squared values of before execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100 # Add looked up value diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction index dbfdbc9859..12c42af8c9 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/id/get_next.mcfunction @@ -1,4 +1,6 @@ # Gets the next id +# @s = entity to be assigned id +# at @s # run from id/set ## Binary Counter From f9805b1d17834fc91f820fb487954ca73b085b42 Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 12 Jul 2025 11:01:32 +0900 Subject: [PATCH 088/101] Update gm4_reeling_rods/generate_files.py --- gm4_reeling_rods/generate_files.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d701df545a..d62887de73 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -1,8 +1,8 @@ -from typing import List from beet import Context, Advancement, Function import math from pathlib import Path from gm4.utils import CSV, CSVRow +from itertools import product def beet_default(ctx: Context): """ @@ -65,22 +65,17 @@ def beet_default(ctx: Context): ''' def create_lookup_file(ctx: Context): - lookup_keys = [0] - for dx in range(0,34): - for dy in range(0,34): - for dz in range(0,34): - potenital_key = (dx * dx) + (dy * dy) + (dz * dz) - if (math.sqrt(potenital_key) > 33): # ignore values out of fishing bobber range - continue - if potenital_key in lookup_keys: # ignore if already found - continue - lookup_keys.append(potenital_key) - lookup_keys.sort() - strList: List[str] = [] - for key in lookup_keys: - value = math.floor(100*(0.08*math.sqrt(math.sqrt(key)))) - strList.append(f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}") - ctx.data["gm4_reeling_rods:set_lookup_table"] = Function(strList) + ctx.data["gm4_reeling_rods:set_lookup_table"] = Function( + [ + f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}" + for key, value in { + (x**2 + y**2 + z**2): int( + 100 * (0.08 * math.sqrt(math.sqrt(x**2 + y**2 + z**2))) + ) + for x, y, z in product(range(0, 34), range(0, 34), range(0, 34)) + }.items() if math.sqrt(key) <= 33 + ] + ) def create_bit_advancements(ctx: Context): for bit in range(16): From 888e1d353de98fe1f0344bd09e996c8ffa9b079f Mon Sep 17 00:00:00 2001 From: runcows Date: Sat, 12 Jul 2025 13:07:02 +0900 Subject: [PATCH 089/101] Fail minecart & mooshroom if passengers --- .../action.mcfunction => minecart.mcfunction} | 5 +++-- .../reeling/minecart/passenger_transfer.mcfunction | 7 ------- .../action.mcfunction => mooshroom.mcfunction} | 5 ++--- .../reeling/mooshroom/passenger_transfer.mcfunction | 7 ------- gm4_reeling_rods/entities.csv | 10 +++++----- 5 files changed, 10 insertions(+), 24 deletions(-) rename gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/{minecart/action.mcfunction => minecart.mcfunction} (82%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction rename gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/{mooshroom/action.mcfunction => mooshroom.mcfunction} (85%) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart.mcfunction similarity index 82% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart.mcfunction index b612640802..0c37bbb105 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart.mcfunction @@ -4,6 +4,9 @@ # with {block} # run from hooked_entity/select_type +# fail if passengers +execute if data entity @s Passengers run return fail + # steal data modify storage gm4_reeling_rods:temp item_data set value {} $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} @@ -12,10 +15,8 @@ function gm4_reeling_rods:pull_items # replace with minecart data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID -data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp -execute at @s on passengers run function gm4_reeling_rods:reeling/minecart/passenger_transfer tp @s ~ -1000 ~ playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction deleted file mode 100644 index 5fc26382dc..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart/passenger_transfer.mcfunction +++ /dev/null @@ -1,7 +0,0 @@ -# transfer old passenger to new minecart -# @s = passengers of *_minecart -# at old *_minecart -# run from reeling/minecart/action - -ride @s dismount -ride @s mount @e[type=minecraft:minecart,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom.mcfunction similarity index 85% rename from gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction rename to gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom.mcfunction index b5f4d4c261..87340c2908 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/action.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom.mcfunction @@ -3,8 +3,9 @@ # at bobber in @s # run from hooked_entity/select_type -# fail if baby +# fails execute unless data entity @s {Age:0} run return fail +execute if data entity @s Passengers run return fail # steal data modify storage gm4_reeling_rods:temp item_data set value {} @@ -16,10 +17,8 @@ function gm4_reeling_rods:pull_items # replace with cow data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID -data remove storage gm4_reeling_rods:temp entity_data.Passengers data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:cow" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp -execute at @s on passengers run function gm4_reeling_rods:reeling/mooshroom/passenger_transfer tp @s ~ -1000 ~ playsound entity.mooshroom.shear neutral @a[distance=..16] ~ ~ ~ diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction deleted file mode 100644 index 2b28ce8ae4..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom/passenger_transfer.mcfunction +++ /dev/null @@ -1,7 +0,0 @@ -# transfer old passenger to new cow -# @s = passengers of mooshroom -# at old mooshroom -# run from reeling/mooshroom/action - -ride @s dismount -ride @s mount @e[type=minecraft:cow,distance=..0.00001,limit=1] diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index 4e1d52e9a5..ed97389f98 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -7,14 +7,14 @@ id,needs_reeling,can_dismount,function #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/saddle" minecraft:bee,TRUE,TRUE,"gm4_reeling_rods:reeling/bee" minecraft:horse,TRUE,TRUE,"gm4_reeling_rods:reeling/horse" -minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom/action" +minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom" minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" minecraft:snow_golem,TRUE,TRUE,"gm4_reeling_rods:reeling/snow_golem" minecraft:villager,TRUE,TRUE,"gm4_reeling_rods:reeling/villager/action" -minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:chest'}" -minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:furnace'}" -minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:hopper'}" -minecraft:tnt_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart/action {block:'minecraft:tnt'}" +minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:chest'}" +minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:furnace'}" +minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:hopper'}" +minecraft:tnt_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:tnt'}" minecraft:acacia_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}" minecraft:bamboo_chest_raft,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" minecraft:birch_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}" From f35b237aba147deab520771a4486b18acd02254a Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 14 Jul 2025 15:24:09 +0900 Subject: [PATCH 090/101] Optimize reeling/stealable/steal_hand --- .../function/reeling/stealable/order/hands_1.mcfunction | 9 --------- .../function/reeling/stealable/order/hands_2.mcfunction | 9 --------- .../function/reeling/stealable/steal_hand.mcfunction | 9 ++++++--- .../reeling/stealable/steal_slot/mainhand.mcfunction | 2 +- .../reeling/stealable/steal_slot/offhand.mcfunction | 2 +- 5 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction delete mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction deleted file mode 100644 index 9dbc173cfa..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_1.mcfunction +++ /dev/null @@ -1,9 +0,0 @@ -# Checks slots to steal -# @s = #gm4_reeling_rods:steal_hand -# at bobber in @s -# run from reeling/stealable/steal_hand - -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand - -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction deleted file mode 100644 index 2ed8104e0a..0000000000 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/hands_2.mcfunction +++ /dev/null @@ -1,9 +0,0 @@ -# Checks slots to steal -# @s = #gm4_reeling_rods:steal_hand -# at bobber in @s -# run from reeling/stealable/steal_hand - -execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand -execute if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand - -return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction index fd73e6b97c..3b93d711b2 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction @@ -3,7 +3,10 @@ # at bobber in @s # run from hooked_entity/select_type -execute store result score $order gm4_reeling_rods.math run random value 1..2 +execute store result score $mainhand_first gm4_reeling_rods.math run random value 0..1 -execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:reeling/stealable/order/hands_1 -execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:reeling/stealable/order/hands_2 +execute if score $mainhand_first gm4_reeling_rods.math matches 1 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand +execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand +execute if score $mainhand_first gm4_reeling_rods.math matches 0 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand + +return fail diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction index 3434d65e0c..91fee2d576 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction @@ -1,7 +1,7 @@ # Steal Mainhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from reeling/stealable/order/* +# run from reeling/stealable/order/* and reeling/stealable/steal_hand ## drop chance fail conditions # to use default drop chances, we'd use 85 here as 8.5%, but we're setting it to 11.5% to match looting 3 chances diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction index aade2f7619..8b50fc578a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction @@ -1,7 +1,7 @@ # Steal Offhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s -# run from reeling/stealable/order/* +# run from reeling/stealable/order/* and reeling/stealable/steal_hand # fail if 0% drop chance execute if data entity @s {drop_chances:{offhand:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance From 0aa96fcc07c9e9d5257d6fa07176c80f6c09abae Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 15 Jul 2025 10:59:05 +0900 Subject: [PATCH 091/101] Clean `generate_files.py` and move a tag command --- .../player/find_hooked_entity.mcfunction | 4 ++ gm4_reeling_rods/generate_files.py | 44 +------------------ 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction index e15738325d..add3c5e232 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/player/find_hooked_entity.mcfunction @@ -17,6 +17,8 @@ execute store result score $motionX gm4_reeling_rods.math run data get storage g execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1 +tag @s add gm4_reeling_rods.player + # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_reeling_rods:player/owns_bobber \ @@ -25,3 +27,5 @@ $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ ] unless entity @s[tag=smithed.entity] unless data entity @s {Invulnerable:1b} \ run function gm4_reeling_rods:hooked_entity/select_type + +tag @s remove gm4_reeling_rods.player diff --git a/gm4_reeling_rods/generate_files.py b/gm4_reeling_rods/generate_files.py index d62887de73..f599decd72 100644 --- a/gm4_reeling_rods/generate_files.py +++ b/gm4_reeling_rods/generate_files.py @@ -23,46 +23,6 @@ def beet_default(ctx: Context): non_dismountable_entities.append(entity_type) ctx.meta['dismountable_entities'] = dismountable_entities ctx.meta['non_dismountable_entities'] = non_dismountable_entities -''' -My goal for right now is to go to the maximum scope and then have things cut back. -Push this idea as far as I can, then reign it in. - - Hand & Armor Yoinking - Treated as an action. If an entity is in one of the tags, don't list them separately in the csv - - Specific Entities - Villagers: - Does the armor theft cause reputational damage to player? - Currently, no. Easy to change though - Illagers: - Can have armor on them through commands (not dispensed), but doesn't render - Probably shouldn't theft armor that can't be applied by players, that's the realm of datapackers - Using hand item theft function - - CANT STEAL PILLAGER BANNER. Is that bad? - - Nugget idea? - Try to use drop chances for armor and if it fails drop armor material? - What about datapack armor?... I worry about compatibility - Probably want to implement drop chances one way though - Drowned Trident Theft - Super easy. Just lure them on land and then yoink it - Probably want to balance that - Drop Chances - Should implement for balance - Maybe just have gear break if the drop chance fails? - That's the best idea so far I think - - \\ ---[ REJECTED FOR A REASON ]--- \\ - Enderman : - Steal held block - ISSUE: Block state stored, not item data. - Could setblock with the block state, then get drop from breaking - Could map block type to item, but that's far too much work and not maintainable - Pufferfish : - Puff up a bit - ISSUE: Setting PuffState has issues. Set once is fine. Once it deflates a bit, setting again flashes and then reverts. - Probably an MC bug, should make an issue for it if it doesn't exist -''' def create_lookup_file(ctx: Context): ctx.data["gm4_reeling_rods:set_lookup_table"] = Function( @@ -108,7 +68,5 @@ def create_bit_advancements(ctx: Context): "execute if entity @s[gamemode=adventure] run return fail\n", "data modify storage gm4_reeling_rods:temp bit_data set value {bit_score:\"" + f"gm4_reeling_rods.id_bit.{bit}={value}\", bit:\"{bit}\"" + "}", "data modify storage gm4_reeling_rods:temp bit_data.UUID set from entity @s UUID", - "tag @s add gm4_reeling_rods.player", - "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data", - "tag @s remove gm4_reeling_rods.player" + "function gm4_reeling_rods:player/received_bit with storage gm4_reeling_rods:temp bit_data" ]) From 9e7ac70a1b5e9d0859e45c3c3cb6a4b422910c6d Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 16 Jul 2025 07:35:00 +0900 Subject: [PATCH 092/101] Add enderman falling block yoinking, fix a logical error with motion function, adjust a few commands --- .../function/get_execution_pos.mcfunction | 7 +++++ .../function/get_motion_to_player.mcfunction | 13 ++++---- .../function/pull_items.mcfunction | 2 +- .../reeling/enderman/action.mcfunction | 31 +++++++++++++++++++ .../reeling/enderman/falling_block.mcfunction | 14 +++++++++ .../function/reeling/summon_entity.mcfunction | 4 ++- .../function/summon_item.mcfunction | 2 ++ gm4_reeling_rods/entities.csv | 1 + 8 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction create mode 100644 gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction new file mode 100644 index 0000000000..5059a5ae26 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction @@ -0,0 +1,7 @@ +# stores position of a newly summoned marker and kills it +# @s = new marker +# at @s +# run from get_motion_to_player and reeling/enderman + +data modify storage gm4_reeling_rods:temp position set from entity @s Pos +kill @s diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 3b21461c42..903e5b61a3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -1,15 +1,16 @@ # Gets motion vector to launch item to player. X and Z motion is 10% the block distance between the player and item. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion. # @s = entity with items to be yoinked -# at @s +# at bobber in @s (most of the time) # run from pull_items data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] -# Store item pos -data modify storage gm4_reeling_rods:temp item_data.Pos set from entity @s Pos -execute store result score $itemX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[0] 1 -execute store result score $itemY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[1] 1 -execute store result score $itemZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Pos[2] 1 +# Store current position +execute summon marker run function gm4_reeling_rods:get_execution_pos +# | position stored in storage gm4_reeling_rods:temp position +execute store result score $itemX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[0] 1 +execute store result score $itemY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 1 +execute store result score $itemZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[2] 1 # Player postion is stored in $motionX... ect from player/find_hooked_entity diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction index 310e8d0660..b809ad1f84 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction @@ -1,6 +1,6 @@ # Separates an entity that needs it # @s = entity with items to be yoinked -# at @s +# at bobber in @s (most of the time) # run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction new file mode 100644 index 0000000000..88c5ac2e2e --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction @@ -0,0 +1,31 @@ +# Action for reeled enderman +# @s = enderman +# at bobber in @s +# run from hooked_entity/select_type + +# fail if no held block +execute unless data entity @s carriedBlockState run return fail + +## determine summon location +# | bobber sits at 80% up the hitbox, we want 30% up from the feet for the held block, which is also 50% of the hitbox height down from the bobber +# | this works out to taking 62.5% of the height from feet to bobber, and going down from the bobber that far +# | we can achieve this by dividing a 100x scaled up difference of feet and bobber height by 16 + +# bobber height +execute summon marker run function gm4_reeling_rods:get_execution_pos +# | position stored in storage gm4_reeling_rods:temp position +execute store result score $bobberY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100 + +# feet height +execute at @s summon marker run function gm4_reeling_rods:get_execution_pos +# | position stored in storage gm4_reeling_rods:temp position +execute store result score $feetY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100 + +scoreboard players operation $bobberY gm4_reeling_rods.math -= $feetY gm4_reeling_rods.math + +scoreboard players set #16 gm4_reeling_rods.math 16 +execute store result storage gm4_reeling_rods:temp displacement float 0.1 \ + run scoreboard players operation $bobberY gm4_reeling_rods.math /= #16 gm4_reeling_rods.math + +# use this as a macro for the falling block displacement +function gm4_reeling_rods:reeling/enderman/falling_block with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction new file mode 100644 index 0000000000..2bfff2fa39 --- /dev/null +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction @@ -0,0 +1,14 @@ +# Steal falling block of the enderman's held block +# @s = enderman +# at bobber in @s +# with {displacement} +# run from reeling/enderman/action + +data modify storage gm4_reeling_rods:temp entity_data set value {} +$execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:get_motion_to_player +# | motion vector stored in gm4_reeling_rods:temp item_data.Motion +data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:falling_block" +data modify storage gm4_reeling_rods:temp entity_data.Motion set from storage gm4_reeling_rods:temp item_data.Motion +data modify storage gm4_reeling_rods:temp entity_data.BlockState set from entity @s carriedBlockState +data remove entity @s carriedBlockState +$execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction index abac26ccfa..9c3e279a4a 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction @@ -1,5 +1,7 @@ # Summons a generic entity with data +# @s = entity that was hooked +# at @s (unless run from enderman) # with {entity_type, entity_data} -# run from reeling/{minecart|chest_boat|mooshroom}/action +# run from reeling/chest_boat/action and reeling/{minecart|mooshroom} and reeling/enderman/falling_block $summon $(entity_type) ~ ~ ~ $(entity_data) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction index d69d6929fb..91469011f3 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction @@ -1,4 +1,6 @@ # Summons item with data +# @s = entity with items to be yoinked +# at bobber in @s (most of the time) # run from pull_items & reeling/empty_container_entity $summon minecraft:item ~ ~ ~ $(item_data) diff --git a/gm4_reeling_rods/entities.csv b/gm4_reeling_rods/entities.csv index ed97389f98..58162aeafa 100644 --- a/gm4_reeling_rods/entities.csv +++ b/gm4_reeling_rods/entities.csv @@ -6,6 +6,7 @@ id,needs_reeling,can_dismount,function #gm4_reeling_rods:steal_hand,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_hand" #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/saddle" minecraft:bee,TRUE,TRUE,"gm4_reeling_rods:reeling/bee" +minecraft:enderman,TRUE,TRUE,"gm4_reeling_rods:reeling/enderman/action" minecraft:horse,TRUE,TRUE,"gm4_reeling_rods:reeling/horse" minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom" minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" From 96c9c22c8ae09568a64ebd10f8a63fadfac5c274 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 16 Jul 2025 07:37:03 +0900 Subject: [PATCH 093/101] Update get_motion_to_player header comment --- .../gm4_reeling_rods/function/get_motion_to_player.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 903e5b61a3..72567992c1 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -1,4 +1,4 @@ -# Gets motion vector to launch item to player. X and Z motion is 10% the block distance between the player and item. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion. +# Gets motion vector to launch entity to player. X and Z motion is 10% the block distance between the player and current position. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion. # @s = entity with items to be yoinked # at bobber in @s (most of the time) # run from pull_items From 3d4f1992a44aac074b20cb6e557278bc9e929fc7 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 16 Jul 2025 08:11:46 +0900 Subject: [PATCH 094/101] Update gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction - Swear this is the last time. I got all nitpicky about the comments --- .../function/get_motion_to_player.mcfunction | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction index 72567992c1..beb2d92c43 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction @@ -8,23 +8,23 @@ data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] # Store current position execute summon marker run function gm4_reeling_rods:get_execution_pos # | position stored in storage gm4_reeling_rods:temp position -execute store result score $itemX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[0] 1 -execute store result score $itemY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 1 -execute store result score $itemZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[2] 1 +execute store result score $currentX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[0] 1 +execute store result score $currentY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 1 +execute store result score $currentZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[2] 1 # Player postion is stored in $motionX... ect from player/find_hooked_entity -# Get delta from item to player -scoreboard players operation $motionX gm4_reeling_rods.math -= $itemX gm4_reeling_rods.math -scoreboard players operation $motionY gm4_reeling_rods.math -= $itemY gm4_reeling_rods.math -scoreboard players operation $motionZ gm4_reeling_rods.math -= $itemZ gm4_reeling_rods.math +# Get distance from current position to player +scoreboard players operation $motionX gm4_reeling_rods.math -= $currentX gm4_reeling_rods.math +scoreboard players operation $motionY gm4_reeling_rods.math -= $currentY gm4_reeling_rods.math +scoreboard players operation $motionZ gm4_reeling_rods.math -= $currentZ gm4_reeling_rods.math # store Motion, y to be edited after execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.1 run scoreboard players get $motionX gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.1 run scoreboard players get $motionY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.1 run scoreboard players get $motionZ gm4_reeling_rods.math -# Square +# Square the distances on each axis scoreboard players operation $motionX gm4_reeling_rods.math *= $motionX gm4_reeling_rods.math scoreboard players operation $motionY gm4_reeling_rods.math *= $motionY gm4_reeling_rods.math scoreboard players operation $motionZ gm4_reeling_rods.math *= $motionZ gm4_reeling_rods.math @@ -38,8 +38,8 @@ execute store result storage gm4_reeling_rods:temp lookup_key int 1 \ # Get Y motion, scaled up to match the squared values of before execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100 -# Add looked up value +# Add looked up value to motionY above function gm4_reeling_rods:get_lookup with storage gm4_reeling_rods:temp -# Store the Completed YMotion +# Store the Completed motionY execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.01 run scoreboard players get $motionY gm4_reeling_rods.math From 6543e66c6c09b779bacf4b48a3d14ffe7e16afba Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 18 Aug 2025 06:22:14 +0900 Subject: [PATCH 095/101] Translations file --- .../function/barbed/on_bleeding_death.mcfunction | 4 ++-- gm4_reeling_rods/translations.csv | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 gm4_reeling_rods/translations.csv diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction index 0117e6dc39..69a903dd2f 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction @@ -4,9 +4,9 @@ # run from barbed/bleed # death message -execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] +execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] execute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner -execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] +execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] execute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner # reset barbed state diff --git a/gm4_reeling_rods/translations.csv b/gm4_reeling_rods/translations.csv new file mode 100644 index 0000000000..53ab4d5c09 --- /dev/null +++ b/gm4_reeling_rods/translations.csv @@ -0,0 +1,7 @@ +gm4.reeling_rods.enchantment.reeling,"Reeling" +gm4.reeling_rods.enchantment.barbed,"Barbed" +text.gm4.reeling_rods.death.bleeding,"%s succumbed to their injuries" +text.gm4.reeling_rods.death.scratch,"%s was scratched to death by %s" +text.gm4.guidebook.reeling_rods.description,"All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle." +text.gm4.guidebook.reeling_rods.reeling,"Reeling is an enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" +text.gm4.guidebook.reeling_rods.barbed,"Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage." From f36adad915f5bcf89a0931f8502cb0e1c7a8de6d Mon Sep 17 00:00:00 2001 From: runcows Date: Mon, 18 Aug 2025 06:27:09 +0900 Subject: [PATCH 096/101] Forgot key in translations --- gm4_reeling_rods/translations.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/gm4_reeling_rods/translations.csv b/gm4_reeling_rods/translations.csv index 53ab4d5c09..49b3d34698 100644 --- a/gm4_reeling_rods/translations.csv +++ b/gm4_reeling_rods/translations.csv @@ -1,3 +1,4 @@ +key,en_us gm4.reeling_rods.enchantment.reeling,"Reeling" gm4.reeling_rods.enchantment.barbed,"Barbed" text.gm4.reeling_rods.death.bleeding,"%s succumbed to their injuries" From 2dbdd912b7a07270811350f139cda9196f461c3e Mon Sep 17 00:00:00 2001 From: runcows Date: Tue, 19 Aug 2025 13:16:42 +0900 Subject: [PATCH 097/101] Add Panda to steal hand - because I forgot them --- .../data/gm4_reeling_rods/tags/entity_type/steal_hand.json | 1 + 1 file changed, 1 insertion(+) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json index 76c8c7602e..1f4b11ed4e 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json @@ -3,6 +3,7 @@ "minecraft:allay", "minecraft:fox", "minecraft:illusioner", + "minecraft:panda", "minecraft:pillager", "minecraft:vex", "minecraft:vindicator", From 121b46874c6442a92a7d3b7d4b038a88be7122c9 Mon Sep 17 00:00:00 2001 From: runcows Date: Wed, 20 Aug 2025 06:15:36 +0900 Subject: [PATCH 098/101] Update header in get_execution_pos --- .../data/gm4_reeling_rods/function/get_execution_pos.mcfunction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction index 5059a5ae26..97442d330b 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction +++ b/gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction @@ -1,7 +1,7 @@ # stores position of a newly summoned marker and kills it # @s = new marker # at @s -# run from get_motion_to_player and reeling/enderman +# run from get_motion_to_player and reeling/enderman/action data modify storage gm4_reeling_rods:temp position set from entity @s Pos kill @s From e93ff91dc8a37b579078a520557ea2f7d2ad5913 Mon Sep 17 00:00:00 2001 From: runcows Date: Thu, 21 Aug 2025 18:25:30 +0900 Subject: [PATCH 099/101] Guidebook pages for reeling and barbed now unlock when getting an enchanted book with them on it --- .../guidebook/reeling_rods.json | 42 +++++++++++++++++-- gm4_reeling_rods/translations.csv | 2 +- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json index b9697f4236..9ad5e672cb 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json @@ -49,6 +49,40 @@ } ] } + }, + "obtain_reeling_book": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "minecraft:enchanted_book", + "predicates": { + "minecraft:stored_enchantments": [ + { + "enchantments": "gm4_reeling_rods:reeling" + } + ] + } + } + ] + } + }, + "obtain_barbed_book": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "minecraft:enchanted_book", + "predicates": { + "minecraft:stored_enchantments": [ + { + "enchantments": "gm4_reeling_rods:barbed" + } + ] + } + } + ] + } } }, "sections": [ @@ -77,14 +111,15 @@ "enable": [], "requirements": [ [ - "obtain_reeling_rod" + "obtain_reeling_rod", + "obtain_reeling_book" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.reeling_rods.reeling", - "fallback": "Reeling is an enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" + "fallback": "Reeling is a fishing rod enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" } ] ] @@ -94,7 +129,8 @@ "enable": [], "requirements": [ [ - "obtain_barbed_rod" + "obtain_barbed_rod", + "obtain_barbed_book" ] ], "pages": [ diff --git a/gm4_reeling_rods/translations.csv b/gm4_reeling_rods/translations.csv index 49b3d34698..fe1f8aa589 100644 --- a/gm4_reeling_rods/translations.csv +++ b/gm4_reeling_rods/translations.csv @@ -4,5 +4,5 @@ gm4.reeling_rods.enchantment.barbed,"Barbed" text.gm4.reeling_rods.death.bleeding,"%s succumbed to their injuries" text.gm4.reeling_rods.death.scratch,"%s was scratched to death by %s" text.gm4.guidebook.reeling_rods.description,"All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle." -text.gm4.guidebook.reeling_rods.reeling,"Reeling is an enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" +text.gm4.guidebook.reeling_rods.reeling,"Reeling is a fishing rod enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" text.gm4.guidebook.reeling_rods.barbed,"Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage." From 0a265c687d4a243d1b6339f468d5115a2c4cd301 Mon Sep 17 00:00:00 2001 From: Bloo Date: Fri, 22 Aug 2025 11:47:25 +0200 Subject: [PATCH 100/101] Reword Guidebook Pages --- .../data/gm4_reeling_rods/guidebook/reeling_rods.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json index 9ad5e672cb..a2110fff92 100644 --- a/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json +++ b/gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json @@ -101,7 +101,7 @@ }, { "translate": "text.gm4.guidebook.reeling_rods.description", - "fallback": "All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle." + "fallback": "Fishing rods can be useful tools for (accidental) home re-decoration: Paintings and Item Frames can be ripped of walls, whilst leashes and Shulkers are moved around with ease." } ] ] @@ -119,7 +119,7 @@ [ { "translate": "text.gm4.guidebook.reeling_rods.reeling", - "fallback": "Reeling is a fishing rod enchantment that revolves around stealing from entities. Pull the chest from chest boats and so much more!" + "fallback": "When enchanted with Reeling, a fishing rod becomes a sneaky tool for disassembly and thievery. Take a Villager's wares or un-boat a chest boat chest." } ] ] @@ -137,7 +137,7 @@ [ { "translate": "text.gm4.guidebook.reeling_rods.barbed", - "fallback": "Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage." + "fallback": "Barbed turns a fishing rod into a lethal weapon. Throw your bobber at foes to scratch them up! Higher levels cause more damage over time." } ] ] From afc9279a725874f1444a38b1ee8e3a50b8bd4eb6 Mon Sep 17 00:00:00 2001 From: runcows Date: Fri, 22 Aug 2025 18:57:38 +0900 Subject: [PATCH 101/101] Add unreleased modrinth page id --- gm4_reeling_rods/beet.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gm4_reeling_rods/beet.yaml b/gm4_reeling_rods/beet.yaml index 8ab5f751b5..5a0fcf2e47 100644 --- a/gm4_reeling_rods/beet.yaml +++ b/gm4_reeling_rods/beet.yaml @@ -22,8 +22,8 @@ meta: - gm4_end_fishing - gm4_live_catch notes: [] - #modrinth: - #project_id: + modrinth: + project_id: MWPuloVL #smithed: #pack_id: #planetminecraft: