This repository has been archived on 2022-01-09. You can view files and clone it, but cannot push or open issues/pull-requests.
liblast/Assets/Weapons/Weapon.gd

145 lines
3.7 KiB
GDScript
Raw Normal View History

2021-02-26 20:58:13 +01:00
extends Node3D
2020-06-19 23:15:01 +02:00
2020-09-30 02:08:16 +02:00
signal damage_dealt
signal ammo_changed(type, amount)
2020-09-19 20:26:51 +02:00
export(bool) var Hitscan = false
export(int) var Damage = 100
export(float) var Delay = 0.1
export(bool) var Automatic = false
export(int) var Rounds = 10
export(int) var MaxRoundsInClip = 10
export(int) var Clips = 1
export(int) var MaxClips = 4
2020-09-19 20:26:51 +02:00
onready var player = get_parent().get_parent().get_parent()
onready var ejector = find_node("Ejector")
onready var muzzle = find_node("Muzzle")
2020-09-30 02:08:16 +02:00
onready var current_rounds = Rounds
var currently_fireing = false
var cached_fire = false
2020-09-25 00:26:19 +02:00
#onready var sound_shoot = $SoundShoot
2020-09-14 23:52:16 +02:00
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
2020-09-18 01:09:54 +02:00
var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
2020-06-19 23:15:01 +02:00
2020-09-30 02:08:16 +02:00
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")
print(player.get_network_master())
2020-09-30 02:08:16 +02:00
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
2020-09-25 22:44:06 +02:00
2020-09-30 02:08:16 +02:00
sync func dry_fire():
pass
2020-09-25 22:44:06 +02:00
2020-09-30 02:08:16 +02:00
func show_muzzle_flash(var rounds_left):
$Handgun/AnimationPlayer.stop()
2020-09-30 02:08:16 +02:00
if rounds_left == 1:
$Handgun/AnimationPlayer.play("Empty", -1, 2)
else:
$Handgun/AnimationPlayer.play("Shoot", -1, 2)
$SoundShoot.play()
2020-09-18 01:09:54 +02:00
$MuzzleFlash.emitting = true
2020-09-25 22:44:06 +02:00
yield(get_tree().create_timer(0.07),"timeout")
$MuzzleFlash.emitting = false
2020-09-30 02:08:16 +02:00
func show_tracer():
2020-09-25 22:44:06 +02:00
var tracer_instance = tracer.instance()
tracer_instance.hide()
tracer_instance.global_transform = muzzle.global_transform
2020-09-14 23:52:16 +02:00
2020-09-25 22:44:06 +02:00
get_tree().root.call_deferred("add_child", tracer_instance)
tracer_instance.call_deferred("show")
2020-09-30 02:08:16 +02:00
func spawn_casing():
var casing_instance = casing.instance()
casing_instance.global_transform = ejector.global_transform
2020-09-18 01:09:54 +02:00
casing_instance.rotate_object_local(Vector3.FORWARD, deg2rad(90))
casing_instance.angular_velocity = - ejector.global_transform.basis[2] * rand_range(23, 37)
casing_instance.linear_velocity = ejector.global_transform.basis[0] * rand_range(3.2, 4.5) - ejector.global_transform.basis[2] * rand_range(2.6, 3.7)
2020-09-14 23:52:16 +02:00
get_tree().root.call_deferred("add_child", casing_instance)
2020-09-25 23:19:38 +02:00
remote func compute_bullet_flyby():
2020-09-25 23:25:13 +02:00
var local_player = get_tree().root.get_node("Game").local_player
2020-09-25 23:19:38 +02:00
var transform = find_node("Muzzle").global_transform
2020-09-25 23:38:22 +02:00
var from = global_transform.xform(Vector3())
var to = global_transform.xform(Vector3(-1000, 0, 0))
2020-09-25 23:19:38 +02:00
if local_player:
local_player.on_bullet_flyby(from, to)
2020-09-30 02:08:16 +02:00
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)
$SoundReload.play()