1
Fork 0
mirror of https://github.com/Steffo99/pineapple-surf.git synced 2024-11-23 00:04:20 +00:00
pineapple-surf/player/player.gd

154 lines
4.1 KiB
GDScript3
Raw Normal View History

extends CharacterBody3D
class_name Player
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
const MOUSE_SENSITIVITY = 2.25
const MAX_AIR_WISH_SPEED = 20
const AIR_ACCELERATE = 100 # Hu/39.97
@onready var head: Node3D = $Head
@onready var camera: Camera3D = head.get_node("Viewport/CameraViewportContainer/GameViewport/Camera")
@onready var vport: SubViewport = head.get_node("Viewport/CameraViewportContainer/GameViewport")
@onready var aim_raycast: RayCast3D = head.get_node("RayCast3D")
@onready var torch: SpotLight3D = head.get_node("Torch")
@onready var OnHand = head.get_node("OnHand")
@onready var active_weapon: BaseWeapon:
get: return OnHand.active_weapon
# DEBUG NODES
@onready var debug_speed_label = $HUD/Speed_Label
var last_frame_input_data: PlayerInputData = PlayerInputData.new()
var input_data: PlayerInputData = PlayerInputData.new()
var mouse_movement: Vector2 = Vector2.ZERO
var mouse_enabled: bool = true
var last_ground_velocity: Vector2 = Vector2.ZERO
# Get the gravity from the project settings to be synced with RigidDynamicBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
# ===== UTILS =====
func _get_2d_velocity() -> Vector2:
return Vector2(velocity.x, velocity.z)
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
OnHand.player = self
# vport.size = DisplayServer.window_get_size()
vport.size = Vector2(426, 240)
# for item in OnHand.get_children():
# if item is BaseWeapon:
# item.player = self
func _process(delta):
pass
func _physics_process(delta):
last_frame_input_data = input_data
input_data = PlayerInputData.new()
if mouse_movement:
self.rotate_y(self.mouse_movement.y * -1 * delta * MOUSE_SENSITIVITY)
var x_rotation = self.mouse_movement.x * -1 * delta * MOUSE_SENSITIVITY
head.rotation.x = clamp(head.rotation.x + x_rotation, deg_to_rad(-90), deg_to_rad(90))
self.mouse_movement = Vector2.ZERO
var jumping = false
# Add the gravity.
if not is_on_floor():
velocity.y -= gravity * delta
else:
last_ground_velocity = Vector2(velocity.x, velocity.z)
# Handle Jump
if Input.is_action_pressed("jump") and is_on_floor():
jumping = true
velocity.y = JUMP_VELOCITY
# Get the input direction and handle the movement/deceleration.
var input_dir = Input.get_vector("left", "right", "forward", "backwards")
var based = (transform.basis * Vector3(input_dir.x, 0, input_dir.y))
var direction = based.normalized()
if is_on_floor() and not jumping:
if direction:
velocity.x = direction.x * SPEED
velocity.z = direction.z * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
velocity.z = move_toward(velocity.z, 0, SPEED)
else:
_air_accelerate(direction, based.length(), AIR_ACCELERATE, delta)
# Apply camera effects
var camera_yaw := 0
var current_speed := _get_2d_velocity().length()
if is_on_floor() and current_speed > 0:
camera_yaw = -clamp(_get_2d_velocity().length() * input_dir.x, -25, 25)
else:
camera_yaw = 0
self.camera.global_transform = self.head.global_transform
# camera.rotation.z = move_toward(
# 0,
# camera_yaw,
# delta
# ) * 2.5
debug_speed_label.text = "%0.2f" % current_speed
move_and_slide()
func _air_accelerate(wish_dir: Vector3, wish_speed: float, airaccelerate: float, delta_time: float):
var addspeed: float = 0
var accelspeed: float = 0
var currentspeed: float = 0
if wish_speed > MAX_AIR_WISH_SPEED:
wish_speed = MAX_AIR_WISH_SPEED
currentspeed = velocity.dot(wish_dir)
addspeed = wish_speed - currentspeed
if addspeed <= 0:
return
accelspeed = airaccelerate * delta_time * wish_speed
if accelspeed > addspeed:
accelspeed = addspeed
velocity += accelspeed * wish_dir
func wall_running() -> bool:
if is_on_wall_only():
if Input.is_action_pressed("jump"):
var wall_normal := get_wall_normal()
var bas = transform.basis * velocity
velocity.y /= 2
return true
return false
func _input(event):
if event is InputEventKey and event.keycode == KEY_ESCAPE:
get_tree().quit()
if Input.is_action_just_pressed("toggle_torch"):
torch.visible = !torch.visible
if event is InputEventMouseMotion:
var vec = event.relative
self.mouse_movement = Vector2(vec.y / 10, vec.x / 10)