Armed guys!

This commit is contained in:
Twirpytherobot
2026-02-17 22:21:17 +00:00
parent fce4c4a3e2
commit 7629342540
14 changed files with 928 additions and 73 deletions
+101 -6
View File
@@ -12,6 +12,7 @@ extends Node3D
@onready var main_menu: VBoxContainer = $Menu/MainContainer/MainMenu
@export var player_scene: PackedScene
@export var practice_dummy_scene: PackedScene
@export var armed_enemy_scene: PackedScene
# Weapon spawning counter (server-side only)
var _weapon_spawn_counter: int = 0
@@ -92,6 +93,9 @@ func initialize_multiplayer():
# Spawn practice dummies
_spawn_practice_dummies()
# Spawn armed enemies
_spawn_armed_enemies()
# Spawn the host player (peer ID 1)
print("[Level] Spawning host player")
var host_info = Network.players.get(1, {"nick": "Host", "skin": "blue"})
@@ -242,12 +246,24 @@ func _on_player_connected(peer_id, player_info):
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)
# Check if it's an ArmedEnemy or PracticeDummy
if enemy.name.begins_with("ArmedEnemy_"):
# Sync armed enemy with its weapons
var main_weapon_path = ""
var offhand_weapon_path = ""
if "equipped_weapon" in enemy and enemy.equipped_weapon and enemy.equipped_weapon.weapon_data:
main_weapon_path = enemy.equipped_weapon.weapon_data.resource_path
if "equipped_offhand" in enemy and enemy.equipped_offhand and enemy.equipped_offhand.weapon_data:
offhand_weapon_path = enemy.equipped_offhand.weapon_data.resource_path
print("[Server] Syncing armed enemy ", enemy.name, " to peer ", peer_id)
rpc_id(peer_id, "_spawn_armed_enemy_local", enemy.name, enemy.global_position, main_weapon_path, offhand_weapon_path)
elif enemy.name.begins_with("PracticeDummy_"):
# 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)
@@ -630,3 +646,82 @@ func _client_spawn_weapon(weapon_data_path: String, spawn_position: Vector3, ini
# Call the regular spawn function to create the weapon
print("[Client ", multiplayer.get_unique_id(), "] Calling spawn_world_weapon locally")
spawn_world_weapon(weapon_data_path, spawn_position, initial_velocity, weapon_id)
# ---------- ARMED ENEMY SPAWNING ----------
var _armed_enemy_counter: int = 0
## Spawn an armed enemy (server only, replicates to all clients)
func spawn_armed_enemy(spawn_pos: Vector3, main_weapon_path: String = "", offhand_weapon_path: String = ""):
if not multiplayer.is_server():
return
if not armed_enemy_scene:
push_warning("[Level] Armed enemy scene not assigned!")
return
_armed_enemy_counter += 1
var enemy_name = "ArmedEnemy_" + str(_armed_enemy_counter)
rpc("_spawn_armed_enemy_local", enemy_name, spawn_pos, main_weapon_path, offhand_weapon_path)
## Spawn armed enemy on all clients
@rpc("any_peer", "call_local", "reliable")
func _spawn_armed_enemy_local(enemy_name: String, spawn_pos: Vector3, main_weapon_path: String, offhand_weapon_path: String):
if not armed_enemy_scene:
push_error("[Level] Armed enemy scene not loaded!")
return
if not enemies_container:
push_error("[Level] EnemiesContainer not found!")
return
# Don't spawn duplicates
if enemies_container.has_node(enemy_name):
print("[Peer ", multiplayer.get_unique_id(), "] Armed enemy ", enemy_name, " already exists")
return
print("[Peer ", multiplayer.get_unique_id(), "] Spawning armed enemy ", enemy_name, " at ", spawn_pos)
var enemy = armed_enemy_scene.instantiate()
enemy.name = enemy_name
enemy.position = spawn_pos
# Set multiplayer authority to server
enemy.set_multiplayer_authority(1)
# Set starting weapons (for server to trigger RPCs)
if main_weapon_path != "":
var weapon_data = load(main_weapon_path) as WeaponData
if weapon_data:
enemy.starting_weapon = weapon_data
if offhand_weapon_path != "":
var offhand_data = load(offhand_weapon_path) as WeaponData
if offhand_data:
enemy.starting_offhand = offhand_data
enemies_container.add_child(enemy, true)
print("[Peer ", multiplayer.get_unique_id(), "] Armed enemy ", enemy_name, " spawned successfully")
## Spawn initial armed enemies when server starts
func _spawn_armed_enemies():
if not multiplayer.is_server():
return
if not armed_enemy_scene:
push_warning("[Level] Armed enemy scene not assigned - skipping armed enemy spawn")
return
# Wait a frame for everything to be ready
await get_tree().process_frame
print("[Server] Spawning armed enemies")
# Spawn armed enemies at different positions with weapons
var enemy_configs = [
{"pos": Vector3(15, 0, 5), "weapon": "res://level/resources/weapon_sword.tres", "offhand": ""},
{"pos": Vector3(-15, 0, 5), "weapon": "res://level/resources/weapon_sword.tres", "offhand": "res://level/resources/weapon_shield.tres"},
]
for config in enemy_configs:
spawn_armed_enemy(config["pos"], config["weapon"], config["offhand"])