Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ jobs:
fabric_server_url: https://meta.fabricmc.net/v2/versions/loader/1.21.10/0.18.1/1.1.0/server/jar
fabric_api_url: https://cdn.modrinth.com/data/P7dR8mSH/versions/dQ3p80zK/fabric-api-0.138.3%2B1.21.10.jar
packtest_url: https://cdn.modrinth.com/data/XsKUhp45/versions/11yGLsYO/packtest-2.3-beta1-mc1.21.10.jar
- version: '1.21.11'
fabric_server_url: https://meta.fabricmc.net/v2/versions/loader/1.21.11-rc2/0.18.1/1.1.0/server/jar
fabric_api_url: https://cdn.modrinth.com/data/P7dR8mSH/versions/RDb9rvBm/fabric-api-0.139.4%2B1.21.11.jar
packtest_url: https://cdn.modrinth.com/data/XsKUhp45/versions/GN6fvTsW/packtest-2.4-beta2-mc1.21.11.jar
name: 'test-${{ matrix.version }}'
runs-on: ubuntu-24.04
steps:
Expand Down
1 change: 1 addition & 0 deletions base/data/gm4/tags/entity_type/hostile.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"minecraft:hoglin",
"minecraft:husk",
"minecraft:magma_cube",
{"id": "minecraft:parched", "required": false},
"minecraft:phantom",
"minecraft:piglin_brute",
"minecraft:pillager",
Expand Down
2 changes: 2 additions & 0 deletions base/data/gm4/tags/entity_type/neutral_hostile.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
{
"values": [
{"id": "minecraft:camel_husk", "required": false},
"minecraft:cave_spider",
"minecraft:creaking",
"minecraft:drowned",
"minecraft:enderman",
"minecraft:piglin",
"minecraft:spider",
{"id": "minecraft:zombie_nautilus", "required": false},
"minecraft:zombified_piglin"
]
}
1 change: 1 addition & 0 deletions base/data/gm4/tags/entity_type/passive.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"minecraft:horse",
"minecraft:mooshroom",
"minecraft:mule",
{"id": "minecraft:nautilus", "required": false},
"minecraft:ocelot",
"minecraft:parrot",
"minecraft:pig",
Expand Down
84 changes: 56 additions & 28 deletions gm4/plugins/backwards.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging
import re
from typing import Any, Tuple, Callable
from beet import Context, Pack, NamespaceFile, ItemModel
from beet import Context, Pack, NamespaceFile, ItemModel, Function

logger = logging.getLogger("gm4.backwards")

Expand All @@ -11,38 +12,65 @@ def beet_default(ctx: Context):
# edited item model definition - replaced head with player_head
backport(ctx.assets, 63, playerhead_models_1_21_5)

# renamed gamerules
backport(ctx.data, 92, rename_gamerules)


def playerhead_models_1_21_5(id: str, resource: NamespaceFile):
if not isinstance(resource, ItemModel):
return None
if id != "minecraft:player_head":
return None

def recursive_replace(compound: dict[str,Any]):
for key, val in compound.items():
# recurse down the tree
if isinstance(val, list):
for subval in val: # type: ignore
if isinstance(subval, dict):
recursive_replace(subval) # type: ignore
elif isinstance(val, dict):
recursive_replace(val) # type: ignore
# then replace matching compounds
match val:
case {
"type": "minecraft:special",
"model": {
"type": "minecraft:player_head"
}
}:
compound[key]["model"]["type"] = "minecraft:head"
compound[key]["model"]["kind"] = "player"
case _: # type: ignore
pass

overlay = resource.copy()
recursive_replace(overlay.data)
return overlay


# Only gamerules that are actually used are replaced
GAMERULES_RENAMES = {
"command_block_output": "commandBlockOutput",
"spawn_phantoms": "doInsomnia",
"natural_health_regeneration": "naturalRegeneration",
"random_tick_speed": "randomTickSpeed",
"send_command_feedback": "sendCommandFeedback",
"show_death_messages": "showDeathMessages",
}


