Base Weapons
Place in world, pick up and drop working on multiplayer
This commit is contained in:
@@ -4,10 +4,14 @@ 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 menu: Control = $Menu
|
||||
@onready var main_menu: VBoxContainer = $Menu/MainContainer/MainMenu
|
||||
@export var player_scene: PackedScene
|
||||
|
||||
# Weapon spawning counter (server-side only)
|
||||
var _weapon_spawn_counter: int = 0
|
||||
|
||||
# multiplayer chat
|
||||
@onready var message: LineEdit = $MultiplayerChat/VBoxContainer/HBoxContainer/Message
|
||||
@onready var send: Button = $MultiplayerChat/VBoxContainer/HBoxContainer/Send
|
||||
@@ -24,12 +28,49 @@ func _ready():
|
||||
# Add quick-fill preset buttons
|
||||
_create_preset_buttons()
|
||||
|
||||
# Create or find weapons container
|
||||
if has_node("WeaponsContainer"):
|
||||
weapons_container = get_node("WeaponsContainer")
|
||||
else:
|
||||
weapons_container = Node3D.new()
|
||||
weapons_container.name = "WeaponsContainer"
|
||||
add_child(weapons_container)
|
||||
print("Created WeaponsContainer")
|
||||
|
||||
if not multiplayer.is_server():
|
||||
return
|
||||
|
||||
Network.connect("player_connected", Callable(self, "_on_player_connected"))
|
||||
multiplayer.peer_disconnected.connect(_remove_player)
|
||||
|
||||
# Spawn initial weapons when server starts
|
||||
_spawn_initial_weapons()
|
||||
|
||||
func _spawn_initial_weapons():
|
||||
if not multiplayer.is_server():
|
||||
return
|
||||
|
||||
# Wait a frame for everything to be ready
|
||||
await get_tree().process_frame
|
||||
|
||||
# Spawn a sword
|
||||
_weapon_spawn_counter += 1
|
||||
rpc("spawn_world_weapon",
|
||||
"res://level/resources/weapon_sword.tres",
|
||||
Vector3(5, 1, 0),
|
||||
Vector3.ZERO,
|
||||
_weapon_spawn_counter
|
||||
)
|
||||
|
||||
# Spawn a shield
|
||||
_weapon_spawn_counter += 1
|
||||
rpc("spawn_world_weapon",
|
||||
"res://level/resources/weapon_shield.tres",
|
||||
Vector3(-5, 1, 0),
|
||||
Vector3.ZERO,
|
||||
_weapon_spawn_counter
|
||||
)
|
||||
|
||||
func _on_player_connected(peer_id, player_info):
|
||||
# for id in Network.players.keys():
|
||||
# var player_data = Network.players[id]
|
||||
@@ -162,3 +203,33 @@ func _on_jemz_preset():
|
||||
nick_input.text = "Jemz"
|
||||
skin_input.text = "Red"
|
||||
address_input.text = "127.0.0.1"
|
||||
|
||||
# ---------- WEAPON SPAWNING ----------
|
||||
## Spawn a weapon in the world (called from server, syncs to all clients)
|
||||
@rpc("authority", "call_local", "reliable")
|
||||
func spawn_world_weapon(weapon_data_path: String, spawn_position: Vector3, initial_velocity: Vector3, weapon_id: int):
|
||||
if not weapons_container:
|
||||
push_error("WeaponsContainer not found in level!")
|
||||
return
|
||||
|
||||
# Load the weapon data resource
|
||||
var weapon_data = load(weapon_data_path) as WeaponData
|
||||
if not weapon_data:
|
||||
push_error("Failed to load weapon data from: " + weapon_data_path)
|
||||
return
|
||||
|
||||
# Create WorldWeapon instance
|
||||
var world_weapon = WorldWeapon.new()
|
||||
world_weapon.weapon_data = weapon_data
|
||||
world_weapon.name = "WorldWeapon_" + str(weapon_id) # Deterministic name
|
||||
world_weapon.position = spawn_position
|
||||
|
||||
# Add to weapons container
|
||||
weapons_container.add_child(world_weapon, true)
|
||||
|
||||
print("Spawned weapon: ", world_weapon.name, " at ", spawn_position)
|
||||
|
||||
# Apply velocity after physics is ready
|
||||
if initial_velocity != Vector3.ZERO:
|
||||
await get_tree().process_frame
|
||||
world_weapon.linear_velocity = initial_velocity
|
||||
|
||||
Reference in New Issue
Block a user