Initial Commit
This commit is contained in:
110
player_q3/PlayerQ3.gd
Normal file
110
player_q3/PlayerQ3.gd
Normal file
@@ -0,0 +1,110 @@
|
||||
extends CharacterBody3D
|
||||
|
||||
const DIST_FLOOR_SNAP := Vector3.DOWN * 0.2
|
||||
|
||||
@onready var body : Node3D = $Body
|
||||
@onready var head : Node3D = $Body/Head
|
||||
@onready var cam : Camera3D = $Body/Head/Camera3D
|
||||
|
||||
@export var mouse_sensitivity = 5.0
|
||||
|
||||
@export var stop_speed = 4.0
|
||||
@export var move_speed = 20.0
|
||||
@export var max_slope_angle = 50.0
|
||||
|
||||
@export var gravity = 60.0
|
||||
@export var max_fall_speed = 50.0
|
||||
@export var jump_height = 2.5
|
||||
|
||||
@export var accel_ground = 10.0
|
||||
@export var accel_air = 1.0
|
||||
#export var accel_water: float := 4.0
|
||||
|
||||
@export var friction_ground = 6.0
|
||||
#export var friction_water: float := 1.0
|
||||
|
||||
|
||||
var floor_snap := Vector3.ZERO
|
||||
|
||||
|
||||
func get_move_direction() -> Vector3:
|
||||
|
||||
var input_dir := Vector2(
|
||||
Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward"),
|
||||
Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
||||
).normalized();
|
||||
|
||||
return input_dir.x * body.global_transform.basis.z + input_dir.y * body.global_transform.basis.x
|
||||
|
||||
|
||||
func _input(event):
|
||||
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED and event is InputEventMouseMotion:
|
||||
rotate_look(event.relative * 0.001 * mouse_sensitivity)
|
||||
|
||||
|
||||
func rotate_look(amount : Vector2) -> void:
|
||||
body.rotation.y -= amount.x
|
||||
head.rotation.x = clamp(head.rotation.x - amount.y, -PI * 0.5, PI * 0.5)
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
|
||||
var was_on_floor : bool = is_on_floor()
|
||||
var h_target_dir : Vector3 = get_move_direction()
|
||||
|
||||
if is_on_floor():
|
||||
apply_friction(delta)
|
||||
accelerate(delta, h_target_dir, move_speed, accel_ground)
|
||||
if Input.is_action_pressed("jump"):
|
||||
velocity.y = sqrt(2 * jump_height * abs(gravity))
|
||||
floor_snap = Vector3.ZERO
|
||||
else:
|
||||
# hack: only add gravity not checked ground, to prevent sliding checked slopes
|
||||
# This works because move_and_slide_with_snap warps the player to the ground in other cases
|
||||
velocity.y = max(-max_fall_speed, velocity.y - gravity * delta)
|
||||
accelerate(delta, h_target_dir, move_speed, accel_air)
|
||||
|
||||
set_velocity(velocity)
|
||||
# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `floor_snap`
|
||||
set_up_direction(Vector3.UP)
|
||||
set_floor_stop_on_slope_enabled(true)
|
||||
set_max_slides(4)
|
||||
set_floor_max_angle(deg_to_rad(max_slope_angle))
|
||||
# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `false`
|
||||
move_and_slide()
|
||||
velocity = velocity
|
||||
|
||||
if !was_on_floor and is_on_floor():
|
||||
floor_snap = DIST_FLOOR_SNAP
|
||||
elif was_on_floor and !is_on_floor():
|
||||
floor_snap = Vector3.ZERO
|
||||
|
||||
|
||||
func accelerate(delta : float, p_target_dir : Vector3, p_target_speed : float, p_accel : float):
|
||||
var current_speed : float = velocity.dot(p_target_dir)
|
||||
var add_speed : float = p_target_speed - current_speed
|
||||
if add_speed > 0:
|
||||
var accel_speed : float = min(add_speed, p_accel * delta * p_target_speed)
|
||||
velocity += p_target_dir * accel_speed
|
||||
|
||||
|
||||
func apply_friction(delta : float):
|
||||
|
||||
var vec : Vector3 = velocity
|
||||
var speed : float = velocity.length()
|
||||
if is_zero_approx(speed):
|
||||
velocity = Vector3.ZERO
|
||||
return
|
||||
|
||||
var drop : float = 0.0
|
||||
var control : float = max(speed, stop_speed)
|
||||
|
||||
# ground friction
|
||||
if is_on_floor():
|
||||
drop += control * friction_ground * delta
|
||||
|
||||
# water friction not implemented
|
||||
var new_speed : float = max(0.0, speed - drop)
|
||||
new_speed /= speed
|
||||
|
||||
velocity *= new_speed
|
||||
26
player_q3/PlayerQ3.tscn
Normal file
26
player_q3/PlayerQ3.tscn
Normal file
@@ -0,0 +1,26 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://c65plp2c8ms4"]
|
||||
|
||||
[ext_resource type="Script" path="res://player_q3/PlayerQ3.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://player_q3/Weapons.gd" id="2_dl1i1"]
|
||||
[ext_resource type="PackedScene" uid="uid://gnhgkfm3frvt" path="res://player_q3/RevolverFix.tscn" id="3_hj857"]
|
||||
|
||||
[sub_resource type="CylinderShape3D" id="1"]
|
||||
|
||||
[node name="PlayerQ3" type="CharacterBody3D"]
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
||||
shape = SubResource("1")
|
||||
|
||||
[node name="Body" type="Node3D" parent="."]
|
||||
|
||||
[node name="Head" type="Node3D" parent="Body"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0)
|
||||
script = ExtResource("2_dl1i1")
|
||||
|
||||
[node name="RevolverFix" parent="Body/Head" instance=ExtResource("3_hj857")]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0.385807, -0.452879, -0.930275)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="Body/Head"]
|
||||
current = true
|
||||
9
player_q3/Revolver.tscn
Normal file
9
player_q3/Revolver.tscn
Normal file
@@ -0,0 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://p3r1q0d3ibmj"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cnk2fusin4ewy" path="res://assets/Weapons/Gun/Revolver.gltf" id="1_gnlrs"]
|
||||
|
||||
[node name="Revolver" instance=ExtResource("1_gnlrs")]
|
||||
transform = Transform3D(0.05, 0, 0, 0, 0.0499999, 0, 0, 0, 0.0499999, 0, 0, 0)
|
||||
|
||||
[node name="RootNode" parent="." index="0"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30501, 7.01204)
|
||||
15
player_q3/RevolverFix.tscn
Normal file
15
player_q3/RevolverFix.tscn
Normal file
@@ -0,0 +1,15 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://gnhgkfm3frvt"]
|
||||
|
||||
[ext_resource type="Script" path="res://player_q3/Weapon.gd" id="1_2cfte"]
|
||||
[ext_resource type="PackedScene" uid="uid://p3r1q0d3ibmj" path="res://player_q3/Revolver.tscn" id="1_81137"]
|
||||
|
||||
[node name="RevolverFix" type="Node3D"]
|
||||
script = ExtResource("1_2cfte")
|
||||
initialPos = Transform3D(0.05, 0, 0, 0, 0.05, 0, 0, 0, 0.05, 0, 0, 0)
|
||||
transition_speed = 5.0
|
||||
|
||||
[node name="Revolver" parent="." instance=ExtResource("1_81137")]
|
||||
transform = Transform3D(0.05, 0, 0, 0, 0.017101, -0.0469845, 0, 0.0469845, 0.017101, 0, -0.526001, -0.296439)
|
||||
|
||||
[node name="Revolver" parent="Revolver" instance=ExtResource("1_81137")]
|
||||
transform = Transform3D(0.05, 0, 0, 0, 0.0259061, 0.0427652, 0, -0.0427652, 0.0259061, 0.00365943, 0.222644, -0.251306)
|
||||
58
player_q3/Weapon.gd
Normal file
58
player_q3/Weapon.gd
Normal file
@@ -0,0 +1,58 @@
|
||||
extends Node3D
|
||||
class_name Weapon
|
||||
|
||||
const MAX_CLIP = 5
|
||||
var damage = 25
|
||||
var clip = 444444
|
||||
@export var initialPos : Transform3D
|
||||
@export var transition_speed = 1.0
|
||||
var initialTransform : Transform3D
|
||||
|
||||
|
||||
const DEFAULT = 0
|
||||
const INITIAL = 1
|
||||
const SHOOT = 2
|
||||
const RELOAD = 3
|
||||
|
||||
var state = DEFAULT
|
||||
|
||||
func _ready():
|
||||
var tween = create_tween()
|
||||
tween.set_trans(Tween.TRANS_CIRC)
|
||||
tween.set_ease(Tween.EASE_IN_OUT)
|
||||
tween.tween_callback(InitialPos).set_delay(2)
|
||||
|
||||
|
||||
func InitialPos():
|
||||
var tween = create_tween()
|
||||
tween.set_trans(Tween.TRANS_CIRC)
|
||||
tween.set_ease(Tween.EASE_IN_OUT)
|
||||
tween.set_parallel(true)
|
||||
tween.tween_property($Revolver, "position", initialPos.origin, 0.4)
|
||||
tween.tween_property($Revolver, "rotation", Vector3.ZERO, 0.4)
|
||||
tween.tween_callback(func(): state = INITIAL).set_delay(0.3)
|
||||
|
||||
|
||||
|
||||
func Shoot():
|
||||
if clip > 0 && state == INITIAL:
|
||||
clip -= 1
|
||||
state = SHOOT;
|
||||
var tween = create_tween()
|
||||
tween.set_trans(Tween.TRANS_ELASTIC)
|
||||
tween.set_ease(Tween.EASE_OUT)
|
||||
tween.set_parallel(true)
|
||||
tween.tween_property($Revolver, "position", get_node("Revolver").transform.origin + Vector3(.0, 0.3, -.3), 0.3)
|
||||
tween.tween_property($Revolver, "rotation", Vector3(deg_to_rad(-60),.0,.0),0.3)
|
||||
tween.tween_callback(InitialPos).set_delay(0.3)
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
|
||||
func Reload():
|
||||
if(clip < MAX_CLIP && state == INITIAL):
|
||||
state = RELOAD
|
||||
|
||||
return true
|
||||
return false
|
||||
12
player_q3/Weapons.gd
Normal file
12
player_q3/Weapons.gd
Normal file
@@ -0,0 +1,12 @@
|
||||
extends Node3D
|
||||
|
||||
var weapons = []
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
weapons.append($RevolverFix as Weapon)
|
||||
|
||||
|
||||
|
||||
func _process(delta):
|
||||
if Input.is_action_pressed("shoot"):
|
||||
weapons[0].Shoot()
|
||||
Reference in New Issue
Block a user