diff --git a/src/DedicatedServer.cpp b/src/DedicatedServer.cpp index 2c3b11e..118f833 100644 --- a/src/DedicatedServer.cpp +++ b/src/DedicatedServer.cpp @@ -142,6 +142,8 @@ namespace Feather client.SendMessage(spawnPos); + using RelativeFlags = Play::ClientboundPlayerPositionAndLook::RelativeFlags; + Play::ClientboundPlayerPositionAndLook playerPos = { .x = 0, @@ -149,7 +151,7 @@ namespace Feather .z = 0, .xRot = 0, .yRot = 0, - .flags = 0, + .flags = (RelativeFlags)0, .id = 0, }; diff --git a/src/protocol/generate_protocol.py b/src/protocol/generate_protocol.py index afc4032..239bb2e 100644 --- a/src/protocol/generate_protocol.py +++ b/src/protocol/generate_protocol.py @@ -64,12 +64,12 @@ def get_type_size(type): print(type) assert False -def print_states(states): - add_text('enum class ProtocolState : int32_t') +def print_enum(name, dict, primitive = 'int32_t'): + add_text('enum class {} : {}', name, primitive) add_text('{{') indent() - for state, value in states.items(): - add_text('{} = {},', state, value) + for key, value in dict.items(): + add_text('{} = {},', key, value) unindent() add_text('}};') @@ -87,7 +87,7 @@ def get_rw_func(primitiveType, aliasedType, read): else: return '{}<{}>'.format(prefix, primitiveType) -def print_messages(list, aliases, primitives): +def print_messages(list, global_aliases, primitives): global text for state, direction_list in list.items(): add_text('namespace {}', state.capitalize()) @@ -96,6 +96,15 @@ def print_messages(list, aliases, primitives): for direction, messages in direction_list.items(): serverbound = direction == 'serverbound' for message_name, message in messages.items(): + + # global and local aliases + aliases = global_aliases.copy() + + # add any local aliases + if 'aliases' in message: + for alias in message['aliases']: + aliases[alias] = message['aliases'][alias] + global varint_max_size size = varint_max_size # Packet Length size += varint_max_size # Packet Id @@ -111,6 +120,15 @@ def print_messages(list, aliases, primitives): add_text('static constexpr ProtocolState PacketState = ProtocolState::{};', state.capitalize()) add_text('static constexpr size_t MaxSize = {};', size) newline() + if 'enums' in message: + for enum in message['enums']: + if enum in aliases: + # lookup enum primitive type from aliases + prim = resolve_type(primitives, aliases[enum]) + print_enum(enum, message['enums'][enum], prim) + else: + print_enum(enum, message['enums'][enum]) + newline() if serverbound: add_text('{}(PacketReader& reader)', struct_name) add_text('{{') @@ -198,7 +216,7 @@ def print_protocol(): with open(sys.argv[1]) as message_file: message_scheme = hjson.load(message_file) - print_states(message_scheme['states']) + print_enum('ProtocolState', message_scheme['states']) newline() diff --git a/src/protocol/protocol.hjson b/src/protocol/protocol.hjson index 3117b3e..c5cfeb9 100644 --- a/src/protocol/protocol.hjson +++ b/src/protocol/protocol.hjson @@ -159,6 +159,18 @@ PlayerPositionAndLook: { id: 0x36 + enums: { + RelativeFlags: { + X: 1, + Y: 2, + Z: 4, + Y_ROT: 8, + X_ROT: 16, + } + } + aliases: { + RelativeFlags: byte + } vars: { x: double y: double @@ -166,7 +178,7 @@ // xRot is yaw, yRot is pitch xRot: float yRot: float - flags: byte + flags: RelativeFlags id: varint } }