forked from unfa/liblast
Added weapon reloading
parent
23a4bf0bad
commit
63b48d45a9
|
@ -1,10 +1,13 @@
|
|||
extends Control
|
||||
|
||||
func update_ammo(var weapon, var amount):
|
||||
$Weapon/VBoxContainer/RoundsClips.text = str(amount)
|
||||
|
||||
func updateHealth(health: int):
|
||||
$Health/HealthBar.value = health
|
||||
$Health/HealthBar/HealthText.text = String(health)
|
||||
|
||||
func updateCrosshair(visible: bool, hit: bool):
|
||||
func update_crosshair(visible: bool, hit: bool):
|
||||
$Crosshair.visible = visible
|
||||
if hit:
|
||||
$Crosshair/HitConfirmation.activate(0.2)
|
||||
|
|
|
@ -144,7 +144,7 @@ alignment = 1
|
|||
margin_top = 16.0
|
||||
margin_right = 116.0
|
||||
margin_bottom = 30.0
|
||||
text = "12 / 6"
|
||||
text = "10"
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
extends Spatial
|
||||
|
||||
signal damage_dealt
|
||||
signal ammo_changed(type, amount)
|
||||
|
||||
export(bool) var Hitscan = false
|
||||
export(int) var Damage = 100
|
||||
export(float) var Delay = 0.1
|
||||
|
@ -9,35 +12,90 @@ export(int) var MaxRoundsInClip = 10
|
|||
export(int) var Clips = 1
|
||||
export(int) var MaxClips = 4
|
||||
|
||||
|
||||
onready var camera = get_parent().get_parent()
|
||||
onready var player = get_parent().get_parent().get_parent()
|
||||
|
||||
onready var ejector = find_node("Ejector")
|
||||
onready var muzzle = find_node("Muzzle")
|
||||
|
||||
onready var current_rounds = Rounds
|
||||
|
||||
var currently_fireing = false
|
||||
var cached_fire = false
|
||||
|
||||
#onready var sound_shoot = $SoundShoot
|
||||
|
||||
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
|
||||
var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
|
||||
|
||||
func shoot():
|
||||
rpc("show_muzzle_flash")
|
||||
rpc("show_tracer")
|
||||
rpc("spawn_casing")
|
||||
rpc("compute_bullet_flyby")
|
||||
func shoot(camera):
|
||||
if cached_fire == true:
|
||||
return
|
||||
|
||||
if currently_fireing == true:
|
||||
cached_fire = true
|
||||
yield($Handgun/AnimationPlayer, "animation_finished")
|
||||
|
||||
# TODO: mutexes
|
||||
currently_fireing = true
|
||||
cached_fire = false
|
||||
|
||||
if current_rounds > 0:
|
||||
rpc("fire_weapon", current_rounds)
|
||||
rpc("compute_bullet_flyby")
|
||||
|
||||
current_rounds -= 1
|
||||
emit_signal("ammo_changed", "handgun", current_rounds)
|
||||
|
||||
var space_state = get_world().direct_space_state
|
||||
|
||||
var crosshair_pos = get_viewport().size / 2
|
||||
|
||||
var from = camera.project_ray_origin(crosshair_pos)
|
||||
var to = from + camera.project_ray_normal(crosshair_pos) * 1000
|
||||
|
||||
var result = space_state.intersect_ray(from, to)
|
||||
|
||||
if "collider" in result:
|
||||
var hit = result.collider
|
||||
|
||||
if hit.has_method("on_hit"):
|
||||
hit.rpc("on_hit", 30, result.position)
|
||||
|
||||
if hit is preload("res://Player.gd"):
|
||||
emit_signal("damage_dealt")
|
||||
else:
|
||||
rpc("dry_fire")
|
||||
|
||||
return current_rounds
|
||||
|
||||
sync func fire_weapon(var rounds_left):
|
||||
show_muzzle_flash(rounds_left)
|
||||
show_tracer()
|
||||
spawn_casing()
|
||||
yield($Handgun/AnimationPlayer, "animation_finished")
|
||||
|
||||
if !cached_fire:
|
||||
currently_fireing = false
|
||||
|
||||
sync func show_muzzle_flash():
|
||||
sync func dry_fire():
|
||||
pass
|
||||
|
||||
func show_muzzle_flash(var rounds_left):
|
||||
$Handgun/AnimationPlayer.stop()
|
||||
$Handgun/AnimationPlayer.play("Shoot", -1, 2)
|
||||
|
||||
if rounds_left == 1:
|
||||
$Handgun/AnimationPlayer.play("Empty", -1, 2)
|
||||
else:
|
||||
$Handgun/AnimationPlayer.play("Shoot", -1, 2)
|
||||
|
||||
$SoundShoot.play()
|
||||
|
||||
$MuzzleFlash.emitting = true
|
||||
yield(get_tree().create_timer(0.07),"timeout")
|
||||
$MuzzleFlash.emitting = false
|
||||
|
||||
sync func show_tracer():
|
||||
func show_tracer():
|
||||
var tracer_instance = tracer.instance()
|
||||
tracer_instance.hide()
|
||||
tracer_instance.global_transform = muzzle.global_transform
|
||||
|
@ -45,7 +103,7 @@ sync func show_tracer():
|
|||
get_tree().root.call_deferred("add_child", tracer_instance)
|
||||
tracer_instance.call_deferred("show")
|
||||
|
||||
sync func spawn_casing():
|
||||
func spawn_casing():
|
||||
var casing_instance = casing.instance()
|
||||
casing_instance.global_transform = ejector.global_transform
|
||||
|
||||
|
@ -64,3 +122,21 @@ remote func compute_bullet_flyby():
|
|||
var to = global_transform.xform(Vector3(-1000, 0, 0))
|
||||
|
||||
local_player.on_bullet_flyby(from, to)
|
||||
|
||||
func reload():
|
||||
rpc("play_reload_animation")
|
||||
|
||||
currently_fireing = true
|
||||
cached_fire = false
|
||||
|
||||
yield($Handgun/AnimationPlayer, "animation_finished")
|
||||
|
||||
if not cached_fire:
|
||||
currently_fireing = false
|
||||
|
||||
current_rounds = Rounds
|
||||
|
||||
emit_signal("ammo_changed", "handgun", current_rounds)
|
||||
|
||||
sync func play_reload_animation():
|
||||
$Handgun/AnimationPlayer.play("Reload", 0.5, 1)
|
||||
|
|
33
Player.gd
33
Player.gd
|
@ -220,8 +220,7 @@ master func kill():
|
|||
#print ("set as dead")
|
||||
$MeshInstance.hide()
|
||||
$Camera/Hand.hide()
|
||||
$HUD.updateCrosshair(false, false)
|
||||
|
||||
#$HUD.update_crosshair(false, false)
|
||||
|
||||
yield(get_tree().create_timer(3), "timeout")
|
||||
|
||||
|
@ -249,8 +248,6 @@ func spawn():
|
|||
$MeshInstance.show()
|
||||
$Camera/Hand.show()
|
||||
|
||||
$HUD.updateCrosshair(true, false)
|
||||
|
||||
$CollisionShapeBody.disabled = false
|
||||
$CollisionShapeFeet.disabled = false
|
||||
|
||||
|
@ -258,28 +255,14 @@ func spawn():
|
|||
rotation = Vector3.ZERO
|
||||
|
||||
func shoot():
|
||||
var gun = find_node("Weapon")
|
||||
var weapon = find_node("Weapon")
|
||||
|
||||
gun.shoot()
|
||||
var remaining_ammo = weapon.shoot($Camera)
|
||||
|
||||
func reload():
|
||||
var weapon = find_node("Weapon")
|
||||
|
||||
var space_state = get_world().direct_space_state
|
||||
var crosshair_pos = get_viewport().size / 2
|
||||
|
||||
var from = $Camera.project_ray_origin(crosshair_pos)
|
||||
var to = from + $Camera.project_ray_normal(crosshair_pos) * 1000
|
||||
|
||||
var result = space_state.intersect_ray(from, to)
|
||||
|
||||
if "collider" in result:
|
||||
var hit = result.collider
|
||||
|
||||
if hit.has_method("on_hit"):
|
||||
hit.rpc("on_hit", 30, result.position)
|
||||
|
||||
if hit is get_script():
|
||||
print("Is a live player")
|
||||
|
||||
$HUD.updateCrosshair(true, true)
|
||||
weapon.reload()
|
||||
|
||||
func _input(event):
|
||||
|
||||
|
@ -324,6 +307,8 @@ func _input(event):
|
|||
|
||||
if event.is_action_pressed("WeaponPrimary"):
|
||||
shoot()
|
||||
if event.is_action_pressed("WeaponReload"):
|
||||
reload()
|
||||
|
||||
func set_local_player():
|
||||
set_network_master(get_tree().get_network_unique_id())
|
||||
|
|
|
@ -71,3 +71,5 @@ MinDelay = 0.2
|
|||
|
||||
[node name="HUD" parent="." instance=ExtResource( 3 )]
|
||||
visible = false
|
||||
[connection signal="ammo_changed" from="Camera/Hand/Weapon" to="HUD" method="update_ammo"]
|
||||
[connection signal="damage_dealt" from="Camera/Hand/Weapon" to="HUD" method="update_crosshair" binds= [ true, true ]]
|
||||
|
|
|
@ -65,6 +65,11 @@ WeaponSecondary={
|
|||
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null)
|
||||
]
|
||||
}
|
||||
WeaponReload={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
ToggleMenu={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null)
|
||||
|
|
Loading…
Reference in New Issue