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 switch_charge < portal_ability.cost else portal_crosshair get_node("MasterOnly/Crosshair").set_text(crosshair) var can_build = switch_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)