Files
academy2-game/scenes/vehicles/car.gd
Segey Lapin 3a1eaa721e Added car
2021-10-26 22:05:29 +03:00

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))