From 76d1ec723b6f6f68a512f27607749f3ff885f385 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 27 Jun 2025 16:51:18 +0200 Subject: managers + various changes --- Game/Client.gd | 6 -- Game/Lobby/Server/index.php | 186 +++++++++++++++++----------------- Game/Network.gd | 28 +---- Game/Selection/selection_rectangle.gd | 2 +- Game/States/Build/StateBuild.gd | 4 +- Game/States/Default/StateDefault.gd | 5 +- 6 files changed, 105 insertions(+), 126 deletions(-) (limited to 'Game') diff --git a/Game/Client.gd b/Game/Client.gd index 0af4e9d..4eb48bb 100644 --- a/Game/Client.gd +++ b/Game/Client.gd @@ -18,8 +18,6 @@ var state: State : var current_stage: Stage -var selection: SelectionManager - var player: Player: get(): return Network.get_player(multiplayer.get_unique_id()) @@ -33,10 +31,6 @@ func _notification(what: int) -> void: func initialize_stage(stage: Stage): current_stage = stage - - if not selection: - selection = preload("res://Game/Selection/SelectionManager.tscn").instantiate() - add_child(selection) func ready_stage(_stage: Stage): pass diff --git a/Game/Lobby/Server/index.php b/Game/Lobby/Server/index.php index 1086d24..7d12195 100644 --- a/Game/Lobby/Server/index.php +++ b/Game/Lobby/Server/index.php @@ -19,18 +19,18 @@ $db = new PDO('sqlite:./' . $dbname, options: [ if (php_sapi_name() == 'cli') { if ($argv[$argc - 1] == 'init-db') { - $db->query(<<execute(); + $db->query(<<execute(); } return; @@ -42,7 +42,7 @@ $method = $_SERVER['REQUEST_METHOD']; if ($method == 'POST') { $inputPost = json_decode(file_get_contents('php://input'), true); if ($inputPost) { - $_POST = $inputPost + $_POST; + $_POST = $inputPost + $_POST; } } @@ -50,73 +50,73 @@ $response = []; if ($method == 'POST' && $url['path'] == '/host') { $ip = filter_var( - $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'], - FILTER_VALIDATE_IP + $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'], + FILTER_VALIDATE_IP ); if ($ip === false) { - $response = [ - 'success' => false, - 'error' => 'Invalid IP.', - ]; + $response = [ + 'success' => false, + 'error' => 'Invalid IP.', + ]; } else { - $port = intval($_POST['port']); - $name = $_POST['name']; - $id = md5($name . time()); - $secret = md5($id . random_bytes($port)); - - $success = $db->prepare(<<execute([ - 'id' => $id, - 'ip' => $ip, - 'port' => $port, - 'timestamp' => time(), - 'name' => $name, - 'secret' => $secret, - ]); - - if ($success) { - $response = [ - 'success' => $success, - 'data' => [ - 'id' => $id, - 'secret' => $secret, - ], - ]; - } else { - $response = [ - 'success' => $success, - 'error' => $db->errorInfo(), - ]; - } + $port = intval($_POST['port']); + $name = $_POST['name']; + $id = md5($name . time()); + $secret = md5($id . random_bytes($port)); + + $success = $db->prepare(<<execute([ + 'id' => $id, + 'ip' => $ip, + 'port' => $port, + 'timestamp' => time(), + 'name' => $name, + 'secret' => $secret, + ]); + + if ($success) { + $response = [ + 'success' => $success, + 'data' => [ + 'id' => $id, + 'secret' => $secret, + ], + ]; + } else { + $response = [ + 'success' => $success, + 'error' => $db->errorInfo(), + ]; + } } } else if ($method == 'GET' && $url['path'] == '/get-list') { $statement = $db->prepare(<< :comparison_time - SQL); + select id, name from games + where ping_time > :comparison_time + SQL); $statement->execute([ - 'comparison_time' => time() - $timeoutMax, + 'comparison_time' => time() - $timeoutMax, ]); $results = $statement->fetchAll(); $list = []; foreach ($results as $row) { - $list[] = [ - 'id' => $row['id'], - 'name' => $row['name'], - ]; + $list[] = [ + 'id' => $row['id'], + 'name' => $row['name'], + ]; } $response = [ - 'success' => true, - 'data' => $list, + 'success' => true, + 'data' => $list, ]; } @@ -124,30 +124,30 @@ else if ($method == 'GET' && $url['path'] == '/join') { $id = $_GET['id']; $statement = $db->prepare(<<execute([ - 'id' => $id, + 'id' => $id, ]); $result = $statement->fetch(); if ($result === false) { - $response = [ - 'success' => false, - 'error' => 'Game not found.' - ]; - http_response_code(404); + $response = [ + 'success' => false, + 'error' => 'Game not found.' + ]; + http_response_code(404); } else { - $response = [ - 'success' => true, - 'data' => [ - 'ip' => $result['ip'], - 'port' => $result['port'], - ], - ]; + $response = [ + 'success' => true, + 'data' => [ + 'ip' => $result['ip'], + 'port' => $result['port'], + ], + ]; } } @@ -156,15 +156,15 @@ else if ($method == 'POST' && $url['path'] == '/close') { $secret = $_POST['secret']; $success = $db->prepare(<<execute([ - 'id' => $id, - 'secret' => $secret, - ]); + delete from games where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } @@ -173,23 +173,23 @@ else if ($method == 'POST' && $url['path'] == '/keep-alive') { $secret = $_POST['secret']; $success = $db->prepare(<<execute([ - 'id' => $id, - 'secret' => $secret, - 'ping_time' => time(), - ]); + update games set ping_time = :ping_time where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + 'ping_time' => time(), + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } else { $response = [ - 'success' => false, - 'error' => 'Route not found.' + 'success' => false, + 'error' => 'Route not found.' ]; http_response_code(404); } diff --git a/Game/Network.gd b/Game/Network.gd index 4413548..345b305 100644 --- a/Game/Network.gd +++ b/Game/Network.gd @@ -62,14 +62,6 @@ func _on_peer_connected(id: int): print(multiplayer.get_unique_id(), ": peer connected: ", id) add_to_players.rpc_id(id, inst_to_dict(Client.player)) - # TODO: check why bug and adds more players than intended - #ask_game_running.rpc_id(id) - #is_game_running.connect(func(is_running: bool): - #if not is_running: - #add_to_players.rpc_id(id, inst_to_dict(Client.player)) - #elif is_running: - #get_tree().change_scene_to_file("res://UI/Start.tscn") - #) func _on_peer_disconnected(id: int): print(multiplayer.get_unique_id(), ": peer disconnected: ", id) @@ -113,18 +105,6 @@ func remove_player(id: int): players_changed.emit() -signal is_game_running(is_running: bool) - -@rpc("any_peer") -func ask_game_running(): - var is_running = get_tree().current_scene is Stage - receive_game_running.rpc_id(multiplayer.get_remote_sender_id(), is_running) - -@rpc("any_peer") -func receive_game_running(is_running: bool): - is_game_running.emit(is_running) - - @rpc("any_peer") func add_to_players(remote_data: Dictionary): var id = multiplayer.get_remote_sender_id() @@ -152,7 +132,7 @@ func update_player(id: int, remote_data: Dictionary): players_changed.emit() -@rpc("any_peer") +@rpc("any_peer", "call_remote") func destroy_tower(remote_data: Dictionary): var data: Tower.NetworkData = dict_to_inst(remote_data) var remote_tower = Tower.from_network_data(data) @@ -163,7 +143,7 @@ func destroy_tower(remote_data: Dictionary): Client.current_stage.destroy_tower(tower) -@rpc("any_peer") +@rpc("any_peer", "call_remote") func update_tower(remote_tower_node_path: NodePath, remote_data: Dictionary): var data: Tower.NetworkData = dict_to_inst(remote_data) var tower: Tower = get_tree().current_scene.get_node_or_null(remote_tower_node_path) @@ -172,14 +152,14 @@ func update_tower(remote_tower_node_path: NodePath, remote_data: Dictionary): tower.update_with_network_data(data) -@rpc("any_peer") +@rpc("any_peer", "call_remote") func remove_unit(remote_unit_node_path: NodePath): var unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path) if unit: unit.queue_free() -@rpc("any_peer") +@rpc("any_peer", "call_remote") func update_unit(remote_unit_node_path: NodePath, remote_data: Dictionary): var data: Unit.NetworkData = dict_to_inst(remote_data) var unit: Unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path) diff --git a/Game/Selection/selection_rectangle.gd b/Game/Selection/selection_rectangle.gd index b643636..0b6bb22 100644 --- a/Game/Selection/selection_rectangle.gd +++ b/Game/Selection/selection_rectangle.gd @@ -47,7 +47,7 @@ func _draw(): if is_active: var rect = Rect2(Vector2.ZERO, size) draw_rect(rect, color_background) - draw_rect(rect, color_border, false, 1.25 / max(camera.zoom.x, camera.zoom.y)) + draw_rect(rect, color_border, false, 1.1 / max(camera.zoom.x, camera.zoom.y)) func _on_area_entered(area: Area2D) -> void: diff --git a/Game/States/Build/StateBuild.gd b/Game/States/Build/StateBuild.gd index 303a2b1..84bfa2c 100644 --- a/Game/States/Build/StateBuild.gd +++ b/Game/States/Build/StateBuild.gd @@ -4,11 +4,13 @@ extends State static var current_builder_element: BuilderElement +@export var selection_manager: SelectionManager + func _state_enter(): %BuildGrid.visible = true - for tower: Tower in Client.selection.get_nodes().duplicate(): + for tower: Tower in selection_manager.get_nodes().duplicate(): tower.is_selected = false diff --git a/Game/States/Default/StateDefault.gd b/Game/States/Default/StateDefault.gd index 014eb40..205fa3f 100644 --- a/Game/States/Default/StateDefault.gd +++ b/Game/States/Default/StateDefault.gd @@ -2,6 +2,9 @@ class_name StateDefault extends State +@export var selection_manager: SelectionManager + + func _state_input(event: InputEvent) -> void: if event.is_action_pressed("build_mode_start"): set_state("StateBuild") @@ -16,5 +19,5 @@ func _state_unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("select"): # if not multi selecting if not event.is_double_click() and not Input.is_action_pressed("select_multiple"): - for tower: Tower in Client.selection.get_nodes().duplicate(): + for tower: Tower in selection_manager.get_nodes().duplicate(): tower.is_selected = false -- cgit v1.2.3