1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00

add inventory codegen

This commit is contained in:
mat 2022-12-04 22:43:01 -06:00
parent 1b5597c571
commit c0b2b50545
3 changed files with 160 additions and 7 deletions

View file

@ -30,7 +30,67 @@ declare_menus! {
Generic9x3 {
contents: 27,
},
Chest {
block: 27,
}
Generic9x4 {
todo!()
},
Generic9x5 {
todo!()
},
Generic9x6 {
todo!()
},
Generic3x3 {
todo!()
},
Anvil {
todo!()
},
Beacon {
todo!()
},
BlastFurnace {
todo!()
},
BrewingStand {
todo!()
},
Crafting {
todo!()
},
Enchantment {
todo!()
},
Furnace {
todo!()
},
Grindstone {
todo!()
},
Hopper {
todo!()
},
Lectern {
todo!()
},
Loom {
todo!()
},
Merchant {
todo!()
},
ShulkerBox {
todo!()
},
Smithing {
todo!()
},
Smoker {
todo!()
},
CartographyTable {
todo!()
},
Stonecutter {
todo!()
},
}

View file

@ -1,3 +1,4 @@
import lib.code.inventory
import lib.code.registry
import lib.code.version
import lib.code.packet
@ -10,6 +11,7 @@ version_id = lib.code.version.get_version_id()
registries = lib.extract.get_registries_report(version_id)
lib.code.registry.generate_registries(registries)
lib.code.inventory.update_menus(registries['minecraft:menu']['entries'])
lib.code.utils.fmt()

View file

@ -1,17 +1,108 @@
from lib.utils import padded_hex, to_snake_case, to_camel_case, get_dir_location
from lib.code.utils import burger_type_to_rust_type, write_packet_file
from lib.mappings import Mappings
from typing import Any, Optional
import os
import re
# The directoey where declare_menus! {} is done
inventory_menus_dir = get_dir_location(f'../azalea-inventory/src/lib.rs')
def update_menus():
def update_menus(initial_menu_entries: dict[str, Any]):
# new_menus is a dict of { menu_id: { "protocol_id": protocol_id } }
# so convert that into an array where the protocol id is the index and the
# values are enum variant names
new_menus: list[str] = [''] * len(initial_menu_entries)
for menu_id, menu in initial_menu_entries.items():
new_menus[menu['protocol_id']] = menu_name_to_enum_name(menu_id)
new_menus.insert(0, 'Player')
with open(inventory_menus_dir, 'r') as f:
menus_rs = f.read().splitlines()
current_menus = []
start_line_index = 0
current_menus = []
in_the_macro = False
for line in menus_rs:
for i, line in enumerate(menus_rs):
if line.startswith('declare_menus!'):
in_the_macro = True
start_line_index = i
if in_the_macro:
if line.startswith(' ') and line.endswith('{'):
current_menus.append(line.)
# get the variant name for this menu
current_menu = line[:-1].strip()
current_menus.append(current_menu)
print('current_menus', current_menus)
print('new_menus', new_menus)
# now we have the current menus, so compare that with the expected
# menus and update the file if needed
if current_menus != new_menus:
# ok so insert the new menus with todo!() for the body
current_menus_list_index = 0
new_menus_list_index = 0
insert_line_index = start_line_index + 1
# figure out what menus need to be placed
while True:
# if the values at the indexes are the same, add to both and don't do anything
if (
current_menus_list_index < len(current_menus)
and new_menus_list_index < len(new_menus)
and current_menus[current_menus_list_index] == new_menus[new_menus_list_index]
):
current_menus_list_index += 1
new_menus_list_index += 1
# increase insert_line_index until we get a line that starts with }
while not menus_rs[insert_line_index].strip().startswith('}'):
insert_line_index += 1
insert_line_index += 1
# print('same', current_menus_list_index,
# new_menus_list_index, insert_line_index)
# something was added to new_menus but not current_menus
elif new_menus_list_index < len(new_menus) and new_menus[new_menus_list_index] not in current_menus:
# insert the new menu
menus_rs.insert(
insert_line_index, f' {new_menus[new_menus_list_index]} {{\n todo!()\n }},')
insert_line_index += 1
new_menus_list_index += 1
print('added', current_menus_list_index,
new_menus_list_index, insert_line_index)
# something was removed from new_menus but is still in current_menus
elif current_menus_list_index < len(current_menus) and current_menus[current_menus_list_index] not in new_menus:
# remove the current menu
while not menus_rs[insert_line_index].strip().startswith('}'):
menus_rs.pop(insert_line_index)
menus_rs.pop(insert_line_index)
current_menus_list_index += 1
print('removed', current_menus_list_index,
new_menus_list_index, insert_line_index)
# if current_menus_list_index overflowed, then add the rest of the new menus
elif current_menus_list_index >= len(current_menus):
for i in range(new_menus_list_index, len(new_menus)):
menus_rs.insert(
insert_line_index, f' {new_menus[i]} {{\n todo!()\n }},')
insert_line_index += 1
print('current_menus_list_index overflowed', current_menus_list_index,
new_menus_list_index, insert_line_index)
break
# if new_menus_list_index overflowed, then remove the rest of the current menus
elif new_menus_list_index >= len(new_menus):
for _ in range(current_menus_list_index, len(current_menus)):
while not menus_rs[insert_line_index].strip().startswith('}'):
menus_rs.pop(insert_line_index)
menus_rs.pop(insert_line_index)
# current_menus_list_index += 1
print('new_menus_list_index overflowed', current_menus_list_index,
new_menus_list_index, insert_line_index)
break
with open(inventory_menus_dir, 'w') as f:
f.write('\n'.join(menus_rs))
def menu_name_to_enum_name(menu_name: str) -> str:
return to_camel_case(menu_name.split(':')[-1])