248 lines
6.4 KiB
GDScript
248 lines
6.4 KiB
GDScript
extends Node
|
|
|
|
class_name Player
|
|
|
|
const MAX_SPEED:float = 0.2
|
|
|
|
const START_OFFSET = [1.70223, 1.20223, 0.702227, 0.202227 ]
|
|
const LANE_OFFSET = [-0.085, 0.085, -0.255, 0.255 ]
|
|
|
|
export var player_color:Color
|
|
var player_name:String
|
|
|
|
var thrust:int = 0
|
|
var current_speed:float = 0.0
|
|
|
|
export var speed_factor:float = 0.001
|
|
export var brake_factor:float = 2.0
|
|
export var friction_brake_factor:float = 0.8
|
|
|
|
onready var race_car = get_node("Path/PathFollow/raceCar")
|
|
onready var timer:Timer = get_node("ResetTimer")
|
|
onready var path:Path = get_node("Path")
|
|
onready var follow:PathFollow = get_node("Path/PathFollow")
|
|
onready var route:Route
|
|
|
|
var lane:int
|
|
|
|
var start_init:bool = true
|
|
var has_next:bool = false
|
|
var is_resetable:bool = false
|
|
var buffered_curve:Curve3D
|
|
var buffered_translate:Vector3 = Vector3(0,0,0)
|
|
var buffered_rotation:Vector3 = Vector3(0,0,0)
|
|
var last_rotation:Vector3 = Vector3(0,0,0)
|
|
var torque_penalty:Vector3
|
|
var force_penalty:Vector3
|
|
var path_penalty:float
|
|
|
|
var is_out:bool = false
|
|
var position:Vector2
|
|
|
|
puppet var slave_position:Vector2
|
|
|
|
|
|
func _ready():
|
|
route = gamestate.game.route
|
|
race_car.road_ray.set_collision_mask_bit(get_index(),1)
|
|
path.curve = path.curve.duplicate()
|
|
path.curve.set_bake_interval(0.05)
|
|
|
|
|
|
func _physics_process(delta):
|
|
if is_network_master():
|
|
if not is_out:
|
|
var max_speed = MAX_SPEED
|
|
|
|
if get_road() != null:
|
|
var road = get_road()
|
|
if is_in_group("first"):
|
|
max_speed *= road.get_first_speed_factor()
|
|
elif road.get_creator() == get_index():
|
|
max_speed *= road.get_creator_speed_factor()
|
|
else:
|
|
max_speed *= road.get_chasers_speed_factor()
|
|
|
|
if thrust == 1:
|
|
current_speed += speed_factor
|
|
elif thrust == -1:
|
|
current_speed -= speed_factor * brake_factor
|
|
else:
|
|
current_speed -= speed_factor * friction_brake_factor
|
|
|
|
if current_speed >= max_speed:
|
|
current_speed = max_speed
|
|
elif current_speed < 0:
|
|
current_speed = 0
|
|
|
|
follow.set_offset(follow.get_offset() + current_speed)
|
|
|
|
if follow.get_offset() < 0:
|
|
follow.set_offset(0)
|
|
|
|
if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0):
|
|
has_next = false
|
|
if path.curve.get_point_count() > 0:
|
|
path.curve.clear_points()
|
|
|
|
path.curve.set_bake_interval(0.05)
|
|
for i in range(buffered_curve.get_point_count()):
|
|
var _pos = buffered_curve.get_point_position(i)
|
|
var _in = buffered_curve.get_point_in(i)
|
|
var _out = buffered_curve.get_point_out(i)
|
|
if buffered_rotation.length() != 0:
|
|
_pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length())
|
|
_in = _in.rotated(buffered_rotation.normalized(), buffered_rotation.length())
|
|
_out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length())
|
|
path.curve.add_point(buffered_translate + _pos, _in, _out)
|
|
path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i))
|
|
if not start_init:
|
|
follow.set_offset(0.001)
|
|
else:
|
|
follow.set_offset(START_OFFSET[lane])
|
|
start_init = false
|
|
if get_road() != null:
|
|
var road = get_road()
|
|
var penalty_index = road.penalty_index(follow.get_offset(), current_speed)
|
|
|
|
if penalty_index >= 0:
|
|
torque_penalty = road.get_torque_penalty(penalty_index)
|
|
force_penalty = road.get_force_penalty(penalty_index)
|
|
path_penalty = road.get_path_penalty(penalty_index)
|
|
rpc("set_out")
|
|
|
|
check_position()
|
|
else:
|
|
var road = get_road()
|
|
race_car.get_node("ray").set_enabled(false)
|
|
if force_penalty.length() != 0:
|
|
race_car.move_and_slide(force_penalty * current_speed + Vector3(0,-0.5,0))
|
|
if torque_penalty.length() != 0:
|
|
race_car.rotate_object_local(torque_penalty.normalized(), torque_penalty.length() * current_speed)
|
|
if path_penalty > 0 && follow.get_offset() > 0.0:
|
|
follow.set_offset(follow.get_offset() - 0.01)
|
|
path_penalty -= 0.01
|
|
current_speed -= 0.0002
|
|
if current_speed < 0:
|
|
current_speed = 0
|
|
else:
|
|
position = slave_position
|
|
|
|
|
|
func get_road():
|
|
return race_car.road
|
|
|
|
|
|
func _on_raceCar_road_entered(road):
|
|
|
|
var prev_road = route.get_road(road.get_index()-1)
|
|
if prev_road != null:
|
|
prev_road.body.set_collision_layer_bit(get_index(),0)
|
|
|
|
buffered_curve = road.get_lane_curve(lane)
|
|
|
|
buffered_rotation = last_rotation
|
|
|
|
if path.curve.get_point_count() > 0:
|
|
buffered_translate = util.curve_get_last_point(path.curve)
|
|
|
|
if road.get_end_rotation().length() != 0:
|
|
last_rotation += road.get_end_rotation()
|
|
|
|
has_next = true
|
|
|
|
|
|
func get_player_name():
|
|
return player_name
|
|
|
|
|
|
func set_player_name(new_name):
|
|
player_name = new_name
|
|
|
|
|
|
func get_player_color():
|
|
return player_color
|
|
|
|
|
|
func set_player_color(new_color):
|
|
player_color = new_color
|
|
var material = SpatialMaterial.new()
|
|
material.set_albedo(player_color)
|
|
race_car.get_node("body").set_surface_material(1,material)
|
|
|
|
|
|
func is_out():
|
|
return is_out
|
|
|
|
|
|
remotesync func set_out():
|
|
is_out = true
|
|
is_resetable = false
|
|
timer.start()
|
|
|
|
|
|
remotesync func set_in():
|
|
is_out = false
|
|
is_resetable = false
|
|
|
|
|
|
remotesync func set_first(is_first:bool):
|
|
if get_tree().get_rpc_sender_id() == 0 || get_tree().get_rpc_sender_id() == get_network_master():
|
|
if is_first:
|
|
add_to_group("first")
|
|
else:
|
|
remove_from_group("first")
|
|
|
|
|
|
master func check_position():
|
|
position = Vector2(race_car.road_index, follow.get_offset())
|
|
rset("slave_position", position)
|
|
|
|
|
|
master func set_thrust(new_thrust:int):
|
|
var sender_id = get_tree().get_rpc_sender_id()
|
|
if is_network_master() || gamestate.game.get_player_by_network_id(sender_id) == self && [-1,0,1].has(new_thrust):
|
|
thrust = new_thrust
|
|
|
|
|
|
master func reset():
|
|
var sender_id = get_tree().get_rpc_sender_id()
|
|
if (is_network_master() || gamestate.game.get_player_by_network_id(sender_id) == self) && is_resetable:
|
|
has_next = false
|
|
current_speed = 0
|
|
|
|
var road = race_car.road
|
|
road.body.set_collision_layer_bit(get_index(),1)
|
|
|
|
var reset_index = road.reset_index
|
|
for i in range(reset_index):
|
|
road = route.get_road(road.get_index() - 1)
|
|
road.body.set_collision_layer_bit(get_index(),1)
|
|
|
|
path.curve.clear_points()
|
|
|
|
force_penalty = Vector3(0,0,0)
|
|
torque_penalty = Vector3(0,0,0)
|
|
|
|
buffered_translate = road.get_translation()
|
|
last_rotation = road.get_rotation()
|
|
|
|
race_car.road_index = road.get_index()
|
|
race_car.road = null
|
|
race_car.collider = null
|
|
race_car.transform = Transform()
|
|
race_car.get_node("ray").set_enabled(true)
|
|
|
|
follow.set_transform(road.get_transform())
|
|
|
|
rpc("set_in")
|
|
|
|
|
|
func set_start(new_lane:int):
|
|
lane = new_lane
|
|
follow.set_h_offset(LANE_OFFSET[lane])
|
|
|
|
|
|
func _on_ResetTimer_timeout():
|
|
is_resetable = true
|