Quaternius weapons, input fixes, sound & path fixes

- Added 6 Quaternius weapon models (Pistol, Revolver, Rifle, Shotgun, P90, SniperRifle)
- Created weapon resource files with balanced stats
- Wired Pistol + Rifle into player.tscn replacing Kenney blasters
- Fixed WASD input (matched input map action names)
- Fixed Escape key toggles mouse capture
- Added Audio autoload singleton
- Fixed broken sound asset paths across all scripts
- Fixed all scene ext_resource text paths (nested under assets/kenney-fps/)
- Fixed all .import source_file paths
- Deleted stale .import files (will be regenerated by editor on open)
This commit is contained in:
2026-07-05 22:53:27 -04:00
parent 695e4db5cd
commit 91b878f347
155 changed files with 20335 additions and 972 deletions
@@ -26,6 +26,7 @@ var _pending_grenades: Array[Dictionary] = [] # Buffered throws, consumed in _a
# Weapon models (loaded at runtime)
var _knife_model: Node3D
var _pistol_model: Node3D
var _gun_model: Node3D
var _grenade_model: Node3D
var _current_visible_slot: int = -1
@@ -40,17 +41,61 @@ func _ready():
_load_weapon_models()
func _load_weapon_models():
# Knife model
var knife_scene := load("res://examples/multiplayer-fps/models/knife.fbx") as PackedScene
if knife_scene:
_knife_model = knife_scene.instantiate()
_knife_model.scale = Vector3(0.003, 0.003, 0.003)
_knife_model.position = Vector3(0.15, -0.22, -0.35)
_knife_model.rotation_degrees = Vector3(-90, 180, 0)
add_child(_knife_model)
# Weapon models from Quaternius FPS Pack — GLB format, reliable import
# Slot 0 (melee) + Slot 1 (pistol): Use Quaternius Pistol model
var pistol_scene := load("res://assets/quaternius/models/Pistol.glb") as PackedScene
if pistol_scene:
# Slot 0: small pistol as melee visual
var knife = pistol_scene.instantiate()
knife.scale = Vector3(0.35, 0.35, 0.35)
knife.position = Vector3(0.08, -0.18, -0.28)
knife.rotation_degrees = Vector3(-90, 180, 0)
add_child(knife)
_knife_model = knife
_knife_model.hide()
# Slot 1: same pistol model, slightly different position
var pistol = pistol_scene.instantiate()
pistol.scale = Vector3(0.35, 0.35, 0.35)
pistol.position = Vector3(0.08, -0.18, -0.28)
pistol.rotation_degrees = Vector3(-90, 180, 0)
add_child(pistol)
_pistol_model = pistol
_pistol_model.hide()
else:
print("[WM] Pistol model not available — using placeholder")
for slot in [0, 1]:
var box := MeshInstance3D.new()
box.mesh = BoxMesh.new()
box.mesh.size = Vector3(0.3, 0.05, 0.02)
box.position = Vector3(0.15, -0.22, -0.35)
box.rotation_degrees = Vector3(-90, 0, 0)
add_child(box)
if slot == 0:
_knife_model = box
else:
_pistol_model = box
box.hide()
# Grenade model
# Slot 2 (primary rifle): Use Quaternius Rifle model
var rifle_scene := load("res://assets/quaternius/models/Rifle.glb") as PackedScene
if not rifle_scene:
rifle_scene = load("res://assets/quaternius/models/P90.glb") as PackedScene
if rifle_scene:
var rifle = rifle_scene.instantiate()
rifle.scale = Vector3(0.35, 0.35, 0.35)
rifle.position = Vector3(0.06, -0.16, -0.25)
rifle.rotation_degrees = Vector3(-90, 180, 0)
add_child(rifle)
if _gun_model:
_gun_model.hide()
_gun_model = rifle
_gun_model.hide()
else:
print("[WM] Rifle model not available — using placeholder TinyGun")
# Grenade model (keep existing)
var grenade_scene := load("res://examples/multiplayer-fps/models/grenade.glb") as PackedScene
if grenade_scene:
_grenade_model = grenade_scene.instantiate()
@@ -59,21 +104,7 @@ func _load_weapon_models():
add_child(_grenade_model)
_grenade_model.hide()
# Gun model — replace placeholder box with Kenney blaster
var gun_scene := load("res://assets/kenney/models/blaster.glb") as PackedScene
if gun_scene:
var blaster = gun_scene.instantiate()
blaster.scale = Vector3(0.003, 0.003, 0.003)
blaster.position = Vector3(0.09, -0.18, -0.3)
blaster.rotation_degrees = Vector3(-90, 180, 0)
add_child(blaster)
# Hide the old box mesh, use blaster instead
if _gun_model:
_gun_model.hide()
_gun_model = blaster
_gun_model.hide()
# Knife sound
# Knife slash sound
var slash_stream := load("res://examples/multiplayer-fps/sounds/knife/knife_slash1.wav")
if slash_stream:
_knife_sound = AudioStreamPlayer3D.new()
@@ -87,14 +118,18 @@ func _process(_delta: float):
_current_visible_slot = active_slot
if _knife_model:
_knife_model.visible = (active_slot == 0)
if _pistol_model:
_pistol_model.visible = (active_slot == 1)
if _gun_model:
_gun_model.visible = (active_slot == 1 or active_slot == 2)
_gun_model.visible = (active_slot == 2)
if _grenade_model:
_grenade_model.visible = (active_slot == 3)
func hide_weapons():
if _knife_model:
_knife_model.hide()
if _pistol_model:
_pistol_model.hide()
if _gun_model:
_gun_model.hide()
if _grenade_model:
@@ -104,6 +139,12 @@ func hide_weapons():
func show_weapons():
_current_visible_slot = -1 # Force refresh on next _process
# Debug helpers for window title
func has_knife_model() -> bool:
return _knife_model != null
func has_gun_model() -> bool:
return _gun_model != null
func get_active_weapon() -> WeaponData:
var wid := inventory[active_slot]
if wid == 0: