From d560f77811d4fc6f29bf477356a6d2e58dda0be1 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Sat, 30 Nov 2024 12:46:08 +0100 Subject: next commit --- packets/block_character_packet.gd | 28 ++++++++++ packets/character_information.gd | 11 ++-- packets/character_list_size_packet.gd | 25 +++++++++ packets/character_selection_success_packet.gd | 2 +- packets/character_server_information.gd | 11 ++-- packets/character_server_login_packet.gd | 2 +- ...r_server_login_success_character_list_packet.gd | 42 ++++++++++++++ packets/character_server_login_success_packet.gd | 16 +++--- packets/login_server_login_packet.gd | 2 +- packets/login_server_login_success_packet.gd | 2 +- packets/map_server_login_packet.gd | 2 +- packets/map_server_login_success_packet.gd | 13 ++++- packets/packet.gd | 10 ++-- packets/packet_chunk.gd | 9 ++- packets/pin_code_state_packet.gd | 36 ++++++++++++ packets/quest.gd | 23 +++++--- packets/quest_details.gd | 65 ---------------------- packets/quest_list_packet.gd | 3 +- packets/quest_objective_details.gd | 65 ++++++++++++++++++++++ packets/request_character_list_packet.gd | 2 +- packets/request_character_list_success_packet.gd | 2 +- packets/select_character_packet.gd | 2 +- 22 files changed, 261 insertions(+), 112 deletions(-) create mode 100644 packets/block_character_packet.gd create mode 100644 packets/character_list_size_packet.gd create mode 100644 packets/character_server_login_success_character_list_packet.gd create mode 100644 packets/pin_code_state_packet.gd delete mode 100644 packets/quest_details.gd create mode 100644 packets/quest_objective_details.gd (limited to 'packets') diff --git a/packets/block_character_packet.gd b/packets/block_character_packet.gd new file mode 100644 index 0000000..96e38d8 --- /dev/null +++ b/packets/block_character_packet.gd @@ -0,0 +1,28 @@ +# TODO: check chclif_block_character in rAthena +class_name BlockCharacterPacket +extends Packet + + +const HEADER := 0x020d +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +## Byte Type: u32 +## Byte Length: 4 +var page_to_load: int + +## Byte Type: u16 +## Byte Length: 2 +var character_slot_count: int + + +static func from_bytes(bytes: PackedByteArray): + var packet = BlockCharacterPacket.new() + + packet.packet_length = bytes.decode_u16(2) + + return packet diff --git a/packets/character_information.gd b/packets/character_information.gd index 20e40cd..a2ac0ab 100644 --- a/packets/character_information.gd +++ b/packets/character_information.gd @@ -2,6 +2,9 @@ class_name CharacterInformation extends PacketChunk +const BYTE_LENGTH := 175 + + ## Byte Type: u32 ## Byte Length: 4 var character_id: int @@ -179,10 +182,6 @@ var character_name_change: int var gender: Constants.Gender -func _init() -> void: - byte_length = 175 - - static func from_bytes(bytes: PackedByteArray): var info = CharacterInformation.new() @@ -234,8 +233,8 @@ static func from_bytes(bytes: PackedByteArray): return info -static func array_from_bytes(bytes: PackedByteArray) -> Array: - var array = [] +static func array_from_bytes(bytes: PackedByteArray) -> Array[CharacterInformation]: + var array: Array[CharacterInformation] = [] var offset = 0 while offset < bytes.size(): diff --git a/packets/character_list_size_packet.gd b/packets/character_list_size_packet.gd new file mode 100644 index 0000000..9491e1d --- /dev/null +++ b/packets/character_list_size_packet.gd @@ -0,0 +1,25 @@ +# TODO: really correct? chclif_charlist_notify in rAthena +class_name CharacterListSizePacket +extends Packet + + +const HEADER := 0x09a0 +const BYTE_LENGTH := 6 + + +## Byte Type: u32 +## Byte Length: 4 +var page_to_load: int + +## Byte Type: u16 +## Byte Length: 2 +var character_slot_count: int + + +static func from_bytes(bytes: PackedByteArray): + var packet = CharacterListSizePacket.new() + + packet.page_to_load = bytes.decode_u32(2) + packet.character_slot_count = bytes.decode_u16(4) + + return packet diff --git a/packets/character_selection_success_packet.gd b/packets/character_selection_success_packet.gd index b43b4b5..b188d42 100644 --- a/packets/character_selection_success_packet.gd +++ b/packets/character_selection_success_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x0ac5 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 156 ## Byte Type: u32 diff --git a/packets/character_server_information.gd b/packets/character_server_information.gd index f67b065..19f22c1 100644 --- a/packets/character_server_information.gd +++ b/packets/character_server_information.gd @@ -2,6 +2,9 @@ class_name CharacterServerInformation extends PacketChunk +const BYTE_LENGTH := 160 + + ## Byte Type: u32 ## Byte Length: 4 var server_ip: PackedByteArray @@ -31,10 +34,6 @@ var display_new: int var unknown: PackedByteArray -func _init() -> void: - byte_length = 160 - - func get_server_ip(): return "%s.%s.%s.%s" % [ server_ip.decode_u8(0), @@ -58,8 +57,8 @@ static func from_bytes(bytes: PackedByteArray): return info -static func array_from_bytes(bytes: PackedByteArray) -> Array: - var array = [] +static func array_from_bytes(bytes: PackedByteArray) -> Array[CharacterServerInformation]: + var array: Array[CharacterServerInformation] = [] var offset = 0 while offset < bytes.size(): diff --git a/packets/character_server_login_packet.gd b/packets/character_server_login_packet.gd index a2d4f7d..fb8a7ea 100644 --- a/packets/character_server_login_packet.gd +++ b/packets/character_server_login_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x0065 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 17 ## Byte Type: u32 diff --git a/packets/character_server_login_success_character_list_packet.gd b/packets/character_server_login_success_character_list_packet.gd new file mode 100644 index 0000000..e3a649b --- /dev/null +++ b/packets/character_server_login_success_character_list_packet.gd @@ -0,0 +1,42 @@ +class_name CharacterServerLoginSuccessCharacterListPacket +extends Packet + + +const HEADER := 0x006b +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +## Byte Type: u8 +## Byte Length: 1 +var maximum_slot_count: int + +## Byte Type: u8 +## Byte Length: 1 +var available_slot_count: int + +## Byte Type: u8 +## Byte Length: 1 +var vip_slot_count: int + +## Byte Type: u8 +## Byte Length: 20 +var unknown: PackedByteArray + +var character_information: Array[CharacterInformation] + + +static func from_bytes(bytes: PackedByteArray): + var packet = CharacterServerLoginSuccessCharacterListPacket.new() + + packet.packet_length = bytes.decode_u16(2) + packet.maximum_slot_count = bytes.decode_u8(4) + packet.maximum_slot_count = bytes.decode_u8(5) + packet.maximum_slot_count = bytes.decode_u8(6) + packet.unknown = bytes.slice(7, 7 + 20) + packet.character_information = CharacterInformation.array_from_bytes(bytes.slice(27)) + + return packet diff --git a/packets/character_server_login_success_packet.gd b/packets/character_server_login_success_packet.gd index bfe6c45..f3da048 100644 --- a/packets/character_server_login_success_packet.gd +++ b/packets/character_server_login_success_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x082d -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 29 ## Byte Length: 2 @@ -31,12 +31,12 @@ var unused: PackedByteArray static func from_bytes(bytes: PackedByteArray): var packet = CharacterServerLoginSuccessPacket.new() - packet.unknown = bytes.decode_u16(6) - packet.normal_slot_count = bytes.decode_u8(8) - packet.vip_slot_count = bytes.decode_u8(9) - packet.billing_slot_count = bytes.decode_u8(10) - packet.producible_slot_count = bytes.decode_u8(11) - packet.valid_slot = bytes.decode_u8(12) - packet.unused = bytes.slice(13, 13 + 20) + packet.unknown = bytes.decode_u16(2) + packet.normal_slot_count = bytes.decode_u8(4) + packet.vip_slot_count = bytes.decode_u8(5) + packet.billing_slot_count = bytes.decode_u8(6) + packet.producible_slot_count = bytes.decode_u8(7) + packet.valid_slot = bytes.decode_u8(8) + packet.unused = bytes.slice(9, 9 + 20) return packet diff --git a/packets/login_server_login_packet.gd b/packets/login_server_login_packet.gd index f7217fe..0fa117d 100644 --- a/packets/login_server_login_packet.gd +++ b/packets/login_server_login_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x064 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 55 ## Byte Type: u32 diff --git a/packets/login_server_login_success_packet.gd b/packets/login_server_login_success_packet.gd index 1f95bae..ce6a058 100644 --- a/packets/login_server_login_success_packet.gd +++ b/packets/login_server_login_success_packet.gd @@ -40,7 +40,7 @@ var gender: Constants.Gender ## Byte Length: 17 var auth_token: String -var character_server_information: Array +var character_server_information: Array[CharacterServerInformation] static func from_bytes(bytes: PackedByteArray): diff --git a/packets/map_server_login_packet.gd b/packets/map_server_login_packet.gd index 726cdff..2138d11 100644 --- a/packets/map_server_login_packet.gd +++ b/packets/map_server_login_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x0436 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 23 ## Byte Type: u32 diff --git a/packets/map_server_login_success_packet.gd b/packets/map_server_login_success_packet.gd index 1791a85..a6cbdae 100644 --- a/packets/map_server_login_success_packet.gd +++ b/packets/map_server_login_success_packet.gd @@ -1,9 +1,12 @@ +## rAthena References: +## - PACKET_ZC_ACCEPT_ENTER +## - clif_authok class_name MapServerLoginSuccessPacket extends Packet const HEADER := 0x02eb -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 14 ## Byte Type: u32 @@ -23,6 +26,11 @@ var ignored: PackedByteArray ## Byte Length: 2 var font: int +## Byte Type: u8 +## Byte Length: 1 +## Depends on packet version +var gender: Constants.Gender + func get_position(): return Vector2( @@ -37,6 +45,7 @@ static func from_bytes(bytes: PackedByteArray): packet.client_tick = bytes.decode_u32(2) packet.position = bytes.slice(6, 6 + 3) packet.ignored = bytes.slice(9, 9 + 2) - packet.font = bytes.decode_u32(11) + packet.font = bytes.decode_u16(11) + packet.gender = bytes.decode_u8(13) return packet diff --git a/packets/packet.gd b/packets/packet.gd index 33db0b1..b1e72ed 100644 --- a/packets/packet.gd +++ b/packets/packet.gd @@ -1,14 +1,16 @@ class_name Packet -#static var header: int = 0 +# set to 0 if variable length +#const BYTE_LENGTH := 0 -var byte_length: int = 0 +var byte_length: int = 0: + get = get_byte_length -## Override if packet has variable length +## Override if packet has variable length. func get_byte_length() -> int: - return byte_length + return self.BYTE_LENGTH ## Get header to prepend to the packet. [br] diff --git a/packets/packet_chunk.gd b/packets/packet_chunk.gd index 2bd8bc6..52981e6 100644 --- a/packets/packet_chunk.gd +++ b/packets/packet_chunk.gd @@ -1,10 +1,13 @@ class_name PacketChunk -var byte_length: int: +# set to 0 if variable length +#const BYTE_LENGTH := 0 + +var byte_length: int = 0: get = get_byte_length -## to be overriden +## Override if packet has variable length. func get_byte_length() -> int: - return byte_length + return self.BYTE_LENGTH diff --git a/packets/pin_code_state_packet.gd b/packets/pin_code_state_packet.gd new file mode 100644 index 0000000..ab75618 --- /dev/null +++ b/packets/pin_code_state_packet.gd @@ -0,0 +1,36 @@ +## rAthena References: +## - chclif_pincode_sendstate +class_name PinCodeStatePacket +extends Packet + + +const HEADER := 0x08b9 +const BYTE_LENGTH := 12 + + +## Byte Type: u32 +## Byte Length: 4 +var pin_code_seed: int + +## Byte Type: u32 +## Byte Length: 4 +var account_id: int + +## Byte Type: u8 +## Byte Length: 1 +var pin_code_state: Constants.PinCodeState + +## Byte Type: u8 +## Byte Length: 1 +var unused: PackedByteArray + + +static func from_bytes(bytes: PackedByteArray): + var packet = PinCodeStatePacket.new() + + packet.pin_code_seed = bytes.decode_u32(2) + packet.account_id = bytes.decode_u32(6) + packet.pin_code_state = bytes.decode_u8(10) + packet.unused = bytes.slice(11) + + return packet diff --git a/packets/quest.gd b/packets/quest.gd index 347f5d1..6b2473e 100644 --- a/packets/quest.gd +++ b/packets/quest.gd @@ -2,6 +2,9 @@ class_name Quest extends PacketChunk +const BYTE_LENGTH := 0 + + ## Byte Type: u32 ## Byte Length: 4 var quest_id: int @@ -26,24 +29,26 @@ var objective_details: Array func get_byte_length(): - return "??" + return 15 + objective_count * QuestObjectiveDetails.BYTE_LENGTH static func from_bytes(bytes: PackedByteArray): var quest = Quest.new() - quest.quest_id = bytes.slice(0, 4) - quest.active = bytes.decode_u16(4) - quest.remaining_time = bytes.slice(6, 6 + 20).get_string_from_utf8() - quest.expire_time = bytes.decode_u16(26) - quest.objective_count = bytes.decode_u16(28) - quest.objective_details = bytes.slice(32) + quest.quest_id = bytes.decode_u32(0) + quest.active = bytes.decode_u8(4) + quest.remaining_time = bytes.decode_u32(5) + quest.expire_time = bytes.decode_u32(9) + quest.objective_count = bytes.decode_u16(13) + quest.objective_details = QuestObjectiveDetails.array_from_bytes( + bytes.slice(15, 15 + quest.byte_length) + ) return quest -static func array_from_bytes(bytes: PackedByteArray) -> Array: - var array = [] +static func array_from_bytes(bytes: PackedByteArray) -> Array[Quest]: + var array: Array[Quest] = [] var offset = 0 while offset < bytes.size(): diff --git a/packets/quest_details.gd b/packets/quest_details.gd deleted file mode 100644 index eaf8d2e..0000000 --- a/packets/quest_details.gd +++ /dev/null @@ -1,65 +0,0 @@ -class_name QuestDetails -extends PacketChunk - - -## Byte Type: u32 -## Byte Length: 4 -var hunt_identification: int - -## Byte Type: u32 -## Byte Length: 4 -var objective_type: int - -## Byte Type: u32 -## Byte Length: 4 -var mob_id: int - -## Byte Type: u16 -## Byte Length: 2 -var minimum_level: int - -## Byte Type: u16 -## Byte Length: 2 -var maximum_level: int - -## Byte Type: u16 -## Byte Length: 2 -var kill_count: int - -## Byte Type: u16 -## Byte Length: 2 -var total_count: int - -## Byte Type: u8 -## Byte Length: 24 -var mob_name: String - - -func get_byte_length(): - return 44 - - -static func from_bytes(bytes: PackedByteArray): - var details = QuestDetails.new() - - details.server_ip = bytes.slice(0, 4) - details.server_port = bytes.decode_u16(4) - details.server_name = bytes.slice(6, 6 + 20).get_string_from_utf8() - details.user_count = bytes.decode_u16(26) - details.server_type = bytes.decode_u16(28) - details.display_new = bytes.decode_u16(30) - details.unknown = bytes.slice(32) - - return details - - -static func array_from_bytes(bytes: PackedByteArray) -> Array: - var array = [] - - var offset = 0 - while offset < bytes.size(): - var chunk = from_bytes(bytes.slice(offset)) - array.append(chunk) - offset += chunk.byte_length - - return array diff --git a/packets/quest_list_packet.gd b/packets/quest_list_packet.gd index bf78f08..fb148c3 100644 --- a/packets/quest_list_packet.gd +++ b/packets/quest_list_packet.gd @@ -14,7 +14,7 @@ var packet_length: int ## Byte Length: 4 var quest_count: int -var quests: Array +var quests: Array[Quest] static func from_bytes(bytes: PackedByteArray): @@ -22,5 +22,6 @@ static func from_bytes(bytes: PackedByteArray): packet.packet_length = bytes.decode_u16(2) packet.quest_count = bytes.decode_u32(4) + packet.quests = Quest.array_from_bytes(bytes.slice(8)) return packet diff --git a/packets/quest_objective_details.gd b/packets/quest_objective_details.gd new file mode 100644 index 0000000..4fe3a8e --- /dev/null +++ b/packets/quest_objective_details.gd @@ -0,0 +1,65 @@ +class_name QuestObjectiveDetails +extends PacketChunk + + +const BYTE_LENGTH := 44 + + +## Byte Type: u32 +## Byte Length: 4 +var hunt_identification: int + +## Byte Type: u32 +## Byte Length: 4 +var objective_type: int + +## Byte Type: u32 +## Byte Length: 4 +var mob_id: int + +## Byte Type: u16 +## Byte Length: 2 +var minimum_level: int + +## Byte Type: u16 +## Byte Length: 2 +var maximum_level: int + +## Byte Type: u16 +## Byte Length: 2 +var kill_count: int + +## Byte Type: u16 +## Byte Length: 2 +var total_count: int + +## Byte Type: u8 +## Byte Length: 24 +var mob_name: String + + +static func from_bytes(bytes: PackedByteArray): + var details = QuestObjectiveDetails.new() + + details.hunt_identification = bytes.decode_u32(0) + details.objective_type = bytes.decode_u32(4) + details.mob_id = bytes.decode_u32(8) + details.minimum_level = bytes.decode_u16(12) + details.maximum_level = bytes.decode_u16(14) + details.kill_count = bytes.decode_u16(16) + details.total_count = bytes.decode_u16(18) + details.mob_name = bytes.slice(20, 20 + 24).get_string_from_utf8() + + return details + + +static func array_from_bytes(bytes: PackedByteArray) -> Array[QuestObjectiveDetails]: + var array: Array[QuestObjectiveDetails] = [] + + var offset = 0 + while offset < bytes.size(): + var chunk = from_bytes(bytes.slice(offset)) + array.append(chunk) + offset += chunk.byte_length + + return array diff --git a/packets/request_character_list_packet.gd b/packets/request_character_list_packet.gd index e2c761d..2f43a05 100644 --- a/packets/request_character_list_packet.gd +++ b/packets/request_character_list_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x09a1 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 2 func to_bytes(): diff --git a/packets/request_character_list_success_packet.gd b/packets/request_character_list_success_packet.gd index f85decc..342bccb 100644 --- a/packets/request_character_list_success_packet.gd +++ b/packets/request_character_list_success_packet.gd @@ -10,7 +10,7 @@ const BYTE_LENGTH := 0 ## Byte Length: 2 var packet_length: int -var character_information: Array +var character_information: Array[CharacterInformation] static func from_bytes(bytes: PackedByteArray): diff --git a/packets/select_character_packet.gd b/packets/select_character_packet.gd index 692183f..56ba1fa 100644 --- a/packets/select_character_packet.gd +++ b/packets/select_character_packet.gd @@ -3,7 +3,7 @@ extends Packet const HEADER := 0x0066 -const BYTE_LENGTH := 0 +const BYTE_LENGTH := 3 ## Byte Type: u8 -- cgit v1.2.3