diff options
Diffstat (limited to 'network')
-rw-r--r-- | network/character_server.gd | 54 | ||||
-rw-r--r-- | network/client_info.gd | 19 | ||||
-rw-r--r-- | network/login_server.gd | 20 | ||||
-rw-r--r-- | network/network.gd | 6 | ||||
-rw-r--r-- | network/server.gd | 39 |
5 files changed, 106 insertions, 32 deletions
diff --git a/network/character_server.gd b/network/character_server.gd index 60389e4..7f0ac24 100644 --- a/network/character_server.gd +++ b/network/character_server.gd @@ -2,8 +2,8 @@ class_name CharacterServer extends Server -signal logged_in(packet: CharacterServerLoginSuccessPacket) -signal logged_in_character_list(packet: CharacterServerLoginSuccessCharacterListPacket) +#signal logged_in(packet: CharacterServerLoginSuccessPacket) +#signal logged_in_character_list(packet: CharacterServerLoginSuccessCharacterListPacket) signal requested_character_list(packet: RequestCharacterListSuccessPacket) signal selected_character(packet: CharacterSelectionSuccessPacket) @@ -24,25 +24,13 @@ func login(account_id: int, login_id1: int, login_id2: int, gender: Constants.Ge peer.get_data(4) # in-between packet - var login_response_packet = await received_packet - if login_response_packet is CharacterServerLoginSuccessPacket: - logged_in.emit(login_response_packet) - - var character_list_packet = await received_packet - if character_list_packet is CharacterServerLoginSuccessCharacterListPacket: - logged_in_character_list.emit(character_list_packet) - - var character_list_size_packet = await received_packet - var block_character_packet = await received_packet - var pin_code_state_packet = await received_packet - - return { - "login": login_response_packet, - "character_list": character_list_packet, - "character_list_size": character_list_size_packet, - "block_character": block_character_packet, - "pin_code_state": pin_code_state_packet, - } + return await wait_for_all_packets([ + CharacterServerLoginSuccessPacket, + CharacterServerLoginSuccessCharacterListPacket, + CharacterListSizePacket, + BlockCharacterPacket, + PinCodeStatePacket, + ], [CharacterSelectionFailedPacket]) func request_character_list(): @@ -65,6 +53,30 @@ func select_character(slot: int): selected_character.emit(packet) +func create_character( + name: String, + slot: int, + hair_color: int, + hair_style: int, + start_job: Constants.Job, + gender: Constants.Gender +): + var create_character_packet = CreateCharacterPacket.new() + create_character_packet.name = name + create_character_packet.slot = slot + create_character_packet.hair_color = hair_color + create_character_packet.hair_style = hair_style + create_character_packet.start_job = start_job + create_character_packet.gender = gender + + send(create_character_packet) + + return await wait_for_packets([ + CreateCharacterSuccessPacket, + CharacterCreationFailedPacket, + ]) + + func get_keep_alive_timer() -> Timer: var character_server_keep_alive_timer = Timer.new() character_server_keep_alive_timer.name = "CharacterServerKeepAliveTimer" diff --git a/network/client_info.gd b/network/client_info.gd new file mode 100644 index 0000000..45327e8 --- /dev/null +++ b/network/client_info.gd @@ -0,0 +1,19 @@ +class_name ClientInfo + + +var file: String + + +func _init(file_path: String) -> void: + file = FileAccess.get_file_as_string(file_path) + + + +func get_address() -> String: + var regex := RegEx.create_from_string("<address>(.*)<\\/address>") + return regex.search(file).get_string(1) + + +func get_port() -> int: + var regex := RegEx.create_from_string("<port>(.*)<\\/port>") + return regex.search(file).get_string(1) as int diff --git a/network/login_server.gd b/network/login_server.gd index 902c477..b2e6e1b 100644 --- a/network/login_server.gd +++ b/network/login_server.gd @@ -2,8 +2,8 @@ class_name LoginServer extends Server -signal logged_in(packet: LoginServerLoginSuccessPacket) -signal login_failed(packet: LoginFailedPacket) +#signal logged_in(packet: LoginServerLoginSuccessPacket) +#signal login_failed(packet: LoginFailedPacket) @warning_ignore("shadowed_variable_base_class") @@ -11,20 +11,18 @@ func _init(host: String, port: int = 6900) -> void: super._init(host, port) -func login(username: String, password: String): +func login(username: String, password: String) -> Packet: var login_server_login_packet = LoginServerLoginPacket.new() login_server_login_packet.username = username login_server_login_packet.password = password send(login_server_login_packet) - var packet = await received_packet - if packet is LoginServerLoginSuccessPacket: - logged_in.emit(packet) - elif packet is LoginFailedPacket: - login_failed.emit(packet) - - return packet + return await wait_for_packets([ + LoginServerLoginSuccessPacket, + LoginFailedPacket, + LoginFailedPacket2, + ]) func get_keep_alive_timer() -> Timer: @@ -32,7 +30,7 @@ func get_keep_alive_timer() -> Timer: login_server_keep_alive_timer.name = "LoginServerKeepAliveTimer" login_server_keep_alive_timer.autostart = true login_server_keep_alive_timer.one_shot = false - login_server_keep_alive_timer.wait_time = 30.0 # 60.0 + login_server_keep_alive_timer.wait_time = 20.0 # 30.0 # 60.0 login_server_keep_alive_timer.timeout.connect(func(): var login_server_keep_alive_packet := LoginServerKeepAlivePacket.new() diff --git a/network/network.gd b/network/network.gd index 63de38a..736f58b 100644 --- a/network/network.gd +++ b/network/network.gd @@ -1,11 +1,17 @@ extends Node +static var client_info: ClientInfo static var login_server: LoginServer static var character_server: CharacterServer static var map_server: MapServer +func _ready() -> void: + if FileAccess.file_exists("res://client_data/clientinfo.xml"): + client_info = ClientInfo.new("res://client_data/clientinfo.xml") + + func _process(_delta: float) -> void: if login_server: login_server.listen() diff --git a/network/server.gd b/network/server.gd index 56e9861..b8f8319 100644 --- a/network/server.gd +++ b/network/server.gd @@ -84,3 +84,42 @@ func send(packet: Packet) -> Error: func send_raw(bytes: PackedByteArray) -> Error: return peer.put_data(bytes) + + +func wait_for_packets(packet_types: Array) -> Packet: + var packet: Packet + while true: + packet = await received_packet + for type in packet_types: + if is_instance_of(packet, type): + return packet + + # code path return satisfaction + return packet + + +func wait_for_all_packets(packet_types: Array, error_packet_types: Array = []) -> Dictionary[int, Packet]: + var packets: Dictionary[int, Packet] = {} + var packet: Packet + var has_error := false + while true: + packet = await received_packet + + # check packets + for type in packet_types: + if is_instance_of(packet, type): + packets.set(type.get("HEADER"), packet) + break + + # check for errors + for type in error_packet_types: + if is_instance_of(packet, type): + packets.set(type.get("HEADER"), packet) + has_error = true + break + + # finish if all packages received or one package errors + if packets.size() == packet_types.size() or has_error: + break + + return packets |