def rename_gamerules(id: str, resource: NamespaceFile):
if not isinstance(resource, Function):
return None
text = resource.text
for new_gamerule, old_gamerule in GAMERULES_RENAMES.items():
text = re.sub(f"gamerule (minecraft:)?{new_gamerule}\\b", f"gamerule {old_gamerule}", text)
if text == resource.text:
return None
overlay = resource.copy()
json = overlay.data
if id=="minecraft:player_head":
def recursive_replace(compound: dict[str,Any]):
for key, val in compound.items():
# recurse down the tree
if isinstance(val, list):
for subval in val: # type: ignore
if isinstance(subval, dict):
recursive_replace(subval) # type: ignore
elif isinstance(val, dict):
recursive_replace(val) # type: ignore
# then replace matching compounds
match val:
case {
"type": "minecraft:special",
"model": {
"type": "minecraft:player_head"
}
}:
compound[key]["model"]["type"] = "minecraft:head"
compound[key]["model"]["kind"] = "player"
case _: # type: ignore
pass

recursive_replace(json)
return overlay
return None
overlay.text = text
return overlay


def backport(pack: Pack[Any], format: int, run: Callable[[str, NamespaceFile], NamespaceFile | None]):
Expand Down
2 changes: 1 addition & 1 deletion gm4/plugins/manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

parent_logger = logging.getLogger("gm4.manifest")

SUPPORTED_GAME_VERSIONS = ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10"]
SUPPORTED_GAME_VERSIONS = ["1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10", "1.21.11"]

# config models for beet.yaml metas
CreditsModel = dict[str, list[str]]
Expand Down
10 changes: 5 additions & 5 deletions gm4/plugins/write_mcmeta.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ def beet_default(ctx: Context):
manifest_entry = {v.id:v for v in (manifest.modules|manifest.libraries).values()}.get(ctx.project_id, NoneAttribute())

ctx.data.pack_format = 71
ctx.data.supported_formats = {"min_inclusive": 71, "max_inclusive": 88}
ctx.data.supported_formats = {"min_inclusive": 71, "max_inclusive": 94}
ctx.data.min_format = 71
ctx.data.max_format = (88, 0)
ctx.data.max_format = 94

ctx.assets.pack_format = 55
ctx.assets.supported_formats = {"min_inclusive": 55, "max_inclusive": 69}
ctx.assets.supported_formats = {"min_inclusive": 55, "max_inclusive": 75}
ctx.assets.min_format = 55
ctx.assets.max_format = (69, 0)
ctx.assets.max_format = 75

for pack in ctx.packs:
pack.description = [
ctx.project_name,
"\n",
{
"text": f"Gamemode 4 (1.21.5 - 1.21.9)",
"text": f"Gamemode 4 (1.21.5+)",
"color": "#4AA0C7"
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
# run from gm4_fruiting_trees:wandering_trader/add_trade

# apple sapling
execute if predicate gm4_apple_trees:overworld run summon trader_llama ~ 0 ~ {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option","gm4_new_trade_option"],Items:[{},{id:"minecraft:emerald",count:5,Slot:1b},{}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:8,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
execute if predicate gm4_apple_trees:overworld run summon trader_llama ~ 0 ~ {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option","gm4_new_trade_option"],Items:[{id:"minecraft:emerald",count:5,Slot:1b}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:8,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
loot replace entity @e[type=trader_llama,limit=1,tag=gm4_new_trade_option] horse.0 loot gm4_apple_trees:items/apple_tree_sapling
tag @e[type=trader_llama] remove gm4_new_trade_option
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@

tp @s ~ 0 ~

data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{},{id:"minecraft:emerald",count:8,Slot:1b},{}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{id:"minecraft:emerald",count:8,Slot:1b}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}

loot replace entity @s horse.0 loot gm4_balloon_animals:bee_nest
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

tp @s ~ 0 ~

data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{},{id:"minecraft:emerald",count:2,Slot:1b},{}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1b,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:4,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{id:"minecraft:emerald",count:2,Slot:1b}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1b,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:4,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}


execute store result score $variant_id gm4_balloon_animals_data run random value 0..2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@

tp @s ~ 0 ~

data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{},{id:"minecraft:emerald",count:8,Slot:1b},{}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{id:"minecraft:emerald",count:8,Slot:1b}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}

loot replace entity @s horse.0 loot gm4_balloon_animals:turtle_egg
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# run from wandering_trader/trade/init_[animal|wolf|farm]

tp @s ~ 0 ~
data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{},{id:"minecraft:emerald",count:12,Slot:1b},{}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}
data merge entity @s {Silent:1b,NoGravity:1b,Invulnerable:1b,ChestedHorse:1b,Variant:0,Strength:1,DespawnDelay:1,Tags:["gm4_trade_option"],Items:[{id:"minecraft:emerald",count:12,Slot:1b}],equipment:{body:{id:"minecraft:light_blue_carpet",count:1,components:{"minecraft:custom_data":{gm4_trades:{options:{maxUses:1,rewardXp:1b,xp:1,priceMultiplier:0.05f}}}}}}}

