|
# Stuns people at a distance, removing their linear velocity
|
|
|
|
extends "res://scripts/player.gd"
|
|
|
|
onready var destroy_ability = get_node("MasterOnly/Destroy")
|
|
|
|
var stun_charge = 1
|
|
var velocity_charge = 10 # This one is instantaneous, so it gets quita weight
|
|
|
|
var zoom_factor = 3
|
|
var sens_factor = 10
|
|
|
|
# --- Godot overrides ---
|
|
|
|
func _ready():
|
|
colored_meshes.append("Yaw/Pitch/Beam")
|
|
|
|
func _process(delta):
|
|
if is_network_master():
|
|
|
|
var stun = Input.is_action_pressed("hero_4_stun")
|
|
var is_stunning = false
|
|
|
|
if Input.is_action_just_pressed("hero_4_zoom"):
|
|
get_node("TPCamera").cam_fov /= zoom_factor
|
|
get_node("TPCamera").cam_view_sensitivity /= sens_factor
|
|
get_node("TPCamera").cam_smooth_movement = false
|
|
if Input.is_action_just_released("hero_4_zoom"):
|
|
get_node("TPCamera").cam_fov *= zoom_factor
|
|
get_node("TPCamera").cam_view_sensitivity *= sens_factor
|
|
get_node("TPCamera").cam_smooth_movement = true
|
|
|
|
var looking_at = pick()
|
|
if looking_at and looking_at.has_method("destroy"):
|
|
destroy_ability.cost = looking_at.destroy_cost
|
|
destroy_ability.disabled = false
|
|
if Input.is_action_just_pressed("primary_ability"):
|
|
if charge > looking_at.destroy_cost:
|
|
build_charge(-looking_at.destroy_cost)
|
|
looking_at.rpc("destroy")
|
|
else:
|
|
destroy_ability.disabled = true
|
|
|
|
if stun:
|
|
var players = get_node("/root/Level/Players").get_children()
|
|
var player = pick_from(players)
|
|
if player != -1:
|
|
# We get charge for just stunning, plus charge for how much linear velocity we cut out
|
|
build_charge(stun_charge * delta)
|
|
build_charge(velocity_charge * players[player].linear_velocity.length() * delta)
|
|
rpc("stun", players[player].get_name(), get_node("TPCamera/Camera/Ray").get_collision_point())
|
|
is_stunning = true
|
|
|
|
if not is_stunning:
|
|
rpc("unstun")
|
|
|
|
# --- Player overrides ---
|
|
|
|
# --- Own ---
|
|
|
|
sync func stun(net_id, position):
|
|
# Stun the thing!
|
|
var player = util.get_player(net_id)
|
|
player.set_linear_velocity(Vector3())
|
|
|
|
# Show the beam!
|
|
var beam = get_node("Yaw/Pitch/Beam")
|
|
get_node("Yaw/Pitch").look_at(position, Vector3(0,1,0))
|
|
beam.show()
|
|
var us = get_node("TPCamera/Camera").get_global_transform().origin
|
|
var distance = position - us
|
|
beam.scale = Vector3(1,distance.length(),1)
|
|
# We move the beam up by half the scale because the position is based on the center, not the bottom
|
|
beam.translation.z = -distance.length() / 2 # We face -z direction
|
|
|
|
sync func unstun():
|
|
var beam = get_node("Yaw/Pitch/Beam")
|
|
beam.hide()
|
|
|