Armed guys!
This commit is contained in:
+101
-6
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user