aboutsummaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'codegen')
-rw-r--r--codegen/burger.json1
-rw-r--r--codegen/lib/code/packet.py (renamed from codegen/lib/packetcodegen.py)118
-rw-r--r--codegen/lib/code/utils.py73
-rw-r--r--codegen/lib/code/version.py31
-rw-r--r--codegen/lib/utils.py12
-rw-r--r--codegen/migrate.py52
-rw-r--r--codegen/newpacket.py8
7 files changed, 214 insertions, 81 deletions
diff --git a/codegen/burger.json b/codegen/burger.json
deleted file mode 100644
index 4fa39aa3..00000000
--- a/codegen/burger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"message": "Not Found", "documentation_url": "https://docs.github.com/rest/reference/repos#get-the-latest-release"} \ No newline at end of file
diff --git a/codegen/lib/packetcodegen.py b/codegen/lib/code/packet.py
index b4c6a83b..0d3ad138 100644
--- a/codegen/lib/packetcodegen.py
+++ b/codegen/lib/code/packet.py
@@ -1,72 +1,10 @@
-from .utils import to_snake_case, to_camel_case
-from .mappings import Mappings
-
-
-def burger_type_to_rust_type(burger_type):
- is_var = False
- uses = set()
-
- if burger_type == 'byte':
- field_type_rs = 'i8'
- elif burger_type == 'short':
- field_type_rs = 'i16'
- elif burger_type == 'int':
- field_type_rs = 'i32'
- elif burger_type == 'long':
- field_type_rs = 'i64'
- elif burger_type == 'float':
- field_type_rs = 'f32'
- elif burger_type == 'double':
- field_type_rs = 'f64'
-
- elif burger_type == 'varint':
- is_var = True
- field_type_rs = 'i32'
- elif burger_type == 'varlong':
- is_var = True
- field_type_rs = 'i64'
-
- elif burger_type == 'boolean':
- field_type_rs = 'bool'
- elif burger_type == 'string':
- field_type_rs = 'String'
-
- elif burger_type == 'chatcomponent':
- field_type_rs = 'Component'
- uses.add('azalea_chat::component::Component')
- elif burger_type == 'identifier':
- field_type_rs = 'ResourceLocation'
- uses.add('azalea_core::resource_location::ResourceLocation')
- elif burger_type == 'uuid':
- field_type_rs = 'Uuid'
- uses.add('uuid::Uuid')
- elif burger_type == 'position':
- field_type_rs = 'BlockPos'
- uses.add('azalea_core::BlockPos')
- elif burger_type == 'nbtcompound':
- field_type_rs = 'azalea_nbt::Tag'
- elif burger_type == 'itemstack':
- field_type_rs = 'Slot'
- uses.add('azalea_core::Slot')
- elif burger_type == 'metadata':
- field_type_rs = 'EntityMetadata'
- uses.add('crate::mc_buf::EntityMetadata')
- elif burger_type == 'enum':
- # enums are too complicated, leave those to the user
- field_type_rs = 'todo!()'
- elif burger_type.endswith('[]'):
- field_type_rs, is_var, uses = burger_type_to_rust_type(
- burger_type[:-2])
- field_type_rs = f'Vec<{field_type_rs}>'
- else:
- print('Unknown field type:', burger_type)
- exit()
- return field_type_rs, is_var, uses
-
-
-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:
- f.write(code)
+from .utils import burger_type_to_rust_type, write_packet_file
+from ..utils import padded_hex, to_snake_case, to_camel_case
+from ..mappings import Mappings
+
+
+def make_packet_mod_rs_line(packet_id: int, packet_class_name: str):
+ return f' {padded_hex(packet_id)}: {to_snake_case(packet_class_name)}::{to_camel_case(packet_class_name)},'
def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet_direction, target_packet_state):
@@ -138,7 +76,8 @@ def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet
pub_mod_line = f'pub mod {to_snake_case(class_name)};'
if pub_mod_line not in mod_rs:
mod_rs.insert(0, pub_mod_line)
- packet_mod_rs_line = f' {hex(packet["id"])}: {to_snake_case(class_name)}::{to_camel_case(class_name)},'
+ packet_mod_rs_line = make_packet_mod_rs_line(
+ packet['id'], class_name)
in_serverbound = False
in_clientbound = False
@@ -168,3 +107,42 @@ def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet
with open(mod_rs_dir, 'w') as f:
f.write('\n'.join(mod_rs))
+
+
+def set_packet_ids(packet_ids: list, packet_class_names: list, direction: str, state: str):
+ assert len(packet_ids) == len(packet_class_names)
+
+ mod_rs_dir = f'../azalea-protocol/src/packets/{state}/mod.rs'
+ with open(mod_rs_dir, 'r') as f:
+ mod_rs = f.read().splitlines()
+ new_mod_rs = []
+
+ ignore_lines = False
+
+ for line in mod_rs:
+ if line.strip() == 'Serverbound => {':
+ if direction == 'serverbound':
+ ignore_lines = True
+ for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
+ new_mod_rs.append(
+ make_packet_mod_rs_line(packet_id, packet_class_name)
+ )
+ else:
+ ignore_lines = False
+ elif line.strip() == 'Clientbound => {':
+ if direction == 'serverbound':
+ ignore_lines = True
+ for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
+ new_mod_rs.append(
+ make_packet_mod_rs_line(packet_id, packet_class_name)
+ )
+ else:
+ ignore_lines = False
+ elif line.strip() in ('}', '},'):
+ ignore_lines = False
+
+ if not ignore_lines:
+ new_mod_rs.append(line)
+
+ with open(mod_rs_dir, 'w') as f:
+ f.write('\n'.join(new_mod_rs))
diff --git a/codegen/lib/code/utils.py b/codegen/lib/code/utils.py
new file mode 100644
index 00000000..92d1a9e9
--- /dev/null
+++ b/codegen/lib/code/utils.py
@@ -0,0 +1,73 @@
+
+import os
+
+
+def burger_type_to_rust_type(burger_type):
+ is_var = False
+ uses = set()
+
+ if burger_type == 'byte':
+ field_type_rs = 'i8'
+ elif burger_type == 'short':
+ field_type_rs = 'i16'
+ elif burger_type == 'int':
+ field_type_rs = 'i32'
+ elif burger_type == 'long':
+ field_type_rs = 'i64'
+ elif burger_type == 'float':
+ field_type_rs = 'f32'
+ elif burger_type == 'double':
+ field_type_rs = 'f64'
+
+ elif burger_type == 'varint':
+ is_var = True
+ field_type_rs = 'i32'
+ elif burger_type == 'varlong':
+ is_var = True
+ field_type_rs = 'i64'
+
+ elif burger_type == 'boolean':
+ field_type_rs = 'bool'
+ elif burger_type == 'string':
+ field_type_rs = 'String'
+
+ elif burger_type == 'chatcomponent':
+ field_type_rs = 'Component'
+ uses.add('azalea_chat::component::Component')
+ elif burger_type == 'identifier':
+ field_type_rs = 'ResourceLocation'
+ uses.add('azalea_core::resource_location::ResourceLocation')
+ elif burger_type == 'uuid':
+ field_type_rs = 'Uuid'
+ uses.add('uuid::Uuid')
+ elif burger_type == 'position':
+ field_type_rs = 'BlockPos'
+ uses.add('azalea_core::BlockPos')
+ elif burger_type == 'nbtcompound':
+ field_type_rs = 'azalea_nbt::Tag'
+ elif burger_type == 'itemstack':
+ field_type_rs = 'Slot'
+ uses.add('azalea_core::Slot')
+ elif burger_type == 'metadata':
+ field_type_rs = 'EntityMetadata'
+ uses.add('crate::mc_buf::EntityMetadata')
+ elif burger_type == 'enum':
+ # enums are too complicated, leave those to the user
+ field_type_rs = 'todo!()'
+ elif burger_type.endswith('[]'):
+ field_type_rs, is_var, uses = burger_type_to_rust_type(
+ burger_type[:-2])
+ field_type_rs = f'Vec<{field_type_rs}>'
+ else:
+ print('Unknown field type:', burger_type)
+ exit()
+ return field_type_rs, is_var, uses
+
+
+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:
+ f.write(code)
+
+
+def fmt():
+ os.system('cd .. && cargo fmt')
diff --git a/codegen/lib/code/version.py b/codegen/lib/code/version.py
new file mode 100644
index 00000000..b7e5cbcc
--- /dev/null
+++ b/codegen/lib/code/version.py
@@ -0,0 +1,31 @@
+import re
+
+README_DIR = '../README.md'
+VERSION_REGEX = r'\*Currently supported Minecraft version: `(.*)`.\*'
+
+
+def get_version_id() -> str:
+ with open(README_DIR, 'r') as f:
+ readme_text = f.read()
+
+ version_line_match = re.search(VERSION_REGEX, readme_text)
+ if version_line_match:
+ version_id = version_line_match.group(1)
+ return version_id
+ else:
+ raise Exception('Could not find version id in README.md')
+
+
+def set_version_id(version_id: str) -> None:
+ with open(README_DIR, 'r') as f:
+ readme_text = f.read()
+
+ version_line_match = re.search(VERSION_REGEX, readme_text)
+ if version_line_match:
+ readme_text = readme_text.replace(
+ version_line_match.group(1), version_id)
+ else:
+ raise Exception('Could not find version id in README.md')
+
+ with open(README_DIR, 'w') as f:
+ f.write(readme_text)
diff --git a/codegen/lib/utils.py b/codegen/lib/utils.py
index 5336d574..051ffe51 100644
--- a/codegen/lib/utils.py
+++ b/codegen/lib/utils.py
@@ -1,15 +1,15 @@
-import urllib.request
-import gzip
-import json
import re
-import io
-def to_snake_case(name):
+def to_snake_case(name: str):
s = re.sub('([A-Z])', r'_\1', name)
return s.lower().strip('_')
-def to_camel_case(name):
+def to_camel_case(name: str):
s = re.sub('_([a-z])', lambda m: m.group(1).upper(), name)
return s[0].upper() + s[1:]
+
+
+def padded_hex(n: int):
+ return f'0x{n:02x}'
diff --git a/codegen/migrate.py b/codegen/migrate.py
new file mode 100644
index 00000000..c0748400
--- /dev/null
+++ b/codegen/migrate.py
@@ -0,0 +1,52 @@
+import lib.code.utils
+import lib.code.version
+import lib.download
+import sys
+import os
+
+old_version_id = lib.code.version.get_version_id()
+old_mappings = lib.download.get_mappings_for_version(old_version_id)
+old_burger_data = lib.download.get_burger_data_for_version(old_version_id)
+old_packet_list = list(old_burger_data[0]['packets']['packet'].values())
+
+new_version_id = sys.argv[1]
+new_mappings = lib.download.get_mappings_for_version(new_version_id)
+new_burger_data = lib.download.get_burger_data_for_version(new_version_id)
+new_packet_list = list(new_burger_data[0]['packets']['packet'].values())
+
+old_packet_ids = {}
+new_packet_ids = {}
+
+for packet in old_packet_list:
+ assert packet['class'].endswith('.class')
+ packet_name = old_mappings.get_class(packet['class'][:-6])
+ old_packet_ids[packet_name] = packet['id']
+for packet in new_packet_list:
+ assert packet['class'].endswith('.class')
+ packet_name = new_mappings.get_class(packet['class'][:-6])
+ new_packet_ids[packet_name] = packet['id']
+
+# find packets that changed ids
+for packet_name in old_packet_ids:
+ if packet_name in new_packet_ids:
+ if old_packet_ids[packet_name] != new_packet_ids[packet_name]:
+ print(packet_name, 'id changed from',
+ old_packet_ids[packet_name], 'to', new_packet_ids[packet_name])
+
+print()
+
+# find removed packets
+for packet_name in old_packet_ids:
+ if packet_name not in new_packet_ids:
+ print(packet_name, 'removed')
+
+print()
+
+# find added packets
+for packet_name in new_packet_ids:
+ if packet_name not in old_packet_ids:
+ print(packet_name, 'added')
+
+lib.code.utils.fmt()
+
+print('Done!')
diff --git a/codegen/newpacket.py b/codegen/newpacket.py
index f4dc172e..b3a1c64f 100644
--- a/codegen/newpacket.py
+++ b/codegen/newpacket.py
@@ -1,4 +1,4 @@
-from lib import download, packetcodegen # type: ignore
+from lib import download, code # type: ignore
import sys
import os
@@ -9,9 +9,9 @@ burger_packets_data = burger_data[0]['packets']['packet']
packet_id, direction, state = int(sys.argv[1]), sys.argv[2], sys.argv[3]
print(
f'Generating code for packet id: {packet_id} with direction {direction} and state {state}')
-packetcodegen.generate(burger_packets_data, mappings,
- packet_id, direction, state)
+code.packetcodegen.generate(burger_packets_data, mappings,
+ packet_id, direction, state)
-os.system('cd .. && cargo fmt')
+code.fmt()
print('Done!')