loot replace entity @s horse.0 loot gm4_balloon_animals:lead

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
pools = []
enchantments = ["minecraft:binding_curse", "minecraft:vanishing_curse", "minecraft:riptide", "minecraft:channeling", "minecraft:wind_burst", "minecraft:frost_walker", "minecraft:sharpness", "minecraft:smite", "minecraft:bane_of_arthropods", "minecraft:impaling", "minecraft:power", "minecraft:density", "minecraft:breach", "minecraft:piercing", "minecraft:sweeping_edge", "minecraft:multishot", "minecraft:fire_aspect", "minecraft:flame", "minecraft:knockback", "minecraft:punch", "minecraft:protection", "minecraft:blast_protection", "minecraft:fire_protection", "minecraft:projectile_protection", "minecraft:feather_falling", "minecraft:fortune", "minecraft:looting", "minecraft:silk_touch", "minecraft:luck_of_the_sea", "minecraft:efficiency", "minecraft:quick_charge", "minecraft:lure", "minecraft:respiration", "minecraft:aqua_affinity", "minecraft:soul_speed", "minecraft:swift_sneak", "minecraft:depth_strider", "minecraft:thorns", "minecraft:loyalty", "minecraft:unbreaking", "minecraft:infinity", "minecraft:mending"]
# expecting enchantment in format, "minecraft:name"
# see bookshelf inspectors, evaluate/process_display/spawn/components_to_list

for enchantment in enchantments:
pools.append(
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:paper",
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:custom_model_data": "item/enchanted_page"
}
},
{
"function": "minecraft:set_custom_data",
"tag": "{gm4_book_binders:{item:\"enchanted_page\"}}"
},
{
"function": "minecraft:set_name",
"entity": "this",
"target": "custom_name",
"name": {
"translate": "item.gm4.enchanted_page",
"fallback": "Enchanted Page",
"italic": false
}
},
{
"function": "minecraft:set_enchantments",
"enchantments": {
f"{enchantment}": {
"type": "minecraft:storage",
"storage": "gm4_book_binders:temp",
"path": f"stored_enchantments.\"{enchantment}\""
}
}
}
]
}
],
"conditions": [
{
"condition": "minecraft:value_check",
"value": {
"type": "minecraft:storage",
"storage": "gm4_book_binders:temp",
"path": f"stored_enchantments.\"{enchantment}\""
},
"range": {
"min": 1,
"max": 255
}
}
]
}
)

{
"pools": pools
}
7 changes: 7 additions & 0 deletions gm4_book_binders/beet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ version: 1.5.X

data_pack:
load: .
overlays:
- formats:
min_inclusive: 1
max_inclusive: 88
min_format: 1
max_format: 88
directory: backport_88

