From 721f005ff3f4f95f007b382305991956ddc3cf4b Mon Sep 17 00:00:00 2001 From: torsten Date: Sun, 15 Feb 2026 14:00:09 +0100 Subject: [PATCH] ... --- .../maps/outdoor/grass/keuwin_grasland.tscn | 6 ++++ weltenauge/project.godot | 1 + .../systems/interaction/portal/portal.gd | 7 +++++ .../systems/interaction/portal/portal.gd.uid | 1 + .../systems/interaction/portal/portal.tscn | 19 +++++++++++++ weltenauge/systems/network/network_manager.gd | 28 +++++++++++++++++-- .../systems/player/player_controller.gd | 7 ----- 7 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 weltenauge/systems/interaction/portal/portal.gd create mode 100644 weltenauge/systems/interaction/portal/portal.gd.uid create mode 100644 weltenauge/systems/interaction/portal/portal.tscn diff --git a/weltenauge/maps/outdoor/grass/keuwin_grasland.tscn b/weltenauge/maps/outdoor/grass/keuwin_grasland.tscn index b9412c3..100017f 100644 --- a/weltenauge/maps/outdoor/grass/keuwin_grasland.tscn +++ b/weltenauge/maps/outdoor/grass/keuwin_grasland.tscn @@ -1,5 +1,7 @@ [gd_scene format=3 uid="uid://h5qt2pcidh8x"] +[ext_resource type="PackedScene" uid="uid://coq1j1cdrvqyn" path="res://systems/interaction/portal/portal.tscn" id="1_1yg6u"] + [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_d3jw7"] [sub_resource type="Sky" id="Sky_1yg6u"] @@ -41,3 +43,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.01873529, 0) [node name="Interaction" type="Node3D" parent="." unique_id=1592705952] [node name="Triggers" type="Node3D" parent="." unique_id=1507691477] + +[node name="Portal" parent="." unique_id=988801188 instance=ExtResource("1_1yg6u")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0, -6) +target_area_key = "ahnenhalle" diff --git a/weltenauge/project.godot b/weltenauge/project.godot index dafdc50..000f8af 100644 --- a/weltenauge/project.godot +++ b/weltenauge/project.godot @@ -26,6 +26,7 @@ NetworkManager="*uid://tniwwfk5703p" [global_group] players="Verwaltung der Spieler Objekte" +portals="Area Übergänge" [physics] diff --git a/weltenauge/systems/interaction/portal/portal.gd b/weltenauge/systems/interaction/portal/portal.gd new file mode 100644 index 0000000..615e285 --- /dev/null +++ b/weltenauge/systems/interaction/portal/portal.gd @@ -0,0 +1,7 @@ +extends Area3D + +## Definiert, wohin dieses Portal führt und ermöglicht die Interaktion. +## Löst einen RPC an den NetworkManager aus, um einen Area-Wechsel anzufordern. + +# Dieser Wert muss einem Schlüssel in NetworkManager.area_paths entsprechen (z.B. "ahnenhalle"). +@export var target_area_key: String = "" diff --git a/weltenauge/systems/interaction/portal/portal.gd.uid b/weltenauge/systems/interaction/portal/portal.gd.uid new file mode 100644 index 0000000..09b5634 --- /dev/null +++ b/weltenauge/systems/interaction/portal/portal.gd.uid @@ -0,0 +1 @@ +uid://c23uu6akws8nj diff --git a/weltenauge/systems/interaction/portal/portal.tscn b/weltenauge/systems/interaction/portal/portal.tscn new file mode 100644 index 0000000..db64558 --- /dev/null +++ b/weltenauge/systems/interaction/portal/portal.tscn @@ -0,0 +1,19 @@ +[gd_scene format=3 uid="uid://coq1j1cdrvqyn"] + +[ext_resource type="Script" uid="uid://c23uu6akws8nj" path="res://systems/interaction/portal/portal.gd" id="1_8dnr8"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_h1tlh"] +size = Vector3(3.2, 1, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_gtfyq"] + +[node name="Portal" type="Area3D" unique_id=988801188 groups=["portals"]] +script = ExtResource("1_8dnr8") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1301383310] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.50266325, 0) +shape = SubResource("BoxShape3D_h1tlh") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1902207257] +transform = Transform3D(3.2577846, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48517025, 0) +mesh = SubResource("BoxMesh_gtfyq") diff --git a/weltenauge/systems/network/network_manager.gd b/weltenauge/systems/network/network_manager.gd index 945b158..c51914c 100644 --- a/weltenauge/systems/network/network_manager.gd +++ b/weltenauge/systems/network/network_manager.gd @@ -54,7 +54,7 @@ func _on_player_disconnected(id): func change_player_area(id: int, area_key: String): if not multiplayer.is_server(): return print("Server is loading ", area_key) - var path = area_paths[area_key] + var path = area_paths[area_key var container_name = area_key + "_container" var viewport_name = area_key + "_viewport" @@ -111,7 +111,7 @@ func client_ready_to_spawn(): if not multiplayer.is_server(): return if player_worlds.has(id): - var viewport_node = player_worlds[id] + var viewport_node = player_worlds[id print("Client ", id, " ist bereit. Spawne jetzt.") _spawn_player_in_world(id, viewport_node) @@ -209,3 +209,27 @@ func assign_camera_target(node_name: String): local_camera.target = p # var camera = get_viewport().get_camera_3d() + +@rpc("any_peer", "call_remote", "reliable") +func handle_area_change_request(area_key: String): + var id = multiplayer.get_remote_sender_id() + if not player_worlds.has(id): return + + print("Server: Player ", id, " requests area change to ", area_key) + + # 1. Alten Avatar finden und entfernen + var old_viewport = player_worlds[id] + var player_node = old_viewport.find_child(str(id), true) + if player_node: + player_node.queue_free() + + # 2. Bestehende Funktion für den Wechsel aufrufen + change_player_area(id, area_key) + +## The following script is for a Portal node. +## File: portal.gd +extends Area3D + +## Definiert, wohin dieses Portal führt. +## Dieser Wert muss einem Schlüssel in NetworkManager.area_paths entsprechen. +@export var target_area_key: String = "" diff --git a/weltenauge/systems/player/player_controller.gd b/weltenauge/systems/player/player_controller.gd index 44b949a..3e06b38 100644 --- a/weltenauge/systems/player/player_controller.gd +++ b/weltenauge/systems/player/player_controller.gd @@ -11,8 +11,6 @@ extends CharacterBody3D var path: PackedVector3Array = [] var speed = 5.0 -var _is_displayed=false - func _enter_tree(): # Da der Name des Nodes die Peer-ID ist, setzen wir die Authority einfach selbst if name.is_valid_int(): @@ -41,8 +39,6 @@ func _ready(): func _physics_process(delta): # Dieser Teil läuft NUR auf dem Server if path.size() > 0: - print("Server moving...") - _is_displayed = false var next_point = path[0] var direction = (next_point - global_position).normalized() @@ -62,9 +58,6 @@ func _physics_process(delta): else: velocity = Vector3.ZERO sync_position = global_position # Sicherstellen, dass Standbild syncron bleibt - if _is_displayed == false: - print("Target reached:", sync_position) - _is_displayed = true @rpc("any_peer", "call_remote", "reliable")