Initial commit

This commit is contained in:
2026-01-21 23:51:53 +01:00
commit 60b208fee0
1703 changed files with 100223 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
[gd_scene load_steps=3 format=3 uid="uid://cowfthogh1n7i"]
[ext_resource type="PackedScene" uid="uid://cujo3xq0erren" path="res://addons/fmod/tool/property_editors/FmodPathEditorProperty.tscn" id="1_xvpec"]
[ext_resource type="Script" uid="uid://b32x60k0th8td" path="res://addons/fmod/tool/property_editors/FmodEventEditorProperty.gd" id="2_nkhkm"]
[node name="FmodEventEditorProperty" instance=ExtResource("1_xvpec")]
script = ExtResource("2_nkhkm")

View File

@@ -0,0 +1,353 @@
extends CharacterBody3D
class_name PlayerCharacter
var aceleration: float = 4.32 #Current aceleration
var maxSpeed: float = 6.2 #Maximum Speed
var sprintSpeed: float = 3.34 #Additional Speed gained while Sprinting
var slowdownSpeedLimit: float = 0.8 #How fast the player can go when slowed
var gear: String = "neutral" #Weather the player is going forward, backward or standing still
var isMoving: bool = false
var slowed: bool = false
var momentum: float = 0
var newMoveDirection: Vector3 = Vector3(0,0,0)
var moveDirection: Vector3 = Vector3(0,0,0)
var deceleration: float = 5.56
var turnSpeed: float = PI/2 #Speed at wich body turn sideways
var handling: float = 0.67
var facingDirection = Vector2(0,1) #Where the legs are facing
var sprinting = false #While Player is sprinting
var sprintEnergy: float = 100 #Energy used for Sprinting
var sprintEnergyInitialUse: float = 4.5 #How much % sprint energy is used immediatly when initiating a sprint
var sprintEnergyUse: float = 17.5 #How much % energy is used per 1 sec of sprint
var sprintEnergyGain: float = 30 #How much % energy is gained per 1 sec of recovery
var maxDriftAngle = 0.12 #Quaternion(0,0,0.06,0.998).normalized() #How much the playesr turns to the side while drifting (radians)
var rightLeftLean: float = 0.0 #How much the player leans right or left from -1 to 1 with negative numbers being left and 0 being no lean
var currentControlState: int = 0
enum controls {DEFAULT,STANDARD_MINIGAME}
var health: float = 100.0
var invoulnerable: bool = false
var alive: bool = true
@onready var camera: Camera3D = $CameraPivot/Camera3D
@onready var cameraPivot: Marker3D = $CameraPivot
@onready var flashlight: SpotLight3D = $CameraPivot/Camera3D/flashlight
@onready var backlightR := $pivot/BodyPivot/body/BacklightR
@onready var backlightL := $pivot/BodyPivot/body/BacklightL
@onready var pivot: = $pivot
@onready var headPivot: = $pivot/HeadBinoculars/HeadPivot
@onready var headBinoculars: = $pivot/HeadBinoculars
@onready var legs := $pivot/BodyPivot/CaterpillarLegs
@onready var body: = $pivot/BodyPivot/body
@onready var hud = $/root/Main/Hud
@onready var interactCross := $/root/Main/Hud/InteractCross
@onready var sprintBar := $/root/Main/Hud/TextureProgressBar
@onready var grabRaycast: = $CameraPivot/Camera3D/GrabDetector
@onready var grabPivot: = $pivot/BodyPivot/body/GrabPivot
@onready var grabBox: = $pivot/BodyPivot/body/GrabBox
var grabbedObject: GrabableObject
@onready var interactRaycast = $CameraPivot/Camera3D/InteractDetector
@onready var VoiceChat = $VoiceChat
@onready var bodyPivot: Node3D = $pivot/BodyPivot
var mouseSensetivity := 0.1 #How much mouse movement affects ingame camera movement
var spectatorScene: PackedScene = preload("res://actors/Player/Spectator.tscn")
var spectatorParent: Node3D
var mapLogic: MapLogic
#Camera Shake Stuff
var traumaReductionRate:float = 0.34
var trauma: float = 0
@export var maxX = 12
@export var maxY = 12
@export var maxZ = 7
@export var shakeIntensety : float = 7.0
var time: float = 0
@export var noise: Noise
var noiseSpeed: float = 50
var initialRotation = rotation_degrees as Vector3
# Camera Shake Stuff end
func _enter_tree() -> void:
set_multiplayer_authority(name.to_int())
if is_multiplayer_authority():
$CameraPivot/Camera3D.make_current()
$pivot/HeadBinoculars.hide()
$/root/Main/Hud/TextureProgressBar.show()
func _ready() -> void:
Multiplayer.player_ready.emit(int(name))
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
mapLogic = Multiplayer.currentMapLogic
spectatorParent = get_node("/root/Main/Spectators")
if mapLogic:
mapLogic.onCollision.connect(onCollision)
if is_multiplayer_authority():
position.y += 2
return
func _process(delta: float) -> void:
if not is_multiplayer_authority(): return
if not alive: return
if invoulnerable and trauma == 0.0:
invoulnerable = false
if Input.is_action_just_pressed("debug"): ##Debug
die()
match currentControlState:
controls.DEFAULT:
regularControlsIdle(delta)
controls.STANDARD_MINIGAME:
standardMinigameControlsIdle(delta)
func _physics_process(delta: float) -> void:
if not is_multiplayer_authority(): return
if not alive: return
match currentControlState:
controls.DEFAULT:
regularControlsPhysics(delta)
controls.STANDARD_MINIGAME:
endOfPhysicsCleanup(delta)
func standardMinigameControlsIdle(_delta:float):
if Input.is_action_just_pressed("moveDown") or Input.is_action_just_pressed("interact"):
currentControlState = controls.DEFAULT
func regularControlsIdle(_delta:float):
#Interacting Logic
var InteractCollider: InteractBox = interactRaycast.get_collider()
if InteractCollider and Input.is_action_just_pressed("interact"):
InteractCollider.playerRef = self
InteractCollider.interact()
if InteractCollider.type == "minigame":
currentControlState = controls.STANDARD_MINIGAME
momentum = 0
#Grabbing Logic
var GrabCollider: GrabBox = grabRaycast.get_collider()
var grabBoxCollider: Array[Area3D] = grabBox.get_overlapping_areas()
if(grabBoxCollider and Input.is_action_just_pressed("interact") and !grabbedObject):
if grabBoxCollider.has(GrabCollider): #If the player is looking at an object and it is in the grab box
grabbedObject = GrabCollider.grab()
else:
#If the player is not looking at an object, grab the closet one in the grab box
var closestObj: GrabBox
var distanceToClosestObj: float = 100
for grabObj in grabBoxCollider:
if (getDistance(self,grabObj) < distanceToClosestObj):
closestObj = grabObj
distanceToClosestObj = getDistance(self, grabObj)
grabbedObject = closestObj.grab()
if InteractCollider or grabBoxCollider:
interactCross.show()
else:
interactCross.hide()
if Input.is_action_just_pressed("flashlight"):
flashlight.visible = !flashlight.visible
if grabbedObject:
grabbedObject.global_position = grabPivot.global_position# + grabbedObject.grabPositionPositionOffset
grabbedObject.rotation = grabPivot.global_rotation + grabbedObject.grabPositionRotationOffset
if grabbedObject.grabBox.heavy: slowed = true
if Input.is_action_just_pressed("drop"):
grabbedObject.release.rpc()
grabbedObject = null
slowed = false
momentum = 0
if Input.is_action_just_pressed("throw"):
grabbedObject.release.rpc()
grabbedObject.throw.rpc_id(1,facingDirection.x,facingDirection.y,camera.rotation.x)
grabbedObject = null
slowed = false
momentum = 0
func regularControlsPhysics(delta: float):
isMoving = false
#Drain energy on sprint start to prevent the player from pressing sprint every other frame to get infinity energy
if Input.is_action_just_pressed("Sprint"):
sprintEnergy = clamp(sprintEnergy - sprintEnergyInitialUse, -(sprintEnergyInitialUse*2) , 100)
# Rest of sprint energy logic
if Input.is_action_pressed("Sprint"):
sprintEnergy = clamp(sprintEnergy - sprintEnergyUse * delta, 0 , 100) # Drain sprint when holding the button
if sprintEnergy > 0:
sprinting = true
else:
sprinting = false
else:
sprinting = false
sprintEnergy = clamp(sprintEnergy + sprintEnergyGain * delta, -(sprintEnergyInitialUse*2) , 100) # Gain sprint when not holding the button
if not is_on_floor(): velocity += get_gravity()
newMoveDirection = Vector3(0,0,0)
# Set moveDirection based on input
if Input.is_action_pressed("moveUp") and !Input.is_action_pressed("moveDown"):
isMoving = true
newMoveDirection += Vector3(facingDirection.x,0,facingDirection.y)
if Input.is_action_pressed("moveRight") and !Input.is_action_pressed("moveLeft"):
isMoving = true
newMoveDirection -= Vector3(facingDirection.x,0,facingDirection.y).rotated(up_direction,PI/2)
if Input.is_action_pressed("moveLeft") and !Input.is_action_pressed("moveRight"):
isMoving = true
newMoveDirection += Vector3(facingDirection.x,0,facingDirection.y).rotated(up_direction,PI/2)
if Input.is_action_pressed("moveDown") and !Input.is_action_pressed("moveUp"):
isMoving = true
newMoveDirection += Vector3(facingDirection.x,0,facingDirection.y)
showBacklights()
else:
hideBacklights()
if newMoveDirection != Vector3(0,0,0):
moveDirection = clampVectorLength(moveDirection + newMoveDirection*delta,0,handling)
endOfPhysicsCleanup(delta)
#Momentum stuff
if isMoving:
if Input.is_action_pressed("moveDown"):
momentum = clamp(momentum + -aceleration*2 * delta,-maxSpeed/2,maxSpeed)
else:
momentum = clamp(momentum + aceleration * delta,-maxSpeed/2,maxSpeed)
else:
if momentum >= 0:
momentum = clamp(momentum - deceleration * delta,-maxSpeed/2,maxSpeed)
if momentum < 0:
momentum = clamp(momentum + deceleration * delta,-maxSpeed/2,maxSpeed)
if sprinting and isMoving and !Input.is_action_pressed("moveDown"):
velocity = clampVectorLength(moveDirection.normalized() * (momentum + sprintSpeed),0,maxSpeed+sprintSpeed)
else:
velocity = clampVectorLength(moveDirection.normalized() * momentum,0,maxSpeed)
bodyPivot.rotation.y = rotate_toward(bodyPivot.rotation.y, -atan2(moveDirection.z,moveDirection.x) + PI/2,delta*turnSpeed)
#print(facingDirection.length())
move_and_slide() #applies movement
func endOfPhysicsCleanup(delta: float):
trauma = max(trauma-delta*traumaReductionRate,0)
time += delta
rotation_degrees.x = initialRotation.x + maxX * getShakeIntensity() * getNoiseFromSeed(343)
rotation_degrees.y = initialRotation.y + maxY * getShakeIntensity() * getNoiseFromSeed(123)
rotation_degrees.z = initialRotation.z + maxZ * getShakeIntensity() * getNoiseFromSeed(234)
#Rotate head based on camera movement
headPivot.rotation.y = cameraPivot.rotation.y
headPivot.rotation.x = -camera.rotation.x
if trauma == 0.0:
headPivot.rotation.z = 0.0
headBinoculars.rotation.z = 0.0
sprintBar.value = sprintEnergy
func showBacklights() -> void:
backlightL.show()
backlightR.show()
func hideBacklights() -> void:
backlightL.hide()
backlightR.hide()
func useSprintEnergy(delta: float):
sprintEnergy = clamp(sprintEnergy - sprintEnergyUse * delta, 0, 100)
func setRightLeftLean(direction: int, strength: float, delta: float) -> void:
if direction > 0 and rightLeftLean < 0:
rightLeftLean = 0
elif direction < 0 and rightLeftLean > 0:
rightLeftLean = 0
rightLeftLean = clamp(rightLeftLean + strength * delta * direction,-1,1)
func getAngleBetweenVectors(a: Vector3, b: Vector3) -> float:
if a.length() == 0 or b. length() == 0:
return 0
return acos((a.dot(b)/(a.length()*b.length())))
func getDistance(a: Node3D, b: Node3D) -> float:
var distanceVector: Vector3
distanceVector = b.global_position - a.global_position
return distanceVector.length()
func clampVectorLength(Vector: Vector3, minLength: float, maxLength: float) -> Vector3:
#scales Vector up/ down to the max/ min length givin. If the Vector has a length of 0 it will be returned without being scaled.
if Vector.length() == 0: return Vector
if Vector.length() < minLength:
return Vector * minLength / Vector.length()
elif Vector.length() > maxLength:
return Vector * maxLength / Vector.length()
return Vector
func onCollision() -> void:
trauma = 1
func addTrauma(traumaAmount: float):
trauma = clamp(trauma+traumaAmount,0,1)
func getShakeIntensity() -> float:
return shakeIntensety * trauma * trauma
func getNoiseFromSeed(seed_: int) -> float:
noise.seed = seed_
return noise.get_noise_1d(time*noiseSpeed)
func _input(event: InputEvent) -> void: #Camera movement with mouse
if event is InputEventMouseMotion && Input.mouse_mode == 2:
camera.rotation.x -= clamp(deg_to_rad(event.relative.y * mouseSensetivity),-180,180)
cameraPivot.rotation.y -= deg_to_rad(event.relative.x * mouseSensetivity)
facingDirection = facingDirection.rotated(deg_to_rad(event.relative.x * mouseSensetivity))
camera.rotation_degrees.x = clamp(camera.rotation_degrees.x, -70, 70)
cameraPivot.rotation.z = 0
func _on_hurt_box_hit_taken(attack: Attack) -> void:
if invoulnerable: return
trauma = attack.trauma
health -= attack.damage
if health <= 0.0:
die()
invoulnerable = true
func die() -> void:
Multiplayer.alivePlayerDict.erase(int(name))
headBinoculars.show()
headPivot.position = Vector3(0,0.382,0.063)
headPivot.rotation = Vector3(0,0,0)
$"pivot/pivotRightLeg/pivotLeftLeg/body/Grabby Arms_L".rotation.x = deg_to_rad(90)
$"pivot/pivotRightLeg/pivotLeftLeg/body/Grabby Arms_R".rotation.x = deg_to_rad(90)
var spectator = spectatorScene.instantiate()
spectatorParent.add_child(spectator)
camera.current = false
alive = false

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