require:
- bolt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
pools = []
enchantments = ["minecraft:binding_curse", "minecraft:vanishing_curse", "minecraft:riptide", "minecraft:channeling", "minecraft:wind_burst", "minecraft:frost_walker", "minecraft:sharpness", "minecraft:smite", "minecraft:bane_of_arthropods", "minecraft:impaling", "minecraft:power", "minecraft:density", "minecraft:breach", "minecraft:piercing", "minecraft:sweeping_edge", "minecraft:multishot", "minecraft:fire_aspect", "minecraft:flame", "minecraft:knockback", "minecraft:punch", "minecraft:protection", "minecraft:blast_protection", "minecraft:fire_protection", "minecraft:projectile_protection", "minecraft:feather_falling", "minecraft:fortune", "minecraft:looting", "minecraft:silk_touch", "minecraft:luck_of_the_sea", "minecraft:efficiency", "minecraft:quick_charge", "minecraft:lure", "minecraft:respiration", "minecraft:aqua_affinity", "minecraft:soul_speed", "minecraft:swift_sneak", "minecraft:depth_strider", "minecraft:thorns", "minecraft:loyalty", "minecraft:unbreaking", "minecraft:infinity", "minecraft:mending"]
enchantments = ["minecraft:binding_curse", "minecraft:vanishing_curse", "minecraft:riptide", "minecraft:channeling", "minecraft:wind_burst", "minecraft:frost_walker", "minecraft:sharpness", "minecraft:smite", "minecraft:bane_of_arthropods", "minecraft:impaling", "minecraft:power", "minecraft:density", "minecraft:breach", "minecraft:piercing", "minecraft:sweeping_edge", "minecraft:multishot", "minecraft:fire_aspect", "minecraft:flame", "minecraft:knockback", "minecraft:punch", "minecraft:protection", "minecraft:blast_protection", "minecraft:fire_protection", "minecraft:projectile_protection", "minecraft:feather_falling", "minecraft:fortune", "minecraft:looting", "minecraft:silk_touch", "minecraft:luck_of_the_sea", "minecraft:efficiency", "minecraft:quick_charge", "minecraft:lure", "minecraft:respiration", "minecraft:aqua_affinity", "minecraft:soul_speed", "minecraft:swift_sneak", "minecraft:depth_strider", "minecraft:thorns", "minecraft:loyalty", "minecraft:unbreaking", "minecraft:infinity", "minecraft:mending", "minecraft:lunge"]
# expecting enchantment in format, "minecraft:name"
# see bookshelf inspectors, evaluate/process_display/spawn/components_to_list

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ ALL_ENCHANTMENTS = [
"luck_of_the_sea",
"efficiency",
"quick_charge",
"lunge",
"lure",
"respiration",
"aqua_affinity",
Expand Down
1 change: 1 addition & 0 deletions gm4_cooler_caves/beet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ data_pack:
pipeline:
- gm4.plugins.extend.module
- gm4.plugins.include.pfb_biome_extensions
- gm4_cooler_caves.fix_overlays

meta:
gm4:
Expand Down
8 changes: 8 additions & 0 deletions gm4_cooler_caves/fix_overlays.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from beet import Context

# Due to a bug in beet, we need to manually set the overlay formats
def beet_default(ctx: Context):
overlay = ctx.data.overlays["backport_88"]
overlay.min_format = 1
overlay.max_format = 88
overlay.supported_formats = {"min_inclusive": 1, "max_inclusive": 88}
10 changes: 8 additions & 2 deletions gm4_disassemblers/beet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@ data_pack:
overlays:
- formats:
min_inclusive: 88
max_inclusive: 88
max_inclusive: 94
min_format: 88
max_format: 88
max_format: 94
directory: since_88
- formats:
min_inclusive: 94
max_inclusive: 94
min_format: 94
max_format: 94
directory: since_94
- formats:
min_inclusive: 81
max_inclusive: 88
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# processes each item
# @s = armor stand display (we need the hand) [tag=gm4_disassembler_stand]
# located at the disassembler block
# run from extract
# run from process

data modify entity @s equipment.mainhand set from storage gm4_disassemblers:temp Items[0]
execute store result score $damage gm4_disassembler run data get storage gm4_disassemblers:temp Items[0].components."minecraft:damage"
scoreboard players set $dropped gm4_disassembler 0
function #gm4_disassemblers:before_base
execute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:during_base
execute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:after_base
item replace entity @s weapon.mainhand with minecraft:air
Loading
Loading