Colours and practise dummy
This commit is contained in:
+84
-1
@@ -4,10 +4,12 @@ extends Node3D
|
||||
@onready var nick_input: LineEdit = $Menu/MainContainer/MainMenu/Option1/NickInput
|
||||
@onready var address_input: LineEdit = $Menu/MainContainer/MainMenu/Option3/AddressInput
|
||||
@onready var players_container: Node3D = $PlayersContainer
|
||||
@onready var weapons_container: Node3D = null # Will be created if doesn't exist
|
||||
@onready var weapons_container: Node3D = $WeaponsContainer
|
||||
@onready var enemies_container: Node3D = $EnemiesContainer
|
||||
@onready var menu: Control = $Menu
|
||||
@onready var main_menu: VBoxContainer = $Menu/MainContainer/MainMenu
|
||||
@export var player_scene: PackedScene
|
||||
@export var practice_dummy_scene: PackedScene
|
||||
|
||||
# Weapon spawning counter (server-side only)
|
||||
var _weapon_spawn_counter: int = 0
|
||||
@@ -43,6 +45,15 @@ func _ready():
|
||||
add_child(weapons_container)
|
||||
print("Created WeaponsContainer")
|
||||
|
||||
# Create or find enemies container
|
||||
if has_node("EnemiesContainer"):
|
||||
enemies_container = get_node("EnemiesContainer")
|
||||
else:
|
||||
enemies_container = Node3D.new()
|
||||
enemies_container.name = "EnemiesContainer"
|
||||
add_child(enemies_container)
|
||||
print("Created EnemiesContainer")
|
||||
|
||||
# Don't initialize weapons in _ready() - wait for Host/Join to be pressed
|
||||
# This is handled in initialize_multiplayer() which is called after the
|
||||
# multiplayer peer is properly set up
|
||||
@@ -74,6 +85,9 @@ func initialize_multiplayer():
|
||||
# Spawn initial weapons when server starts
|
||||
_spawn_initial_weapons()
|
||||
|
||||
# Spawn practice dummies
|
||||
_spawn_practice_dummies()
|
||||
|
||||
# Spawn the host player (peer ID 1)
|
||||
print("[Level] Spawning host player")
|
||||
var host_info = Network.players.get(1, {"nick": "Host", "skin": "blue"})
|
||||
@@ -219,6 +233,18 @@ func _on_player_connected(peer_id, player_info):
|
||||
else:
|
||||
print("[Server] Skipping invalid weapon ", weapon_id)
|
||||
|
||||
# Sync existing enemies to the newly joined player
|
||||
print("[Server] Syncing enemies to newly connected peer: ", peer_id)
|
||||
if enemies_container:
|
||||
for enemy in enemies_container.get_children():
|
||||
if enemy is BaseEnemy:
|
||||
# Extract ID from name (e.g., "PracticeDummy_1" -> 1)
|
||||
var enemy_name_parts = enemy.name.split("_")
|
||||
if enemy_name_parts.size() >= 2:
|
||||
var enemy_id = enemy_name_parts[-1].to_int()
|
||||
print("[Server] Syncing enemy ", enemy.name, " at position ", enemy.global_position, " to peer ", peer_id)
|
||||
rpc_id(peer_id, "_spawn_dummy_local", enemy_id, enemy.global_position)
|
||||
|
||||
# Sync equipped weapons for all existing players to the newly joined player
|
||||
print("[Server] Syncing equipped weapons to newly connected peer: ", peer_id)
|
||||
for player_node in players_container.get_children():
|
||||
@@ -414,6 +440,63 @@ func _on_jemz_preset():
|
||||
skin_input.text = "Red"
|
||||
address_input.text = "127.0.0.1"
|
||||
|
||||
# ---------- ENEMY SPAWNING ----------
|
||||
func _spawn_practice_dummies():
|
||||
if not multiplayer.is_server():
|
||||
return
|
||||
|
||||
if not practice_dummy_scene:
|
||||
push_warning("Practice dummy scene not assigned!")
|
||||
return
|
||||
|
||||
# Wait a frame for everything to be ready
|
||||
await get_tree().process_frame
|
||||
|
||||
print("[Server] Spawning practice dummies")
|
||||
|
||||
# Spawn dummies at different positions
|
||||
var dummy_positions = [
|
||||
Vector3(10, 0, 0),
|
||||
Vector3(-10, 0, 0),
|
||||
Vector3(0, 0, 10),
|
||||
Vector3(0, 0, -10),
|
||||
]
|
||||
|
||||
var dummy_counter = 0
|
||||
for pos in dummy_positions:
|
||||
dummy_counter += 1
|
||||
rpc("_spawn_dummy_local", dummy_counter, pos)
|
||||
|
||||
## Spawn a practice dummy on all clients
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
func _spawn_dummy_local(dummy_id: int, spawn_pos: Vector3):
|
||||
if not practice_dummy_scene:
|
||||
push_error("Practice dummy scene not loaded!")
|
||||
return
|
||||
|
||||
if not enemies_container:
|
||||
push_error("EnemiesContainer not found!")
|
||||
return
|
||||
|
||||
var dummy_name = "PracticeDummy_" + str(dummy_id)
|
||||
|
||||
# Don't spawn duplicates
|
||||
if enemies_container.has_node(dummy_name):
|
||||
print("[Peer ", multiplayer.get_unique_id(), "] Dummy ", dummy_name, " already exists")
|
||||
return
|
||||
|
||||
print("[Peer ", multiplayer.get_unique_id(), "] Spawning dummy ", dummy_name, " at ", spawn_pos)
|
||||
|
||||
var dummy = practice_dummy_scene.instantiate()
|
||||
dummy.name = dummy_name
|
||||
dummy.position = spawn_pos
|
||||
|
||||
# Set multiplayer authority to server
|
||||
dummy.set_multiplayer_authority(1)
|
||||
|
||||
enemies_container.add_child(dummy, true)
|
||||
print("[Peer ", multiplayer.get_unique_id(), "] Dummy ", dummy_name, " spawned successfully")
|
||||
|
||||
# ---------- WEAPON SPAWNING ----------
|
||||
## Spawn a weapon in the world (called from server, syncs to all clients)
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
|
||||
Reference in New Issue
Block a user