def from_bytes(data): movement = Movement() data_io = io.BytesIO(data) header_data = read_struct(data_io, Movement.HEADER_BIN) movement.flags, movement.time = header_data movement.position = Position.from_io(data_io) if movement.flags & MovementFlags.ON_TRANSPORT.value: transport_data = read_struct(data_io, Movement.TRANSPORT_HEADER_BIN) movement.transport_guid = transport_data[0] movement.transport_position = Position.from_io(data_io) if movement.flags & MovementFlags.IS_SWIMMING.value: swimming_data = read_struct(data_io, Movement.SWIMMING_BIN) movement.swim_pitch = swimming_data[0] if movement.flags & MovementFlags.IS_FALLING.value: movement.jump_data = JumpData.from_io(data_io) if movement.flags & MovementFlags.SPLINE_ELEVATION.value: elevation_data = read_struct(data_io, Movement.SPLINE_ELEVATION_BIN) movement.spline_elevation_unk = elevation_data[0] return movement
def __init__(self): self.flags = 0 self.time = 0 self.position = Position() self.transport_guid = 0 self.transport_position = Position() self.swim_pitch = 0.0 self.jump_data = JumpData() self.spline_elevation_unk = 0.0
def __init__(self): self.lock = threading.RLock() self.name = "Unnamed object" self.map_id = 0 self.zone_id = 0 self.position = Position() self.fields = {}
class Movement(object): # - uint32 flags # - int32 unk # - float[4] position + ori # if flags & 0x02000000 (on transport) # - uint64 guid # - float[4] tr_position + tr_ori # if flags & 0x00200000 (is swimming) # - uint32 swim_pitch # if flags & 0x00002000 (is jumping/falling) # - uint32 time # - float velocity # - float sin # - float cos # - float xy_speed # if flags & 0x04000000 (is on spline elevation) # - float unk HEADER_BIN = Struct("<2I") TRANSPORT_HEADER_BIN = Struct("<Q") SWIMMING_BIN = Struct("<f") SPLINE_ELEVATION_BIN = Struct("<f") def __init__(self): self.flags = 0 self.time = 0 self.position = Position() self.transport_guid = 0 self.transport_position = Position() self.swim_pitch = 0.0 self.jump_data = JumpData() self.spline_elevation_unk = 0.0 @staticmethod def from_bytes(data): movement = Movement() data_io = io.BytesIO(data) header_data = read_struct(data_io, Movement.HEADER_BIN) movement.flags, movement.time = header_data movement.position = Position.from_io(data_io) if movement.flags & MovementFlags.ON_TRANSPORT.value: transport_data = read_struct(data_io, Movement.TRANSPORT_HEADER_BIN) movement.transport_guid = transport_data[0] movement.transport_position = Position.from_io(data_io) if movement.flags & MovementFlags.IS_SWIMMING.value: swimming_data = read_struct(data_io, Movement.SWIMMING_BIN) movement.swim_pitch = swimming_data[0] if movement.flags & MovementFlags.IS_FALLING.value: movement.jump_data = JumpData.from_io(data_io) if movement.flags & MovementFlags.SPLINE_ELEVATION.value: elevation_data = read_struct(data_io, Movement.SPLINE_ELEVATION_BIN) movement.spline_elevation_unk = elevation_data[0] return movement def to_bytes(self): data = b"" data += self.HEADER_BIN.pack(self.flags, self.time) data += self.position.to_bytes() if self.flags & MovementFlags.ON_TRANSPORT.value: data += self.TRANSPORT_HEADER_BIN.pack(self.transport_guid) data += self.transport_position.to_bytes() if self.flags & MovementFlags.IS_SWIMMING.value: data += self.SWIMMING_BIN.pack(self.swim_pitch) if self.flags & MovementFlags.IS_FALLING.value: data += self.jump_data.to_bytes() if self.flags & MovementFlags.SPLINE_ELEVATION.value: data += self.SPLINE_ELEVATION_BIN.pack(self.spline_elevation_unk) return data