Add enums and local aliases supprot to protocol

This commit is contained in:
DankParrot 2020-08-03 19:14:26 -07:00
parent 1ead4a1590
commit 54f346b096
3 changed files with 40 additions and 8 deletions

View File

@ -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,
};

View File

@ -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()

View File

@ -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
}
}