Colours and practise dummy

This commit is contained in:
Twirpytherobot
2025-11-29 18:10:23 +00:00
parent ddc1522174
commit fab47fb1e0
11 changed files with 467 additions and 37 deletions
+84 -1
View File
@@ -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")