2021-06-18 01:43:10 +02:00
|
|
|
extends Node3D
|
2021-07-26 20:51:54 +02:00
|
|
|
#Hand Camera Head Player
|
|
|
|
@onready var player = get_parent().get_parent().get_parent().get_parent()
|
2021-08-23 01:57:47 +02:00
|
|
|
@onready var camera = get_parent().get_parent()
|
2021-07-04 21:50:13 +02:00
|
|
|
@onready var ejector = find_node("Ejector")
|
|
|
|
@onready var muzzle = find_node("Muzzle")
|
|
|
|
|
|
|
|
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
|
|
|
|
var flash = preload("res://Assets/Weapons/Handgun/Flash.tscn")
|
2021-08-23 01:57:47 +02:00
|
|
|
var impact_wall = preload("res://Assets/Effects/ImpactWall.tscn")
|
|
|
|
var impact_player = preload("res://Assets/Effects/ImpactPlayer.tscn")
|
2021-07-04 21:50:13 +02:00
|
|
|
|
2021-06-18 01:43:10 +02:00
|
|
|
# Declare member variables here. Examples:
|
|
|
|
# var a = 2
|
|
|
|
# var b = "text"
|
|
|
|
|
|
|
|
#enum Trigger {TRIGGER_PRIMARY, TRIGGER_SECONDARY}
|
|
|
|
|
2021-08-23 01:57:47 +02:00
|
|
|
@remotesync func shoot():
|
|
|
|
var space_state = get_world_3d().direct_space_state
|
|
|
|
|
|
|
|
var from = camera.get_global_transform().origin
|
|
|
|
var aim = - camera.get_global_transform().basis[2]
|
|
|
|
var to = from + (aim * 1000)
|
|
|
|
|
|
|
|
var ray = space_state.intersect_ray(from, to, [player])
|
|
|
|
|
|
|
|
var impact_vfx
|
|
|
|
|
2021-08-24 20:56:29 +02:00
|
|
|
if ray: # did we hit anything?
|
|
|
|
if ray['collider'].has_method(&'damage'):
|
|
|
|
if get_tree().network_peer.get_unique_id() == 1: # make sure this can only run on the server
|
|
|
|
ray['collider'].damage(10)
|
|
|
|
impact_vfx = impact_player.instantiate()
|
|
|
|
else:
|
|
|
|
impact_vfx = impact_wall.instantiate()
|
|
|
|
|
|
|
|
impact_vfx.global_transform = impact_vfx.global_transform.looking_at(ray['normal'])
|
|
|
|
impact_vfx.global_transform.origin = ray['position']
|
|
|
|
get_tree().root.add_child(impact_vfx)
|
2021-08-23 01:57:47 +02:00
|
|
|
|
|
|
|
print(ray)
|
|
|
|
|
2021-07-04 21:50:13 +02:00
|
|
|
@puppetsync func trigger(index: int, active: bool) -> void:
|
2021-07-26 20:51:54 +02:00
|
|
|
#print("Weapon " + str(name) + ", Trigger " + str(index) + ", active: " + str(active))
|
2021-06-18 01:43:10 +02:00
|
|
|
|
2021-08-23 01:57:47 +02:00
|
|
|
if index == 0 and active and $Handgun/AnimationPlayer.is_playing() == false:
|
|
|
|
|
|
|
|
rpc(&'shoot') # server will evaluate if I hit my target
|
|
|
|
|
2021-07-04 21:50:13 +02:00
|
|
|
|
|
|
|
$Handgun/AnimationPlayer.play("Shoot", 0, 2.5)
|
|
|
|
|
2021-07-12 22:40:23 +02:00
|
|
|
var flash_effect
|
|
|
|
if flash.has_method(&"instance"):
|
|
|
|
flash_effect = flash.instance()
|
|
|
|
else:
|
|
|
|
flash_effect = flash.instantiate()
|
|
|
|
|
2021-07-04 21:50:13 +02:00
|
|
|
get_parent().add_child(flash_effect)
|
|
|
|
flash_effect.global_transform = muzzle.global_transform
|
2021-07-26 20:51:54 +02:00
|
|
|
|
|
|
|
var casing_instance
|
|
|
|
if casing.has_method(&"instance"):
|
|
|
|
casing_instance = casing.instance()
|
|
|
|
else:
|
|
|
|
casing_instance = casing.instantiate()
|
|
|
|
|
|
|
|
get_tree().root.add_child(casing_instance)
|
|
|
|
|
|
|
|
casing_instance.global_transform = ejector.global_transform.translated(player.linear_velocity / 30) #approximating delta
|
|
|
|
#casing_instance.rotate_object_local(Vector3.FORWARD, deg2rad(90))
|
|
|
|
#casing_instance.angular_velocity = - ejector.global_transform.basis[2] * randf_range(13, 17)
|
2021-08-23 01:57:47 +02:00
|
|
|
|
|
|
|
# TODO correct the ejection angle - right now it shoots straight up relative to the gun
|
2021-07-26 20:51:54 +02:00
|
|
|
casing_instance.linear_velocity = ejector.global_transform.basis[0] * randf_range(6.2, 8.5)# - ejector.global_transform.basis[2] * randf_range(-1.2, -1.7) + player.linear_velocity
|
2021-06-18 01:43:10 +02:00
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready():
|
2021-07-04 21:50:13 +02:00
|
|
|
pass
|