1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00
This commit is contained in:
mat 2022-05-07 17:29:51 -05:00
parent cf34a7c414
commit 7b61d41f86
3 changed files with 29 additions and 4 deletions

View file

@ -39,3 +39,5 @@ with open('burger.json', 'r') as f:
burger_packets_data = burger_data[0]['packets']['packet'] burger_packets_data = burger_data[0]['packets']['packet']
packetcodegen.generate(burger_packets_data, mappings) packetcodegen.generate(burger_packets_data, mappings)
os.system('cd .. && cargo fmt')

View file

@ -1,5 +1,6 @@
from utils import to_snake_case, to_camel_case from utils import to_snake_case, to_camel_case
from mappings import Mappings from mappings import Mappings
import os
def burger_type_to_rust_type(burger_type): def burger_type_to_rust_type(burger_type):
@ -33,18 +34,24 @@ def burger_type_to_rust_type(burger_type):
elif burger_type == 'chatcomponent': elif burger_type == 'chatcomponent':
field_type_rs = 'Component' field_type_rs = 'Component'
uses.add('azalea_chat::component::Component')
elif burger_type == 'identifier': elif burger_type == 'identifier':
field_type_rs = 'ResourceLocation' field_type_rs = 'ResourceLocation'
uses.add('azalea_core::resource_location::ResourceLocation')
elif burger_type == 'uuid': elif burger_type == 'uuid':
field_type_rs = 'Uuid' field_type_rs = 'Uuid'
uses.add('uuid::Uuid')
elif burger_type == 'position': elif burger_type == 'position':
field_type_rs = 'BlockPos' field_type_rs = 'BlockPos'
uses.add('azalea_core::BlockPos')
elif burger_type == 'nbtcompound': elif burger_type == 'nbtcompound':
field_type_rs = 'azalea_nbt::Tag' field_type_rs = 'azalea_nbt::Tag'
elif burger_type == 'itemstack': elif burger_type == 'itemstack':
field_type_rs = 'Slot' field_type_rs = 'Slot'
uses.add('azalea_core::Slot')
elif burger_type == 'metadata': elif burger_type == 'metadata':
field_type_rs = 'EntityMetadata' field_type_rs = 'EntityMetadata'
uses.add('crate::mc_buf::EntityMetadata')
elif burger_type == 'enum': elif burger_type == 'enum':
# enums are too complicated, leave those to the user # enums are too complicated, leave those to the user
field_type_rs = 'todo!()' field_type_rs = 'todo!()'
@ -59,18 +66,26 @@ def burger_type_to_rust_type(burger_type):
def write_packet_file(state, packet_name_snake_case, code): def write_packet_file(state, packet_name_snake_case, code):
with open(f'../azalea-protocol/src/packets/{state}/{packet_name_snake_case}.rs', 'w') as f: path = os.path.join(
'..', f'azalea-protocol/src/packets/{state}/{packet_name_snake_case}.rs')
with open(path, 'w') as f:
f.write(code) f.write(code)
def generate(burger_packets, mappings: Mappings): def generate(burger_packets, mappings: Mappings):
packet_ids = [75]
for packet in burger_packets.values(): for packet in burger_packets.values():
if packet['id'] not in packet_ids:
continue
direction = packet['direction'].lower() # serverbound or clientbound direction = packet['direction'].lower() # serverbound or clientbound
state = packet['state'].lower() state = {'PLAY': 'game'}.get(packet['state'], packet['state'].lower())
generated_packet_code = [] generated_packet_code = []
uses = set()
generated_packet_code.append( generated_packet_code.append(
f'#[derive(Clone, Debug, {to_camel_case(state)}Packet)]') f'#[derive(Clone, Debug, {to_camel_case(state)}Packet)]')
uses.add(f'packet_macros::{to_camel_case(state)}Packet')
obfuscated_class_name = packet['class'].split('.')[0] obfuscated_class_name = packet['class'].split('.')[0]
class_name = mappings.get_class(obfuscated_class_name).split('.')[-1] class_name = mappings.get_class(obfuscated_class_name).split('.')[-1]
@ -90,17 +105,25 @@ def generate(burger_packets, mappings: Mappings):
continue continue
field_type = instruction['type'] field_type = instruction['type']
field_type_rs, is_var, uses = burger_type_to_rust_type( field_type_rs, is_var, instruction_uses = burger_type_to_rust_type(
field_type) field_type)
if is_var: if is_var:
generated_packet_code.append('#[var]') generated_packet_code.append('#[var]')
generated_packet_code.append( generated_packet_code.append(
f'pub {to_snake_case(field_name)}: {field_type_rs},') f'pub {to_snake_case(field_name)}: {field_type_rs},')
uses.update(instruction_uses)
else: else:
generated_packet_code.append(f'// TODO: {instruction}') generated_packet_code.append(f'// TODO: {instruction}')
continue continue
generated_packet_code.append('}') generated_packet_code.append('}')
if uses:
# empty line before the `use` statements
generated_packet_code.insert(0, '')
for use in uses:
generated_packet_code.insert(0, f'use {use};')
print(generated_packet_code) print(generated_packet_code)
write_packet_file(state, to_snake_case(class_name), write_packet_file(state, to_snake_case(class_name),
'\n'.join(generated_packet_code)) '\n'.join(generated_packet_code))

View file

@ -7,7 +7,7 @@ import io
def to_snake_case(name): def to_snake_case(name):
s = re.sub('([A-Z])', r'_\1', name) s = re.sub('([A-Z])', r'_\1', name)
return s.lower() return s.lower().strip('_')
def to_camel_case(name): def to_camel_case(name):