View File

@@ -0,0 +1,158 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[Fmod]
General/auto_initialize=true
General/channel_count=1024
General/is_live_update_enabled=true
General/is_memory_tracking_enabled=false
"Software Format/sample_rate"=48000
"Software Format/speaker_mode"=3
"Software Format/raw_speaker_count"=0
General/default_listener_count=1
General/banks_path="res://assets/FmodBanks/Desktop"
General/should_load_by_name=false
DSP/dsp_buffer_size=512
DSP/dsp_buffer_count=4
"3D Settings/doppler_scale"=1.0
"3D Settings/distance_factor"=1.0
"3D Settings/rolloff_scale"=1.0
[application]
config/name="Spacebots"
run/main_scene="uid://c240icwf4uov8"
config/use_custom_user_dir=true
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[audio]
driver/enable_input=true
[autoload]
Noray="*res://addons/netfox.noray/noray.gd"
PacketHandshake="*res://addons/netfox.noray/packet-handshake.gd"
Multiplayer="*res://script/multiplayer.gd"
Steamworks="*res://script/steamworks.gd"
FmodManager="*res://addons/fmod/FmodManager.gd"
Featuremanager="*res://script/featuremanager.gd"
[debug]
file_logging/enable_file_logging=true
[display]
window/size/viewport_width=1920
window/size/viewport_height=1080
window/size/mode=3
window/stretch/mode="viewport"
window/stretch/aspect="expand"
[editor_plugins]
enabled=PackedStringArray("res://addons/fmod/plugin.cfg", "res://addons/netfox.internals/plugin.cfg", "res://addons/netfox.noray/plugin.cfg")
[input]
moveUp={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
moveDown={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
moveRight={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
moveLeft={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
cameraUp={
"deadzone": 0.2,
"events": []
}
Sprint={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
pause={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
interact={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
]
}
drop={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"location":0,"echo":false,"script":null)
]
}
flashlight={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
]
}
throw={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(191, 15),"global_position":Vector2(200, 63),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
settings={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194333,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
debug={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"location":0,"echo":false,"script":null)
]
}
noise={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null)
]
}
[layer_names]
3d_physics/layer_1="Default"
3d_physics/layer_2="Player"
3d_physics/layer_3="Walls"
3d_physics/layer_5="Grabbing"
3d_physics/layer_6="Interact"
3d_physics/layer_7="hurtboxes Players"
3d_physics/layer_8="hurtboxes Enemies"
[physics]
3d/run_on_separate_thread=true
[rendering]
textures/canvas_textures/default_texture_filter=0
[steam]
initialization/app_id=480