summaryrefslogtreecommitdiff
path: root/network
diff options
context:
space:
mode:
Diffstat (limited to 'network')
-rw-r--r--network/character_server.gd54
-rw-r--r--network/client_info.gd19
-rw-r--r--network/login_server.gd20
-rw-r--r--network/network.gd6
-rw-r--r--network/server.gd39
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