254 lines
7.6 KiB
GDScript3
254 lines
7.6 KiB
GDScript3
extends VehicleBody
|
|
export var parked: bool = false
|
|
|
|
# Declare member variables here. Examples:
|
|
# var a = 2
|
|
# var b = "text"
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
var front_radius = 0.36
|
|
var back_radius = 0.34
|
|
var wheel_travel = 0.08
|
|
var wheel_stifness = 40.0
|
|
var rest_length = 0.08
|
|
#var wheel_max_force = 24000
|
|
var wheel_compression_damping = 0.88
|
|
var wheel_relaxation_damping = 0.99
|
|
var marker_fl_seat
|
|
var marker_fr_seat
|
|
|
|
var marker_info = {
|
|
"marker_front_left_door": {
|
|
"method": "open_door",
|
|
"door": "lf",
|
|
"show": ["marker_front_left_vehicleseat"]
|
|
},
|
|
"marker_front_right_door": {
|
|
"method": "open_door",
|
|
"door": "rf",
|
|
"show": ["marker_front_right_vehicleseat"]
|
|
},
|
|
"marker_trunk_door": {
|
|
"method": "open_door",
|
|
"door": "trunk"
|
|
},
|
|
"marker_front_left_vehicleseat": {
|
|
"method": "sit_player_into_vehicle",
|
|
"seat": "lf",
|
|
"see_through": true,
|
|
"show": ["marker_exit"],
|
|
"hide": ["marker_trunk_door", "marker_front_left_vehicleseat"]
|
|
},
|
|
"marker_front_right_vehicleseat": {
|
|
"method": "sit_player_into_vehicle",
|
|
"seat": "rf",
|
|
"see_through": true,
|
|
"show": ["marker_exit"],
|
|
"hide": ["marker_trunk_door", "marker_front_right_vehicleseat"]
|
|
},
|
|
"marker_exit": {
|
|
"method": "get_player_out_of_vehicle",
|
|
"seat": "rf",
|
|
"see_through": true,
|
|
"show": ["marker_trunk_door"]
|
|
}
|
|
}
|
|
func _init():
|
|
add_to_group("vehicles")
|
|
func _ready():
|
|
mass = 1800
|
|
brake = 1000
|
|
engine_force = 0
|
|
for e in get_children():
|
|
if e is VehicleWheel:
|
|
if e.name.begins_with("front") || e.name.ends_with("front"):
|
|
e.wheel_radius = front_radius
|
|
e.use_as_steering = true
|
|
e.use_as_traction = false
|
|
elif e.name.begins_with("back") || e.name.ends_with("back"):
|
|
e.wheel_radius = back_radius
|
|
e.use_as_steering = false
|
|
e.use_as_traction = true
|
|
e.suspension_travel = wheel_travel
|
|
e.suspension_stiffness = wheel_stifness
|
|
e.suspension_max_force = 32.0 * mass / 4.0
|
|
e.damping_compression = wheel_compression_damping
|
|
e.damping_relaxation = wheel_relaxation_damping
|
|
e.wheel_rest_length = rest_length
|
|
e.wheel_friction_slip = 1.5
|
|
if parked:
|
|
mode = RigidBody.MODE_KINEMATIC
|
|
doors.register_door(self, "lf", $"car_base/front_left_rot", Vector3.UP, 0, -PI/2.0, 2.0)
|
|
doors.register_door(self, "rf", $"car_base/front_right_rot", Vector3.UP, 0, PI/2.0, 2.0)
|
|
doors.register_door(self, "trunk", $"car_base/trunk_door_rot", Vector3.RIGHT, 0, PI/2.0, 2.0)
|
|
markers.init_markers(self, marker_info)
|
|
# var marker_lf = $"car_base/front_left_rot/left-front-door/marker_front_left_door"
|
|
# var marker_data_lf = {}
|
|
# marker_data_lf.obj = self
|
|
# marker_data_lf.method = "open_door"
|
|
# marker_data_lf.door = "lf"
|
|
# marker_lf.set_meta("marker_data", marker_data_lf)
|
|
# var marker_rf = $"car_base/front_right_rot/right-front-door/marker_front_right_door"
|
|
# var marker_data_rf = {}
|
|
# marker_data_rf.obj = self
|
|
# marker_data_rf.method = "open_door"
|
|
# marker_data_rf.door = "rf"
|
|
# marker_rf.set_meta("marker_data", marker_data_rf)
|
|
# var marker_trunk = $"car_base/trunk_door_rot/trunk_door/marker_trunk_door"
|
|
# var marker_data_trunk = {}
|
|
# marker_data_trunk.obj = self
|
|
# marker_data_trunk.method = "open_door"
|
|
# marker_data_trunk.door = "trunk"
|
|
# marker_trunk.set_meta("marker_data", marker_data_trunk)
|
|
#
|
|
# marker_fl_seat = $"car_base/seat-frame/seats/marker_front_left_vehicleseat"
|
|
# var marker_data_fl_seat = {}
|
|
# marker_data_fl_seat.obj = self
|
|
# marker_data_fl_seat.method = "sit_player_into_vehicle"
|
|
# marker_data_fl_seat.seat = "lf"
|
|
# marker_data_fl_seat.see_through = true
|
|
# marker_fl_seat.set_meta("marker_data", marker_data_fl_seat)
|
|
# marker_fl_seat.hide()
|
|
#
|
|
# marker_fr_seat = $"car_base/seat-frame/seats/marker_front_right_vehicleseat"
|
|
# var marker_data_fr_seat = {}
|
|
# marker_data_fr_seat.obj = self
|
|
# marker_data_fr_seat.method = "sit_player_into_vehicle"
|
|
# marker_data_fr_seat.seat = "rf"
|
|
# marker_data_fr_seat.see_through = true
|
|
# marker_fr_seat.set_meta("marker_data", marker_data_fr_seat)
|
|
# marker_fr_seat.hide()
|
|
## for e in [$marker_exit1_exit, $marker_exit2_exit]:
|
|
# var md = {}
|
|
# md.obj = self
|
|
# md.method = "player_leave_vehicle"
|
|
# md.see_through = true
|
|
# e.set_meta("marker_data", md)
|
|
# e.hide()
|
|
|
|
func show_markers(data):
|
|
if data.has("show"):
|
|
for e in data.show:
|
|
if marker_info[e].has("marker_obj"):
|
|
marker_info[e].marker_obj.show()
|
|
if data.has("hide"):
|
|
for e in data.hide:
|
|
if marker_info[e].has("marker_obj"):
|
|
marker_info[e].marker_obj.hide()
|
|
func hide_markers(data):
|
|
if data.has("show"):
|
|
print("show", data.show)
|
|
for e in data.show:
|
|
if marker_info[e].has("marker_obj"):
|
|
marker_info[e].marker_obj.hide()
|
|
if data.has("hide"):
|
|
print("hide ", data.hide)
|
|
for e in data.hide:
|
|
if marker_info[e].has("marker_obj"):
|
|
marker_info[e].marker_obj.show()
|
|
|
|
|
|
func open_door(data):
|
|
var door = data.door
|
|
if doors.get_state(self, door) == 0:
|
|
print("CLOSED, openning")
|
|
show_markers(data)
|
|
doors.open_door(self, door)
|
|
# if door == "lf":
|
|
# marker_fl_seat.show()
|
|
# elif door == "rf":
|
|
# marker_fr_seat.show()
|
|
elif doors.get_state(self, door) == 1:
|
|
print("OPEN, closing")
|
|
hide_markers(data)
|
|
doors.close_door(self, door)
|
|
# if door == "lf":
|
|
# marker_fl_seat.hide()
|
|
# elif door == "rf":
|
|
# marker_fr_seat.hide()
|
|
func sit_to_vehicle(ch: KinematicBody, seat:Spatial, drive: bool = true):
|
|
# ch.add_collision_exception_with(self)
|
|
# add_collision_exception_with(ch)
|
|
var cmdqueue
|
|
if drive:
|
|
cmdqueue = [["vehicle_mode_on"], ["jumpto", seat.global_transform], ["parent_to_vehicle"], ["anim_state", "drive"]]
|
|
else:
|
|
cmdqueue = [["vehicle_mode_on"], ["jumpto", seat.global_transform], ["parent_to_vehicle"], ["anim_state", "passenger"]]
|
|
ch.set_meta("vehicle", self)
|
|
ch.set_meta("cmdqueue", cmdqueue)
|
|
ch.set_meta("seat", seat)
|
|
if drive:
|
|
set_meta("driver", ch)
|
|
var ch_parent = ch.get_parent()
|
|
ch.set_meta("orig_parent", ch_parent)
|
|
func leave_vehicle(ch):
|
|
ch.remove_meta("orig_parent")
|
|
var cmdqueue = [["anim_state", "locomotion"], ["vehicle_mode_off"]]
|
|
ch.set_meta("cmdqueue", cmdqueue)
|
|
|
|
|
|
func sit_player_into_vehicle(data):
|
|
print("SIT: ", data.seat)
|
|
show_markers(data)
|
|
var ch: KinematicBody = get_viewport().get_camera().get_meta("player")
|
|
var seat: Spatial
|
|
var drive = false
|
|
match data.seat:
|
|
"lf":
|
|
drive = true
|
|
seat = $"car_base/seat-frame/seats/marker_front_left_vehicleseat"
|
|
"rf":
|
|
seat = $"car_base/seat-frame/seats/marker_front_right_vehicleseat"
|
|
# for e in [$marker_exit1_exit, $marker_exit2_exit]:
|
|
# e.show()
|
|
sit_to_vehicle(ch, seat, drive)
|
|
func get_player_out_of_vehicle(data):
|
|
print("EXIT: ", data.seat)
|
|
hide_markers(data)
|
|
var ch: KinematicBody = get_viewport().get_camera().get_meta("player")
|
|
leave_vehicle(ch)
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
#var d = 1.0
|
|
#var state = 0
|
|
func _process(delta):
|
|
if parked:
|
|
mode = RigidBody.MODE_KINEMATIC
|
|
return
|
|
# if engine_force > 1000.0 && linear_velocity.length() < 0.1:
|
|
# apply_central_impulse(global_transform.basis.y * mass * 1 + global_transform.basis.z * mass * 5)
|
|
# if d > 0:
|
|
# engine_force = 3000.0
|
|
# brake = 0
|
|
# d -= delta
|
|
# else:
|
|
# state = (state + 1) % 4
|
|
# d = 1.0
|
|
# match state:
|
|
# 0:
|
|
# engine_force = 6000
|
|
# steering = 0
|
|
# 1:
|
|
# steering = -0.4
|
|
# engine_force = 6000
|
|
# 2:
|
|
# engine_force = 6000
|
|
# steering = 0
|
|
# 3:
|
|
# engine_force = 6000
|
|
# steering = -0.4
|
|
func is_upright():
|
|
var v = global_transform.basis.y
|
|
if v.y > v.x && v.y > v.z:
|
|
return true
|
|
return false
|
|
func _physics_process(delta):
|
|
if is_upright():
|
|
if abs(engine_force) > 0 && linear_velocity.y * delta > 0.05:
|
|
add_central_force(Vector3(0, -linear_velocity.y * delta * mass, 0))
|
|
var l = linear_velocity.length() * delta
|
|
add_central_force(Vector3(0, -l * 0.5 * mass, 0))
|