extends VehicleBody export var MAX_SPEED = 200.0 export var MAX_ENGINE_FORCE = 100.0 export var MAX_BRAKE_FORCE = 15.0 export var MAX_STEER_ANGLE = 0.5 export var steer_speed = 0.5 export var brake_factor = 0.1 puppet var slave_transform = Transform() puppet var slave_velocity = Vector3() puppet var slave_steering = 0.0 var steer_target = 0.0 var steer_angle = 0.0 var had_throttle_or_brake_input = false var is_reverse = false func _physics_process(delta): if (is_network_master()): var current_speed_mps = get_linear_velocity().length() var current_speed_kph = floor(current_speed_mps * 3.6) get_node("HUD/speed").text = String(current_speed_kph) + " kph" var steer_val = 0.0 var throttle_val = 0.0 var brake_val = 0.0 if (throttle_val < 0.0): throttle_val = 0.0 if (brake_val < 0.0): brake_val = 0.0 # overrules for keyboard if Input.is_action_pressed("ui_up") && current_speed_kph <= MAX_SPEED: throttle_val = 1.0 if Input.is_action_pressed("ui_down"): brake_val = 1.0 if Input.is_action_pressed("ui_left"): steer_val = 1.0 elif Input.is_action_pressed("ui_right"): steer_val = -1.0 # check if we need to be in reverse if (had_throttle_or_brake_input == false and brake_val > 0.0 and current_speed_mps < 1.0): had_throttle_or_brake_input = true is_reverse = true elif (throttle_val > 0.0 or brake_val > 0.0): had_throttle_or_brake_input = true else: is_reverse = false had_throttle_or_brake_input = false if (is_reverse): var swap = throttle_val throttle_val = -brake_val brake_val = -swap elif (throttle_val == 0.0 and brake_val == 0.0 and current_speed_mps < 3.0): brake_val = brake_factor engine_force = throttle_val * MAX_ENGINE_FORCE brake = brake_val * MAX_BRAKE_FORCE steer_target = steer_val * MAX_STEER_ANGLE if (steer_target < steer_angle): steer_angle -= steer_speed * delta if (steer_target > steer_angle): steer_angle = steer_target elif (steer_target > steer_angle): steer_angle += steer_speed * delta if (steer_target < steer_angle): steer_angle = steer_target steering = steer_angle rset_unreliable("slave_transform", get_global_transform()) rset_unreliable("slave_velocity", get_linear_velocity()) rset_unreliable("slave_steering", steer_angle) else: set_global_transform(slave_transform) set_linear_velocity(slave_velocity) steering = slave_steering func set_color(new_color): for i in range(get_node("body").get_surface_count()): var material = get_node("body").surface_get_material(i) var albedo = material.get_shader_param("albedo") albedo.color = new_color