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(any, sync, reliable) func shoot(): #print("SHOOT from PID ", get_tree().multiplayer.get_multiplayer_unique_id(), " controlled by ", player.get_multiplayer_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]) $Handgun/SFX/Shoot.play() var impact_vfx if ray: # did we hit anything? if ray['collider'].has_method(&'damage'): if is_multiplayer_authority(): #get_tree().multiplayer.get_multiplayer_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_multiplayer_authority()).health <= 0: # if he ded ray['collider'].rpc(&'die', self.get_multiplayer_authority()) main.player_list.players[player.get_multiplayer_authority()].score += 1 # give the killer a point main.rpc(&'player_list_update', main.player_list.get(player.get_multiplayer_authority()).serialize(), player.get_multiplayer_authority()) hud.get_node("Crosshair").kill() main.check_game_win_condition() # 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_multiplayer_authority()).serialize(), ray['collider'].get_multiplayer_authority()) main.update_hud() impact_vfx = impact_player.instantiate() else: impact_vfx = impact_wall.instantiate() if impact_vfx != null: 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) 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 / 60) #approximating delta casing_instance.linear_velocity = ejector.global_transform.basis[1] * randf_range(3.2, 4.5) + (player.linear_velocity / 2) casing_instance.angular_velocity.y += randf_range(-10, 10) casing_instance.angular_velocity.x += randf_range(-10, 10) # Called when the node enters the scene tree for the first time. func _ready(): # align the sound source with the head to produce balanced stereo pass #$Handgun/SFX/Shoot.global_transform = camera.global_transform