659 lines
22 KiB
GDScript
659 lines
22 KiB
GDScript
extends CharacterBody3D
|
|
|
|
const JUMP_VELOCITY = 5
|
|
const WALK_TRANSITION_SPEED = 7
|
|
const MAX_AIR_DASH = 1
|
|
const FLASHLIGHT_BRIGHTNESS = 30
|
|
const KICK_AMOUNT = 20
|
|
const LAND_CAMERA_TILT : Vector3 = Vector3(-1,0,0)
|
|
const WALK_SPEED = 12.0
|
|
const CROUCH_SPEED = 3.0
|
|
const SPRINT_SPEED = 15.0
|
|
const DASH_SPEED = 40
|
|
const CROUCHED_POS = Vector3(0,-.1,0)
|
|
const STAND_POS = Vector3(0,0.889,0)
|
|
const SLOWSPEED = .1
|
|
const MAX_STAMINA : float = 100
|
|
const STAMINA_DRAIN = 20
|
|
const HEAD_TILT_AMT = .06
|
|
const BOB_FREQ = 1.7
|
|
const BOB_AMP = 0.1
|
|
const ADS_POS = Vector3(0,-.05,-.45)
|
|
|
|
#JOYSTICK SETTINGS
|
|
const JOYSTICK_SENSITIVITY = .06
|
|
var adj_sensitivity = JOYSTICK_SENSITIVITY
|
|
const R_JOYSTICK_DEADZONE = 0.1
|
|
const L_JOYSTICK_DEADZONE = .2
|
|
const L_JOYSTICK_SENSITIVITY = .1
|
|
|
|
var speed
|
|
var double_jump = true
|
|
var air_dash = MAX_AIR_DASH
|
|
var gravity = 9.8
|
|
var is_climbing = false
|
|
var ladder_center
|
|
var default_gravity = gravity
|
|
var moving_fast = false
|
|
var moving_fast_top_speed = 0.0
|
|
var mouse_input : Vector2
|
|
var ads : bool
|
|
|
|
@export_group("Game Settings")
|
|
@export var AUDIO = true
|
|
@export_group("Player Movement")
|
|
|
|
@export var DASH_STAM_REQ = 10
|
|
@export var SENSITIVITY = .01
|
|
@export var sensitivity_shift = true
|
|
var start_sensitivity
|
|
@export_subgroup("Head Bob & Gun Sway")
|
|
@export var t_bob = 1.0
|
|
@export var weapon_holder : Node3D
|
|
@export var weapon_sway_amount : float = .09
|
|
@export var weapon_rotation_amount : float = .07
|
|
@export_subgroup("FOV")
|
|
@export var BASE_FOV : float = 80
|
|
@export var FOV_CHANGE = 1.5
|
|
|
|
var gun : Node
|
|
@onready var dead_player : Resource = load("res://assets/dead_cam.tscn")
|
|
@onready var pause_menu: Control = $Head/Recoil/Camera3D/PauseMenu
|
|
@onready var gun_ray = $Head/Recoil/Camera3D/GunRay
|
|
@onready var level_control = get_tree().current_scene
|
|
@onready var interact_ray = $Head/Recoil/Camera3D/InteractRay
|
|
@onready var bullet_ray = $Head/Recoil/Camera3D/BulletRay
|
|
@onready var hitmarker = load("res://hitmarker.tscn")
|
|
var instance_bullet
|
|
var instance_casing
|
|
var instance_mag
|
|
var reloading = false
|
|
var ammo
|
|
var ammo_reserve
|
|
var bullet_damage
|
|
var def_weapon_holder_pos : Vector3
|
|
var weapon_holder_start_rot
|
|
var weapon_holder_start_pos
|
|
var gun_folded = false
|
|
var recoiling_fade = 0
|
|
var bullet_destination
|
|
var gun_fire_pitch_starting
|
|
var current_weapon_index
|
|
var recoiling = false
|
|
var dead = false
|
|
var hud_visible : bool = true
|
|
var held_item : Node
|
|
var held_item_linear_damp_cache
|
|
var held_item_angular_damp_cache
|
|
var held_item_gravity_cache
|
|
var held_item_mass_cache
|
|
var held_item_collision_cache
|
|
var hold_offset
|
|
var held_item_rotation = Vector3(0,0,0)
|
|
var gamespeed_controlled = false
|
|
var crouched = false
|
|
var flashlight_on : bool = false
|
|
|
|
##CACHED VARS
|
|
var weapon_start_pos
|
|
|
|
# Slow Down Variables
|
|
var remaining_stamina : float = MAX_STAMINA
|
|
# Pickups
|
|
var picked_up = false
|
|
var picked_up_text
|
|
var pickup_announce = load("res://assets/pickup_announce.tscn")
|
|
var dead_announce = load("res://assets/dead_announce.tscn")
|
|
var pickupmsg
|
|
var controlled_elsewhere = false
|
|
|
|
@onready var crosshair = $Head/Recoil/Camera3D/Crosshair
|
|
@onready var head = $Head
|
|
@onready var camera = $Head/Recoil/Camera3D
|
|
@onready var world_environment = $"../WorldEnvironment"
|
|
@onready var pickup_sound = $Audio/PickupSound
|
|
@onready var ear_wind = $Audio/EarWind
|
|
@onready var land_sound: AudioStreamPlayer = $Audio/LandSound
|
|
@onready var hurt_audio = $Audio/Hurt
|
|
@onready var hit_indicator: AudioStreamPlayer = $Audio/HitIndicator
|
|
@onready var health_indicator = $HealthIndicator
|
|
@onready var ammo_counter = $Head/Recoil/Camera3D/AmmoCounter
|
|
@onready var stamina_counter = $Head/Recoil/Camera3D/StaminaCounter
|
|
@onready var recoil: Node3D = $Head/Recoil
|
|
@onready var weapon_spawner = $Head/Recoil/Camera3D/WeaponHolder/WeaponSpawner
|
|
@onready var pick_up_detection = $pick_up_detection
|
|
@onready var item_holder: Node3D = $Head/ItemHolder
|
|
@onready var flashlight: SpotLight3D = $Head/Recoil/Camera3D/WeaponHolder/Flashlight
|
|
@onready var flashlight_audio: AudioStreamPlayer3D = $Head/Recoil/Camera3D/WeaponHolder/FlashlightButton
|
|
@onready var kick_audio: AudioStreamPlayer3D = $Head/Recoil/Camera3D/Audio/Kick
|
|
@onready var weapon_pickup_audio: AudioStreamPlayer = $Audio/WeaponPickup
|
|
@onready var crt_filter: ColorRect = $Head/Recoil/Camera3D/crtFilter
|
|
@onready var moveable_holder: Node3D = $Head/Recoil/Camera3D/MoveableHolder
|
|
@onready var moveable_rotation: Node3D = $Head/Recoil/Camera3D/MoveableHolder/MoveableRotation
|
|
@onready var stand_check: RayCast3D = $StandCheck
|
|
@onready var r_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/RHandTest
|
|
@onready var enemy_killed_audio: AudioStreamPlayer = $Audio/EnemyKilled
|
|
@onready var footstep_sound: AudioStreamPlayer3D = $Audio/FootstepSound
|
|
@onready var standing_collision: CollisionShape3D = $StandingCollision
|
|
@onready var crouching_collision: CollisionShape3D = $CrouchingCollision
|
|
@onready var crouch_check: RayCast3D = $CrouchingCollision/CrouchCheck
|
|
@onready var hit_head: AudioStreamPlayer3D = $Audio/HitHead
|
|
@onready var crouch_audio: AudioStreamPlayer3D = $Audio/Crouch
|
|
@onready var hud: Control = $Head/Recoil/Camera3D/HUD
|
|
@onready var clock_sound: AudioStreamPlayer = $Audio/ClockSound
|
|
@onready var weapon_select_menu: Control = $Head/Recoil/Camera3D/WeaponSelect
|
|
|
|
|
|
func _ready():
|
|
level_control.player = self
|
|
SignalBus.enemy_hit.connect(enemy_hit)
|
|
SignalBus.enemy_killed.connect(enemy_killed)
|
|
|
|
weapon_holder_start_rot = weapon_holder.rotation
|
|
weapon_holder_start_pos = weapon_holder.position
|
|
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
start_sensitivity = SENSITIVITY
|
|
|
|
var viewportWidth = get_viewport().size.x
|
|
var viewportHeight = get_viewport().size.y
|
|
health_indicator.size = Vector2(viewportWidth,viewportHeight)
|
|
health_indicator.color = Color(0.471, 0, 0, 0)
|
|
|
|
speed = WALK_SPEED
|
|
|
|
crt_filter.visible = false
|
|
|
|
#Cache vars
|
|
weapon_start_pos = weapon_spawner.position
|
|
|
|
|
|
#turn off audio if unchecked in player
|
|
if AUDIO == false:
|
|
AudioServer.set_bus_volume_db(0,-80)
|
|
|
|
func _input(event) -> void:
|
|
if !controlled_elsewhere:
|
|
if !level_control.paused:
|
|
if event is InputEventMouseMotion:
|
|
self.rotate_y(-event.relative.x * SENSITIVITY)
|
|
head.rotate_x(-event.relative.y * SENSITIVITY)
|
|
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
|
mouse_input = event.relative
|
|
|
|
|
|
else:
|
|
if event is InputEventMouseMotion:
|
|
self.rotate_y(event.relative.x * .00001)
|
|
head.rotate_x(event.relative.y * .00001)
|
|
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
|
mouse_input = event.relative
|
|
|
|
|
|
func _physics_process(delta):
|
|
|
|
if !dead and !level_control.paused:
|
|
|
|
# Add the gravity.
|
|
if is_on_floor():
|
|
double_jump = true
|
|
air_dash = MAX_AIR_DASH
|
|
else:
|
|
velocity.y -= gravity * delta
|
|
if abs(velocity.y) >= .1:
|
|
moving_fast = true
|
|
|
|
|
|
# Handle jump.
|
|
if Input.is_action_just_pressed("jump") and is_on_floor() and !is_climbing:
|
|
velocity.y += JUMP_VELOCITY
|
|
crouched = false
|
|
elif Input.is_action_just_pressed("jump") and double_jump == true and !is_climbing:
|
|
velocity.y += JUMP_VELOCITY
|
|
double_jump = false
|
|
|
|
## HANDLE MOVEMENT DIRECTION
|
|
var input_dir
|
|
var direction
|
|
#GetKB Input
|
|
input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
|
#Get Joy Input
|
|
input_dir += joypad_walk()
|
|
if abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_X)) > L_JOYSTICK_SENSITIVITY or abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)) > L_JOYSTICK_SENSITIVITY:
|
|
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y))
|
|
else:
|
|
direction = (self.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
|
|
|
# Handle Sprint
|
|
if Input.is_action_just_pressed("sprint") and !is_on_floor():
|
|
if air_dash > 0:
|
|
velocity.x += direction.x * DASH_SPEED
|
|
velocity.z += direction.z * DASH_SPEED
|
|
air_dash -= 1
|
|
|
|
if Input.is_action_just_pressed("crouch"):
|
|
if crouched:
|
|
if !crouch_check.is_colliding():
|
|
crouched = !crouched
|
|
recoil.add_recoil(Vector3(-.2,.03,.03),5,10)
|
|
crouch_audio.play()
|
|
else:
|
|
recoil.add_recoil(Vector3(-.2,.03,.03),20,10)
|
|
hit_head.play()
|
|
else:
|
|
crouched = !crouched
|
|
recoil.add_recoil(Vector3(.2,0,0),5,10)
|
|
if is_on_floor():
|
|
crouch_audio.play()
|
|
velocity += direction * 20
|
|
else:
|
|
velocity.y -= 15
|
|
|
|
#walking
|
|
if is_on_floor() and !is_climbing:
|
|
if direction:
|
|
velocity.x = lerp(velocity.x, direction.x * speed, delta * WALK_TRANSITION_SPEED)
|
|
velocity.z = lerp(velocity.z, direction.z * speed, delta * WALK_TRANSITION_SPEED)
|
|
else:
|
|
velocity.x = lerp(velocity.x, direction.x * speed, delta * 6.5) + (direction.x * DASH_SPEED)
|
|
velocity.z = lerp(velocity.z, direction.z * speed, delta * 6.5) + (direction.z * DASH_SPEED)
|
|
#ladder movement
|
|
elif is_climbing and !is_on_floor():
|
|
gravity = 0.0
|
|
if direction:
|
|
velocity.y = -direction.z * speed * .75
|
|
velocity.x = direction.x * speed * .3
|
|
else:
|
|
velocity.y = lerp(velocity.y, -direction.z * speed, delta * 6.5)
|
|
velocity.x = lerp(velocity.x, direction.x * speed, delta * 6.5)
|
|
#movement in air
|
|
else:
|
|
velocity.x = lerp(velocity.x, direction.x * speed, delta * 6.5)
|
|
velocity.z = lerp(velocity.z, direction.z * speed, delta * 6.5)
|
|
|
|
# Head bob
|
|
t_bob += delta * velocity.length() * float(is_on_floor())
|
|
camera.transform.origin = _headbob(t_bob)
|
|
|
|
# FOV
|
|
var velocity_clamped = clamp(velocity.length(), 0.5, SPRINT_SPEED)
|
|
var target_fov = BASE_FOV + FOV_CHANGE * velocity_clamped
|
|
camera.fov = lerp(camera.fov, target_fov, delta * 8)
|
|
|
|
# Health Indicator
|
|
var health_opacity = 1.5 - level_control.health / level_control.start_health
|
|
if level_control.health < (level_control.start_health/2):
|
|
health_indicator.color = lerp(Color(0.471, 0, 0, 0), Color(0.471, 0, 0, .25),health_opacity)
|
|
|
|
# Moving Fast Sound
|
|
var wind_volume = clamp(velocity.length()/20,0,1) #expected max velocity for effect
|
|
ear_wind.volume_db = lerp(-80,0,wind_volume)
|
|
|
|
if moving_fast:
|
|
#cache fastest speed
|
|
if abs(velocity.y) > moving_fast_top_speed:
|
|
moving_fast_top_speed = abs(velocity.y)
|
|
|
|
#Land Sound
|
|
if velocity.y < .1 and self.is_on_floor() and moving_fast == true:
|
|
var land_volume = clamp( moving_fast_top_speed - 20 ,-10,0)
|
|
var recoil_amount = Vector3(-.3,0,0)
|
|
land_sound.volume_db = land_volume
|
|
land_sound.play()
|
|
Input.start_joy_vibration(0,.1,.1,.1)
|
|
recoil.add_recoil(recoil_amount,10,10)
|
|
moving_fast_top_speed = 0.0
|
|
moving_fast = false
|
|
|
|
# Game Speed
|
|
if !level_control.paused:
|
|
if Input.is_action_pressed("slow_down") and remaining_stamina > 0 :
|
|
ads = true
|
|
if !gamespeed_controlled:
|
|
Engine.time_scale = lerp(Engine.time_scale, SLOWSPEED, (delta * 50) / Engine.time_scale)
|
|
#gun.random_spread_amt = 0
|
|
AudioServer.set_bus_effect_enabled(0,0,true)
|
|
clock_sound.play()
|
|
if sensitivity_shift == true:
|
|
SENSITIVITY = lerp(SENSITIVITY, SENSITIVITY * .998, (delta * 100) / Engine.time_scale)
|
|
if remaining_stamina > 0:
|
|
remaining_stamina = clamp(remaining_stamina - ((delta * STAMINA_DRAIN) / Engine.time_scale),0,MAX_STAMINA)
|
|
else:
|
|
ads = false
|
|
if !gamespeed_controlled:
|
|
Engine.time_scale = lerp(Engine.time_scale, 1.0, (delta * 50)/Engine.time_scale)
|
|
#gun.random_spread_amt = gun.random_spread_start
|
|
clock_sound.stop()
|
|
AudioServer.set_bus_effect_enabled(0,0,false)
|
|
SENSITIVITY = start_sensitivity
|
|
if remaining_stamina < MAX_STAMINA and !Input.is_action_pressed("slow_down"):
|
|
remaining_stamina = clamp(remaining_stamina + (delta * STAMINA_DRAIN/Engine.time_scale), 0, MAX_STAMINA)
|
|
|
|
|
|
# Reloading
|
|
if Input.is_action_just_pressed("reload"):
|
|
gun.reload()
|
|
|
|
if Input.is_action_pressed("inspect") and !gun.anim_player.is_playing():
|
|
gun.anim_player.play("inspect")
|
|
|
|
if Input.is_action_just_pressed("flashlight"):
|
|
if flashlight_on:
|
|
flashlight_on = false
|
|
flashlight_audio.play()
|
|
else:
|
|
flashlight_on = true
|
|
flashlight_audio.play()
|
|
|
|
|
|
# Shooting & fire modes
|
|
if Input.is_action_pressed("shoot"):
|
|
if gun:
|
|
gun.shoot(delta)
|
|
|
|
if Input.is_action_just_released("shoot"):
|
|
if gun:
|
|
gun.cycle_count = gun.cycle_count_start
|
|
|
|
# Gun folding out of the way
|
|
if gun_ray.is_colliding():
|
|
weapon_holder.rotation = lerp(weapon_holder.rotation, Vector3(2, -1, -1), delta * 7)
|
|
weapon_holder.position = lerp(weapon_holder.position, Vector3(-.02,-.1,.06),(delta * 7))
|
|
gun_folded = true
|
|
elif !gun_ray.is_colliding():
|
|
weapon_holder.rotation = lerp(weapon_holder.rotation, weapon_holder_start_rot,delta*7)
|
|
weapon_holder.position = lerp(weapon_holder.position, weapon_holder_start_pos,delta*7)
|
|
gun_folded = false
|
|
|
|
#Weapon Swap Up
|
|
if Input.is_action_just_pressed("scroll_up") and !gun.anim_player.is_playing():
|
|
if held_item == null:
|
|
if level_control.held_guns.size() > 1:
|
|
gun.anim_player.play("swap_out")
|
|
level_control.gun_spawn(level_control.current_gun_index + 1)
|
|
else:
|
|
moveable_holder.rotation.y += deg_to_rad(45)
|
|
|
|
#Weapon Swap Down
|
|
if Input.is_action_just_pressed("scroll_down") and !gun.anim_player.is_playing():
|
|
if held_item == null:
|
|
if level_control.held_guns.size() > 1:
|
|
gun.anim_player.play("swap_out")
|
|
level_control.gun_spawn(level_control.current_gun_index - 1)
|
|
else:
|
|
moveable_holder.rotation.y -= deg_to_rad(45)
|
|
|
|
for i in range(1,9):
|
|
if Input.is_action_just_pressed("numb_" + str(i)):
|
|
if gun != null:
|
|
if !gun.anim_player.is_playing():
|
|
if i-1 != level_control.current_gun_index and i <= level_control.held_guns.size():
|
|
weapon_select((i - 1))
|
|
|
|
if Input.is_action_just_pressed("weapon_select"):
|
|
weapon_select_menu.open()
|
|
controlled_elsewhere = true
|
|
gamespeed_controlled = true
|
|
Engine.time_scale = .01
|
|
elif Input.is_action_just_released("weapon_select"):
|
|
var selection = weapon_select_menu.close()
|
|
if selection != null and selection != level_control.current_gun_index :
|
|
weapon_select(selection)
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
gamespeed_controlled = false
|
|
await get_tree().create_timer(.2).timeout
|
|
controlled_elsewhere = false
|
|
|
|
#interact button
|
|
if Input.is_action_just_pressed("interact"):
|
|
if held_item != null:
|
|
release_moveable()
|
|
elif interact_ray.is_colliding():
|
|
var body = interact_ray.get_collider()
|
|
if interact_ray.get_collider().is_in_group("interact"):
|
|
body.get_parent().interact()
|
|
if interact_ray.get_collider().get_class() == "RigidBody3D":
|
|
grab_moveable(body)
|
|
|
|
|
|
#kick
|
|
if Input.is_action_just_pressed("kick"):
|
|
if interact_ray.is_colliding():
|
|
if interact_ray.get_collider().get_class() == "RigidBody3D":
|
|
kick_audio.play()
|
|
interact_ray.get_collider().linear_velocity += interact_ray.global_transform.basis * Vector3(0,0, -KICK_AMOUNT)
|
|
if held_item != null:
|
|
release_moveable()
|
|
if held_item != null:
|
|
kick_audio.play()
|
|
held_item.linear_velocity += interact_ray.global_transform.basis * Vector3(0,0, -KICK_AMOUNT)
|
|
release_moveable()
|
|
|
|
if Input.is_action_just_pressed("kill_self"):
|
|
level_control.health = 0
|
|
|
|
if level_control.health <= 0:
|
|
level_control.die()
|
|
|
|
joypad_look(delta)
|
|
aim_down_sights(delta)
|
|
flashlight_toggle()
|
|
hold_item(delta)
|
|
move_and_slide()
|
|
crouch(delta)
|
|
weapon_tilt(input_dir.x, delta)
|
|
weapon_sway(delta)
|
|
weapon_bob(velocity.length(), delta)
|
|
|
|
func joypad_walk():
|
|
# Joypad right stick look control
|
|
var dir_out = Vector2(0,0)
|
|
var xAxis = Input.get_joy_axis(0,JOY_AXIS_LEFT_X)
|
|
var yAxis = Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)
|
|
|
|
if abs(xAxis) > L_JOYSTICK_DEADZONE:
|
|
dir_out.x = xAxis
|
|
if abs(yAxis) > L_JOYSTICK_DEADZONE:
|
|
dir_out.y = yAxis
|
|
|
|
return dir_out
|
|
|
|
func joypad_look(delta):
|
|
if !controlled_elsewhere:
|
|
# Joypad right stick look control
|
|
var xAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_X)
|
|
var yAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_Y)
|
|
var aim_assist
|
|
|
|
if abs(xAxis) > R_JOYSTICK_DEADZONE:
|
|
self.rotate_y(-xAxis * JOYSTICK_SENSITIVITY * 1)
|
|
if abs(yAxis) > R_JOYSTICK_DEADZONE:
|
|
head.rotate_x(-yAxis * JOYSTICK_SENSITIVITY * 1)
|
|
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
|
|
|
func flashlight_toggle():
|
|
if flashlight_on:
|
|
flashlight.light_energy = FLASHLIGHT_BRIGHTNESS
|
|
else:
|
|
flashlight.light_energy = 0
|
|
|
|
func crouch(delta):
|
|
if crouched:
|
|
crouching_collision.disabled = false
|
|
standing_collision.disabled = true
|
|
if head.position != CROUCHED_POS:
|
|
head.position = lerp(head.position, CROUCHED_POS, delta * 8)
|
|
speed = CROUCH_SPEED
|
|
else:
|
|
standing_collision.disabled = false
|
|
crouching_collision.disabled = true
|
|
if head.position != STAND_POS:
|
|
head.position = lerp(head.position, STAND_POS, delta * 8)
|
|
speed = WALK_SPEED
|
|
|
|
func aim_down_sights(delta):
|
|
if gun:
|
|
if ads:
|
|
if gun.ads == true:
|
|
camera.fov = lerp(camera.fov,BASE_FOV - float(gun.fov_zoom_amt),(delta * 5)/Engine.time_scale)
|
|
gun.position = lerp(gun.position,ADS_POS,delta * 10 / Engine.time_scale)
|
|
else:
|
|
gun.position = lerp(gun.position, weapon_start_pos,delta * 2)
|
|
camera.fov = lerp(camera.fov,BASE_FOV - float(gun.fov_zoom_amt),(delta * 5)/Engine.time_scale)
|
|
|
|
|
|
func _headbob(time) -> Vector3:
|
|
var pos = Vector3.ZERO
|
|
pos.y = sin(time * BOB_FREQ) * BOB_AMP
|
|
pos.x = cos(time * BOB_FREQ / 2) * BOB_AMP
|
|
|
|
if pos.y >= .07 and is_on_floor() and velocity.length() >= 1 and !footstep_sound.is_playing():
|
|
footstep_sound.play()
|
|
|
|
return pos
|
|
|
|
|
|
func _on_pick_up_detection_body_entered(body):
|
|
|
|
if body.is_in_group("pickup"):
|
|
if body.pickupable:
|
|
body.picked_up()
|
|
if body.is_in_group("weapon_pickup"):
|
|
weapon_pickup_audio.play()
|
|
Input.start_joy_vibration(0,.1,.1,.1)
|
|
|
|
|
|
func ladder_collide():
|
|
if is_climbing == true:
|
|
gravity = 0.0
|
|
else:
|
|
gravity = default_gravity
|
|
|
|
func _on_pick_up_magnet_body_entered(body):
|
|
if body.is_in_group("pickup") and body.is_in_group("magnet"):
|
|
body.player_follow = self
|
|
body.collision_shape.disabled = true
|
|
|
|
func weapon_tilt(input_x, delta):
|
|
if !ads:
|
|
if weapon_holder:
|
|
weapon_holder.rotation.z = lerp(weapon_holder.rotation.z, -input_x * weapon_rotation_amount * 10, 4 * delta)
|
|
if camera:
|
|
camera.rotation.z = lerp(camera.rotation.z, -input_x * HEAD_TILT_AMT, 5 * delta)
|
|
|
|
func weapon_sway(delta):
|
|
if !ads:
|
|
var joy_input = Vector2(Input.get_joy_axis(0,JOY_AXIS_RIGHT_X)*5,Input.get_joy_axis(0,JOY_AXIS_RIGHT_Y)*5)
|
|
mouse_input = lerp(mouse_input, Vector2.ZERO, 10 * delta)
|
|
joy_input = lerp(joy_input,Vector2.ZERO,10 * delta)
|
|
weapon_holder.rotation.x = lerp(weapon_holder.rotation.x, (mouse_input.y + joy_input.y) * weapon_sway_amount, 5 * delta)
|
|
weapon_holder.rotation.y = lerp(weapon_holder.rotation.y, (mouse_input.x + joy_input.x) * weapon_sway_amount, 5 * delta)
|
|
else:
|
|
if gun.ads == true:
|
|
weapon_holder.rotation = Vector3.ZERO
|
|
|
|
func weapon_bob(vel : float, delta):
|
|
if weapon_holder:
|
|
if vel > 2 and is_on_floor():
|
|
var speed_adjust = speed/WALK_SPEED
|
|
var bob_amount : float = 0.05
|
|
var bob_freq : float = 0.01 * speed_adjust
|
|
weapon_holder.position.y = lerp(weapon_holder.position.y, def_weapon_holder_pos.y + sin(Time.get_ticks_msec() * bob_freq) * bob_amount, speed * delta)
|
|
weapon_holder.position.x = lerp(weapon_holder.position.x, def_weapon_holder_pos.x + sin(Time.get_ticks_msec() * bob_freq) * bob_amount, speed * delta)
|
|
else:
|
|
weapon_holder.position.y = lerp(weapon_holder.position.y, def_weapon_holder_pos.y, .1 * delta)
|
|
weapon_holder.position.x = lerp(weapon_holder.position.x, def_weapon_holder_pos.x, .1 * delta)
|
|
|
|
func weapon_select(gun_id):
|
|
gun.anim_player.play("swap_out")
|
|
level_control.gun_spawn(gun_id)
|
|
|
|
func enemy_hit():
|
|
var hitmarker_spawn = hitmarker.instantiate()
|
|
camera.add_child(hitmarker_spawn)
|
|
hit_indicator.play()
|
|
|
|
func enemy_killed():
|
|
if SaveLoad.enemies_killed:
|
|
SaveLoad.enemies_killed += 1
|
|
else:
|
|
SaveLoad.enemies_killed = 1
|
|
|
|
SaveLoad.save_persistent_data()
|
|
enemy_killed_audio.play()
|
|
|
|
func toggle_hud(hud_on):
|
|
if dead:
|
|
crt_filter.visible = false
|
|
else:
|
|
hud.visible = hud_on
|
|
|
|
func grab_moveable(body):
|
|
held_item = body
|
|
#cache rigidbody settings
|
|
held_item_linear_damp_cache = body.linear_damp
|
|
held_item_angular_damp_cache = body.angular_damp
|
|
held_item_gravity_cache = body.gravity_scale
|
|
held_item_mass_cache = body.mass
|
|
held_item_collision_cache = held_item.get_collision_layer_value(1)
|
|
hold_offset = held_item.global_position - interact_ray.get_collision_point()
|
|
#change rigidbody settings
|
|
body.linear_damp = 0 #5
|
|
body.angular_damp = 0 #5
|
|
body.mass = 1
|
|
held_item.gravity_scale = 0
|
|
held_item.set_collision_layer_value(1,false)
|
|
|
|
func hold_item(_delta):
|
|
# Move Held Items
|
|
if held_item != null:
|
|
interact_ray.look_at(held_item.global_position, Vector3.UP)
|
|
var held_dir = (moveable_holder.global_position - held_item.global_position) #+ hold_offset
|
|
held_item.linear_velocity = held_dir * 15
|
|
held_item.look_at(moveable_rotation.global_position, Vector3.UP)
|
|
|
|
#break when moved too far away
|
|
var distance_from_player = abs(self.global_position - held_item.global_position)
|
|
if distance_from_player.length() > 5:
|
|
release_moveable()
|
|
if stand_check.is_colliding():
|
|
if stand_check.get_collider() == held_item:
|
|
release_moveable()
|
|
|
|
func release_moveable():
|
|
if held_item != null:
|
|
held_item.gravity_scale = held_item_gravity_cache
|
|
held_item.linear_damp = held_item_linear_damp_cache
|
|
held_item.angular_damp = held_item_angular_damp_cache
|
|
held_item.mass = held_item_mass_cache
|
|
held_item.set_collision_layer_value(1,held_item_collision_cache)
|
|
held_item = null
|
|
hold_offset = null
|
|
moveable_holder.rotation = Vector3(0,0,0)
|
|
|
|
func hit(damage, fired_by, target_type):
|
|
SignalBus.emit_signal("player_hit")
|
|
level_control.health -= damage
|
|
level_control.last_hit = fired_by
|
|
level_control.target_type = target_type
|
|
recoil.add_recoil(Vector3(.5,.1,.1),10,10)
|
|
hurt_audio.play()
|
|
health_indicator.color = Color(0.471, 0, 0, .25)
|
|
await get_tree().create_timer(.15).timeout
|
|
health_indicator.color = Color(0.471, 0, 0, 0)
|
|
|
|
func save():
|
|
var save_dict = {
|
|
"filename" : get_scene_file_path(),
|
|
"parent" : get_parent().get_path(),
|
|
"pos_x" : position.x,
|
|
"pos_y" : position.y,
|
|
"pos_z" : position.z,
|
|
"rot_x" : rotation.x,
|
|
"rot_y" : rotation.y,
|
|
"rot_z" : rotation.z,
|
|
"crouched" : crouched,
|
|
"flashlight_on" : flashlight_on
|
|
}
|
|
return save_dict
|