|
extends "res://scripts/player.gd"
|
|
|
|
onready var placement = preload("res://scripts/placement.gd").new(self, "res://scenes/heroes/5_portal.tscn")
|
|
onready var portal_ability = get_node("MasterOnly/Portal")
|
|
onready var teleport_ability = get_node("MasterOnly/Teleport")
|
|
|
|
var radius = 15
|
|
# The spaces make the bracket centered, rather than on of the dots
|
|
var first_crosshair = " [..."
|
|
var second_crosshair = "...] "
|
|
var no_portal_crosshair = "+"
|
|
|
|
var flicking = null
|
|
var flick_charge = 3
|
|
var flick_strength = 4
|
|
|
|
# --- Godot overrides ---
|
|
|
|
func _ready():
|
|
placement.start_action = "hero_5_place_portal"
|
|
placement.confirm_action = "hero_5_confirm_portal"
|
|
placement.delete_action = "hero_5_remove_portal"
|
|
placement.max_placed = 100
|
|
set_process_input(true)
|
|
|
|
func _process(delta):
|
|
if is_network_master():
|
|
var is_second = placement.placed.size() % 2 != 0
|
|
var portal_crosshair = second_crosshair if is_second else first_crosshair
|
|
var crosshair = no_portal_crosshair if charge < portal_ability.cost else portal_crosshair
|
|
get_node("MasterOnly/Crosshair").set_text(crosshair)
|
|
var can_build = charge > portal_ability.cost
|
|
if placement.place_input(radius, can_build, true) and is_second:
|
|
build_charge(-portal_ability.cost)
|
|
|
|
teleport_ability.disabled = placement.placed.size() <= 1
|
|
|
|
func _input(event):
|
|
flick_input()
|
|
|
|
func _exit_tree():
|
|
._exit_tree()
|
|
if placement:
|
|
placement.clear()
|
|
|
|
# --- Player overrides ---
|
|
|
|
# --- Own ---
|
|
|
|
func flick_input():
|
|
if Input.is_action_just_pressed("primary_mouse"):
|
|
var pick = pick_by_friendly(false)
|
|
if pick:
|
|
flicking = pick
|
|
if flicking and Input.is_action_just_released("primary_mouse"):
|
|
var aim = get_node("Yaw/Pitch").get_global_transform().basis
|
|
var forwards = -aim[2]
|
|
var distance = (flicking.translation - translation).length()
|
|
forwards *= distance
|
|
var towards = translation + forwards
|
|
var gravity = PhysicsServer.area_get_param(get_world().get_space(), PhysicsServer.AREA_PARAM_GRAVITY_VECTOR)
|
|
# Automatically account for gravity, so as to make UI more intuitive
|
|
towards -= gravity
|
|
rpc("flick", flicking.get_name(), towards)
|
|
flicking = null
|
|
build_charge(flick_charge)
|
|
|
|
sync func flick(player_id, towards):
|
|
var who = util.get_player(player_id)
|
|
if who.is_network_master():
|
|
var direction = towards - who.translation
|
|
var impulse = direction.normalized() * flick_strength * who.get_mass()
|
|
who.apply_impulse(Vector3(), impulse)
|
|
|