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/Game/Assets/Weapons/Weapon.gd

101 lines
3.8 KiB
GDScript

extends Node3D
#Hand Camera Head Player
@onready var main = get_tree().root.get_node("Main")
@onready var hud = main.get_node("HUD")
@onready var score_rank = hud.get_node("ScoreRank")
@onready var player = get_parent().get_parent().get_parent().get_parent()
@onready var camera = get_parent().get_parent()
@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/Effects/MuzzleFlash.tscn")
var impact_wall = preload("res://Assets/Effects/ImpactSparks.tscn")
var impact_player = preload("res://Assets/Effects/ImpactBlood.tscn")
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
#enum Trigger {TRIGGER_PRIMARY, TRIGGER_SECONDARY}
@rpc(sync) func shoot():
#print("SHOOT from PID ", get_tree().multiplayer.get_network_unique_id(), " controlled by ", player.get_network_authority())
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
if ray: # did we hit anything?
if ray['collider'].has_method(&'damage'):
if get_tree().multiplayer.get_network_unique_id() == 1: # make sure this can only run on the server
print("SHOT HIT ", ray['collider'])
ray['collider'].damage(20) # apply damage
if main.player_list.get(ray['collider'].get_network_authority()).health <= 0: # if he ded
ray['collider'].die(self.get_network_authority())
main.player_list.players[player.get_network_authority()].score += 1 # give the killer a point
main.rpc(&'player_list_update', main.player_list.get(player.get_network_authority()).serialize(), player.get_network_authority())
hud.get_node("Crosshair").kill()
# update local HUD
else:
hud.get_node("Crosshair").hit()
# boardcast the new health value to all peers
main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_network_authority()).serialize(), ray['collider'].get_network_authority())
main.update_hud()
impact_vfx = impact_player.instantiate()
else:
impact_vfx = impact_wall.instantiate()
if impact_vfx:
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)
#print(ray)
@rpc(sync, auth) func trigger(index: int, active: bool) -> void:
#print("Weapon " + str(name) + ", Trigger " + str(index) + ", active: " + str(active))
if index == 0 and active and $Handgun/AnimationPlayer.is_playing() == false:
rpc(&'shoot')
$Handgun/AnimationPlayer.play("Shoot", 0, 2.5)
var flash_effect
if flash.has_method(&"instance"):
flash_effect = flash.instance()
else:
flash_effect = flash.instantiate()
get_parent().add_child(flash_effect)
flash_effect.global_transform = muzzle.global_transform
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)
# TODO correct the ejection angle - right now it shoots straight up relative to the gun
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
# Called when the node enters the scene tree for the first time.
func _ready():
pass