Base Weapons

Place in world, pick up and drop working on multiplayer
This commit is contained in:
Twirpytherobot
2025-11-15 16:03:38 +00:00
parent 791b1557c7
commit 86db6865b7
144 changed files with 3582 additions and 2 deletions
+71
View File
@@ -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