first iteration with authorative movement

This commit is contained in:
2025-02-01 19:41:38 +09:00
parent 3ef5254792
commit c8c5c08b4d
49 changed files with 1364 additions and 0 deletions
+1
View File
@@ -1,3 +1,4 @@
# Godot 4+ specific ignores
.godot/
/android/
build/
+129
View File
@@ -0,0 +1,129 @@
[preset.0]
name="Windows Desktop"
platform="Windows Desktop"
runnable=false
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="build/instructions-clear-win-desktop.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
codesign/timestamp_server_url=""
codesign/digest_algorithm=1
codesign/description=""
codesign/custom_options=PackedStringArray()
application/modify_resources=true
application/icon=""
application/console_wrapper_icon=""
application/icon_interpolation=4
application/file_version=""
application/product_version=""
application/company_name=""
application/product_name=""
application/file_description=""
application/copyright=""
application/trademarks=""
application/export_angle=0
application/export_d3d12=0
application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
$settings = New-ScheduledTaskSettingsSet
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
Start-ScheduledTask -TaskName godot_remote_debug
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
[preset.1]
name="Windows Server"
platform="Windows Desktop"
runnable=false
advanced_options=false
dedicated_server=false
custom_features="dedicated_server"
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="build/instructions-clear-win-server.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.1.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
codesign/timestamp_server_url=""
codesign/digest_algorithm=1
codesign/description=""
codesign/custom_options=PackedStringArray()
application/modify_resources=true
application/icon=""
application/console_wrapper_icon=""
application/icon_interpolation=4
application/file_version=""
application/product_version=""
application/company_name=""
application/product_name=""
application/file_description=""
application/copyright=""
application/trademarks=""
application/export_angle=0
application/export_d3d12=0
application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
$settings = New-ScheduledTaskSettingsSet
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
Start-ScheduledTask -TaskName godot_remote_debug
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
+4
View File
@@ -0,0 +1,4 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://chp3rogcgumau"]
[resource]
albedo_color = Color(0.054902, 0.431373, 0.129412, 1)
+4
View File
@@ -0,0 +1,4 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://ccrb46njti2ke"]
[resource]
albedo_color = Color(0.270588, 0.596078, 1, 1)
+4
View File
@@ -0,0 +1,4 @@
[gd_resource type="PlaneMesh" format=3 uid="uid://dwpvym2kc4gd8"]
[resource]
size = Vector2(10000, 10000)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bk722l8idpuov"
path="res://.godot/imported/blue.png-2ebebcb60a2786b51bf8c57bf6c35d93.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://models/blue.png"
dest_files=["res://.godot/imported/blue.png-2ebebcb60a2786b51bf8c57bf6c35d93.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dmry88lccca6v"
path="res://.godot/imported/generic-bam-placeholder.gltf-9c6b218e010af71bbfc5e7c09f9a3001.scn"
[deps]
source_file="res://models/generic-bam-placeholder.gltf"
dest_files=["res://.godot/imported/generic-bam-placeholder.gltf-9c6b218e010af71bbfc5e7c09f9a3001.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://en0thvrt6r6o"
path.s3tc="res://.godot/imported/generic-bam-placeholder_0.png-4b26c694cab47cc035250c044ea2f819.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "c16cd153f9c4e58f92155c7fdbacab46"
}
[deps]
source_file="res://models/generic-bam-placeholder_0.png"
dest_files=["res://.godot/imported/generic-bam-placeholder_0.png-4b26c694cab47cc035250c044ea2f819.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://daj38bahjfuwa"
path.s3tc="res://.godot/imported/generic-bam-placeholder_1.png-a28949c8b47cd079d7024f9873bd59ec.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "ef862aea6838e1d435e71bdbfb00179b"
}
[deps]
source_file="res://models/generic-bam-placeholder_1.png"
dest_files=["res://.godot/imported/generic-bam-placeholder_1.png-a28949c8b47cd079d7024f9873bd59ec.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
File diff suppressed because one or more lines are too long
@@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://k6f3fdlnbmjp"
path="res://.godot/imported/generic-player-placeholder-red.gltf-ea859f06b8e003c98de2a38069feee97.scn"
[deps]
source_file="res://models/generic-player-placeholder-red.gltf"
dest_files=["res://.godot/imported/generic-player-placeholder-red.gltf-ea859f06b8e003c98de2a38069feee97.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cpeerw3suw6mu"
path.s3tc="res://.godot/imported/generic-player-placeholder-red_0.png-2c10651b9fcf9a6312237a1dc764d53d.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "ab6be8d52f7b2c547d41a85e90c891ca"
}
[deps]
source_file="res://models/generic-player-placeholder-red_0.png"
dest_files=["res://.godot/imported/generic-player-placeholder-red_0.png-2c10651b9fcf9a6312237a1dc764d53d.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://vjlacypkdltq"
path.s3tc="res://.godot/imported/generic-player-placeholder-red_1.png-dee3ab7ddc7582b49a9fd5adc139df00.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "ef862aea6838e1d435e71bdbfb00179b"
}
[deps]
source_file="res://models/generic-player-placeholder-red_1.png"
dest_files=["res://.godot/imported/generic-player-placeholder-red_1.png-dee3ab7ddc7582b49a9fd5adc139df00.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dy6gkeak06s17"
path="res://.godot/imported/generic-player-placeholder.gltf-d04d5db451019c4676ca4f90b38fb57a.scn"
[deps]
source_file="res://models/generic-player-placeholder.gltf"
dest_files=["res://.godot/imported/generic-player-placeholder.gltf-d04d5db451019c4676ca4f90b38fb57a.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://o47cpbwqjsjs"
path.s3tc="res://.godot/imported/generic-player-placeholder_0.png-1bbbfa59d7787bfd0a359a8b57d9b3b8.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "952985ffaa2c5afc37983b4f7510c250"
}
[deps]
source_file="res://models/generic-player-placeholder_0.png"
dest_files=["res://.godot/imported/generic-player-placeholder_0.png-1bbbfa59d7787bfd0a359a8b57d9b3b8.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

@@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://voq5cycx1mal"
path.s3tc="res://.godot/imported/generic-player-placeholder_1.png-28f369353b1e252b6560224aa6109668.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "ef862aea6838e1d435e71bdbfb00179b"
}
[deps]
source_file="res://models/generic-player-placeholder_1.png"
dest_files=["res://.godot/imported/generic-player-placeholder_1.png-28f369353b1e252b6560224aa6109668.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bq1dptt2cbowv"
path="res://.godot/imported/neutral.png-80876cec7814f9bf29f7275049231f7f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://models/neutral.png"
dest_files=["res://.godot/imported/neutral.png-80876cec7814f9bf29f7275049231f7f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c2njhdyxocn3m"
path="res://.godot/imported/notblue.png-11c566d53917b3b6ae77697a670d1436.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://models/notblue.png"
dest_files=["res://.godot/imported/notblue.png-11c566d53917b3b6ae77697a670d1436.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ds63oxmg2i260"
path="res://.godot/imported/red.png-ff7cef4bec9b12c12344685a7dc6e028.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://models/red.png"
dest_files=["res://.godot/imported/red.png-ff7cef4bec9b12c12344685a7dc6e028.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bninyy5txs3yf"
path="res://.godot/imported/white.png-251d22fbf66643dc5f64509f2be910f4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://models/white.png"
dest_files=["res://.godot/imported/white.png-251d22fbf66643dc5f64509f2be910f4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+56
View File
@@ -11,9 +11,65 @@ config_version=5
[application]
config/name="Instructions Clear"
run/main_scene="res://scenes/empty.tscn"
config/features=PackedStringArray("4.3", "Mobile")
run/max_fps=240
boot_splash/show_image=false
config/icon="res://icon.svg"
run/size/borderless=false
run/size/viewport_height=720
run/size/viewport_width=1280
[autoload]
MultiplayerManager="*res://scripts/multiplayer/multiplayer_manager.gd"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
window/vsync/vsync_mode=0
[input]
move_forward={
"deadzone": 0.5,
"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":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
, 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":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.5,
"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)
, 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":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_back={
"deadzone": 0.5,
"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)
, 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":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_left={
"deadzone": 0.5,
"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)
, 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":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
mouse_capture={
"deadzone": 0.5,
"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(163, 13),"global_position":Vector2(172, 59),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
mouse_release={
"deadzone": 0.5,
"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)
]
}
[rendering]
rendering_device/fallback_to_vulkan=false
rendering_device/fallback_to_d3d12=false
renderer/rendering_method="mobile"
environment/defaults/default_clear_color=Color(0, 0, 0, 1)
+3
View File
@@ -0,0 +1,3 @@
[gd_scene format=3 uid="uid://b6nq7wjyrroi0"]
[node name="EmptyNode" type="Node"]
+157
View File
@@ -0,0 +1,157 @@
[gd_scene load_steps=18 format=3 uid="uid://cw0ho53ruh87m"]
[sub_resource type="BoxShape3D" id="BoxShape3D_e1dyx"]
size = Vector3(16, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_xfekw"]
[sub_resource type="BoxShape3D" id="BoxShape3D_cnq3u"]
size = Vector3(16, 0.1, 16)
[sub_resource type="BoxShape3D" id="BoxShape3D_dwa2s"]
size = Vector3(4, 0.1, 4)
[sub_resource type="BoxMesh" id="BoxMesh_lt54m"]
[sub_resource type="BoxShape3D" id="BoxShape3D_fgmeq"]
size = Vector3(9.479, 0.1, 4)
[sub_resource type="BoxMesh" id="BoxMesh_thq07"]
[sub_resource type="BoxShape3D" id="BoxShape3D_xn166"]
size = Vector3(16, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_intbb"]
[sub_resource type="BoxShape3D" id="BoxShape3D_e0hgo"]
size = Vector3(1, 10, 20)
[sub_resource type="BoxMesh" id="BoxMesh_qljsj"]
[sub_resource type="BoxShape3D" id="BoxShape3D_0reu4"]
size = Vector3(1, 10, 20)
[sub_resource type="BoxMesh" id="BoxMesh_8hngc"]
[sub_resource type="BoxShape3D" id="BoxShape3D_yaygu"]
size = Vector3(16, 10, 1)
[sub_resource type="BoxMesh" id="BoxMesh_hwi1p"]
[sub_resource type="BoxShape3D" id="BoxShape3D_ktywj"]
size = Vector3(16, 10, 1)
[sub_resource type="BoxMesh" id="BoxMesh_lm401"]
[node name="House" type="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0137916, -4.76837e-07, 0.0149183)
[node name="FirstFloor" type="StaticBody3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="FirstFloor"]
shape = SubResource("BoxShape3D_e1dyx")
[node name="MeshInstance3D" type="MeshInstance3D" parent="FirstFloor"]
transform = Transform3D(16, 0, 0, 0, 0.1, 0, 0, 0, 20, 0, 0, 0)
mesh = SubResource("BoxMesh_xfekw")
[node name="SecondFloor" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="SecondFloor"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2)
shape = SubResource("BoxShape3D_cnq3u")
[node name="MeshInstance3D" type="MeshInstance3D" parent="SecondFloor"]
transform = Transform3D(16, 0, 0, 0, 0.1, 0, 0, 0, 16, 0, 0, -2)
mesh = SubResource("BoxMesh_xfekw")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="SecondFloor"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, 8)
shape = SubResource("BoxShape3D_dwa2s")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="SecondFloor"]
transform = Transform3D(4, 0, 0, 0, 0.1, 0, 0, 0, 4, 6, 0, 8)
mesh = SubResource("BoxMesh_lt54m")
[node name="Stairs" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 8)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Stairs"]
transform = Transform3D(0.849893, -0.526956, 0, 0.526956, 0.849893, 0, 0, 0, 1, 0, 2.51, 0)
shape = SubResource("BoxShape3D_fgmeq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Stairs"]
transform = Transform3D(8.05613, -0.0526956, 0, 4.99501, 0.0849893, 0, 0, 0, 4, 0, 2.51, 0)
mesh = SubResource("BoxMesh_thq07")
[node name="Ceiling" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0)
visible = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ceiling"]
shape = SubResource("BoxShape3D_xn166")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ceiling"]
transform = Transform3D(16, 0, 0, 0, 0.1, 0, 0, 0, 20, 0, 0, 0)
mesh = SubResource("BoxMesh_intbb")
[node name="Wall1" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 0, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Wall1"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
shape = SubResource("BoxShape3D_e0hgo")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Wall1"]
transform = Transform3D(1, 0, 0, 0, 10, 0, 0, 0, 20, 0, 5, 0)
mesh = SubResource("BoxMesh_qljsj")
[node name="Wall2" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 0, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Wall2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
shape = SubResource("BoxShape3D_0reu4")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Wall2"]
transform = Transform3D(1, 0, 0, 0, 10, 0, 0, 0, 20, 0, 5, 0)
mesh = SubResource("BoxMesh_8hngc")
[node name="Wall3" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -10)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Wall3"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
shape = SubResource("BoxShape3D_yaygu")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Wall3"]
transform = Transform3D(16, 0, 0, 0, 10, 0, 0, 0, 1, 0, 5, 0)
mesh = SubResource("BoxMesh_hwi1p")
[node name="Wall4" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Wall4"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
shape = SubResource("BoxShape3D_ktywj")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Wall4"]
transform = Transform3D(16, 0, 0, 0, 10, 0, 0, 0, 1, 0, 5, 0)
mesh = SubResource("BoxMesh_lm401")
[node name="Lights" type="Node3D" parent="."]
[node name="FirstFloorLight" type="OmniLight3D" parent="Lights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0)
light_energy = 6.0
shadow_enabled = true
omni_range = 40.0
omni_attenuation = 1.5
[node name="SecondFloorLight" type="OmniLight3D" parent="Lights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 9, 0)
visible = false
light_energy = 0.3
shadow_enabled = true
omni_range = 40.0
+63
View File
@@ -0,0 +1,63 @@
[gd_scene load_steps=7 format=3 uid="uid://d22gcvp7p2sfr"]
[ext_resource type="Script" path="res://scripts/in_game.gd" id="1_0lma2"]
[ext_resource type="PlaneMesh" uid="uid://dwpvym2kc4gd8" path="res://meshes/ground.tres" id="1_7j0qh"]
[ext_resource type="Material" uid="uid://chp3rogcgumau" path="res://materials/ground.tres" id="2_f8uto"]
[ext_resource type="PackedScene" uid="uid://cw0ho53ruh87m" path="res://scenes/house.tscn" id="4_38bom"]
[sub_resource type="Environment" id="Environment_2c67a"]
background_mode = 1
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.01
sdfgi_read_sky_light = false
glow_enabled = true
glow_normalized = true
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_1l61b"]
[node name="InGame" type="Node3D"]
script = ExtResource("1_0lma2")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_2c67a")
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
_spawnable_scenes = PackedStringArray("res://scenes/runner.tscn")
spawn_path = NodePath("../RunnersNode")
[node name="GroundStaticBody3D" type="StaticBody3D" parent="."]
[node name="GroundCollisionShape3D" type="CollisionShape3D" parent="GroundStaticBody3D"]
shape = SubResource("WorldBoundaryShape3D_1l61b")
[node name="GroundMeshInstance3D" type="MeshInstance3D" parent="GroundStaticBody3D"]
mesh = ExtResource("1_7j0qh")
surface_material_override/0 = ExtResource("2_f8uto")
[node name="House" parent="." instance=ExtResource("4_38bom")]
[node name="RunnersNode" type="Node3D" parent="."]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="Control" type="Control" parent="CanvasLayer"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="RichTextLabel" type="RichTextLabel" parent="CanvasLayer/Control"]
unique_name_in_owner = true
layout_mode = 0
offset_right = 200.0
offset_bottom = 50.0
[node name="PingTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 0.5
autostart = true
[connection signal="timeout" from="PingTimer" to="." method="_on_ping_timer_timeout"]
+67
View File
@@ -0,0 +1,67 @@
[gd_scene load_steps=2 format=3 uid="uid://qiew7wf7r8c4"]
[ext_resource type="Script" path="res://scripts/main_menu.gd" id="1_ivhyr"]
[node name="MainMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_ivhyr")
[node name="MainMenuPanel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ColorRect" type="ColorRect" parent="MainMenuPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.156863, 0.156863, 0.305882, 1)
[node name="MainMenuCenterContainer" type="CenterContainer" parent="MainMenuPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MainMenuVBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMenuCenterContainer"]
layout_mode = 2
[node name="IpAddressRichTextLabel" type="RichTextLabel" parent="MainMenuPanel/MainMenuCenterContainer/MainMenuVBoxContainer"]
custom_minimum_size = Vector2(0, 25)
layout_mode = 2
size_flags_vertical = 4
bbcode_enabled = true
text = "[center]Server Address[/center]"
scroll_active = false
[node name="IpAddressTextEdit" type="TextEdit" parent="MainMenuPanel/MainMenuCenterContainer/MainMenuVBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
size_flags_vertical = 4
placeholder_text = "localhost (default)"
[node name="JoinButtonSpacer" type="Control" parent="MainMenuPanel/MainMenuCenterContainer/MainMenuVBoxContainer"]
custom_minimum_size = Vector2(0, 15)
layout_mode = 2
[node name="JoinButton" type="Button" parent="MainMenuPanel/MainMenuCenterContainer/MainMenuVBoxContainer"]
custom_minimum_size = Vector2(200, 40)
layout_mode = 2
text = "Join"
text_overrun_behavior = 3
[connection signal="pressed" from="MainMenuPanel/MainMenuCenterContainer/MainMenuVBoxContainer/JoinButton" to="." method="_on_join_button_pressed"]
+85
View File
@@ -0,0 +1,85 @@
[gd_scene load_steps=12 format=3 uid="uid://8esyynmieyog"]
[ext_resource type="Script" path="res://scripts/runner.gd" id="1_d63rt"]
[ext_resource type="Script" path="res://scripts/runner_input.gd" id="2_xmliy"]
[ext_resource type="Material" uid="uid://ccrb46njti2ke" path="res://materials/runner.tres" id="3_6c0ro"]
[ext_resource type="Script" path="res://scripts/state_machine.gd" id="4_40cmc"]
[ext_resource type="Script" path="res://scripts/states/idle.gd" id="5_hq6tn"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ukf45"]
properties/0/path = NodePath(".:player_id")
properties/0/spawn = true
properties/0/replication_mode = 2
properties/1/path = NodePath(".:server_position")
properties/1/spawn = true
properties/1/replication_mode = 2
properties/2/path = NodePath(".:server_rotation")
properties/2/spawn = true
properties/2/replication_mode = 2
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_1agtp"]
properties/0/path = NodePath("RunnerInput:move_direction")
properties/0/spawn = true
properties/0/replication_mode = 2
[sub_resource type="SphereShape3D" id="SphereShape3D_wsx1k"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_j6tb3"]
radius = 0.3
height = 1.8
[sub_resource type="CapsuleMesh" id="CapsuleMesh_di3a0"]
radius = 0.3
height = 1.8
[sub_resource type="PrismMesh" id="PrismMesh_fcj1v"]
[node name="Runner" type="CharacterBody3D"]
script = ExtResource("1_d63rt")
[node name="RunnerSync" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_ukf45")
[node name="RunnerInput" type="MultiplayerSynchronizer" parent="."]
unique_name_in_owner = true
replication_config = SubResource("SceneReplicationConfig_1agtp")
script = ExtResource("2_xmliy")
[node name="RunnerCamera" type="Camera3D" parent="."]
unique_name_in_owner = true
[node name="CameraPivot" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
[node name="RunnerCameraSpringArm3D" type="SpringArm3D" parent="CameraPivot"]
shape = SubResource("SphereShape3D_wsx1k")
spring_length = 3.5
[node name="RunnerCameraTarget" type="Node3D" parent="CameraPivot/RunnerCameraSpringArm3D"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_j6tb3")
[node name="RunnerSkin" type="Node3D" parent="."]
unique_name_in_owner = true
[node name="MeshInstance3D" type="MeshInstance3D" parent="RunnerSkin"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
mesh = SubResource("CapsuleMesh_di3a0")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("3_6c0ro")
[node name="MeshInstance3D" type="MeshInstance3D" parent="RunnerSkin/MeshInstance3D"]
transform = Transform3D(0.35, 0, 0, 0, -1.09278e-08, 0.1, 0, -0.25, -4.37114e-09, 0, 0.65, -0.3)
mesh = SubResource("PrismMesh_fcj1v")
surface_material_override/0 = ExtResource("3_6c0ro")
[node name="StateMachine" type="Node" parent="."]
script = ExtResource("4_40cmc")
[node name="Idle" type="Node" parent="StateMachine"]
script = ExtResource("5_hq6tn")
+45
View File
@@ -0,0 +1,45 @@
extends Node3D
const template := "FPS: %d\nPing: %d ms"
var runner_scene := preload("res://scenes/runner.tscn")
var _ping := 0.0
var _runners_node: Node3D
func _ready() -> void:
_runners_node = get_node("RunnersNode")
func spawn_player(player_id) -> void:
if multiplayer.is_server():
var runner = runner_scene.instantiate()
runner.player_id = player_id
runner.name = str(player_id)
_runners_node.add_child(runner)
func _process(_delta: float) -> void:
if DisplayServer.get_name() == "headless":
return
%RichTextLabel.text = template % [
Engine.get_frames_per_second(),
_ping,
]
func _get_timestamp() -> int:
return floor(Time.get_unix_time_from_system() * 1000)
func _on_ping_timer_timeout() -> void:
if multiplayer.is_server():
%PingTimer.stop()
return
_ping_call.rpc_id(1, _get_timestamp())
@rpc("any_peer", "call_remote", "unreliable", 99)
func _ping_call(timestamp: int) -> void:
if multiplayer.is_server():
_ping_call.rpc_id(multiplayer.get_remote_sender_id(), timestamp)
return
_ping = _get_timestamp() - timestamp
+5
View File
@@ -0,0 +1,5 @@
extends Control
func _on_join_button_pressed() -> void:
MultiplayerManager.connect_to_ip(%IpAddressTextEdit.text)
get_tree().change_scene_to_file("res://scenes/in_game.tscn")
@@ -0,0 +1,58 @@
extends Node
const PORT = 1280
const IP_ADDRESS = "127.0.0.1"
const MAX_CLIENTS = 5
var in_game_scene = preload("res://scenes/in_game.tscn")
var main_menu_scene = preload("res://scenes/main_menu.tscn")
func _ready() -> void:
set_process(false)
set_physics_process(false)
if OS.has_feature("dedicated_server"):
get_tree().change_scene_to_packed.call_deferred(in_game_scene)
var peer = ENetMultiplayerPeer.new()
peer.create_server(PORT, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
multiplayer.peer_connected.connect(_on_connect)
multiplayer.peer_disconnected.connect(_on_disconnect)
else:
get_tree().change_scene_to_packed.call_deferred(main_menu_scene)
func connect_to_ip(ip: String = "") -> void:
if ip.is_empty():
ip = IP_ADDRESS
print("Connecting to: %s" % ip)
var peer = ENetMultiplayerPeer.new()
peer.create_client(ip, PORT)
multiplayer.multiplayer_peer = peer
multiplayer.connected_to_server.connect(_on_connect_client)
multiplayer.connection_failed.connect(_on_disconnect_client)
multiplayer.server_disconnected.connect(_on_server_closed_client)
func _on_connect(id: int) -> void:
print("Client ID #%s connected" % id)
get_tree().get_current_scene().spawn_player(id)
func _on_disconnect(id: int) -> void:
print("Client ID #%s disconnected" % id)
pass
func _on_connect_client() -> void:
print("[%s] Connected to server" % multiplayer.get_unique_id())
pass
func _on_disconnect_client() -> void:
print("[%s] Disconnected" % multiplayer.get_unique_id())
pass
func _on_server_closed_client() -> void:
print("[%s] Server closed" % multiplayer.get_unique_id())
pass
+97
View File
@@ -0,0 +1,97 @@
extends CharacterBody3D
const _gravity := -30.0
@export var player_id := 69:
set(id):
player_id = id
%RunnerInput.set_multiplayer_authority(id)
@export_group("Camera")
@export_range(0.0, 1.0) var mouse_sensitivity := 0.2
@export var camera_follow_speed := 10.0
@export var smooth_camera := false
@export_group("Movement")
@export var move_speed := 8.0
@export var acceleration := 30.0
@export var rotation_speed := 20.0
@export_group("Client Tweening")
@export var client_smoothing := false
@export var client_smoothing_speed := 5.0
@export var client_smoothing_rotation_speed := 10.0
@onready var _camera_pivot: Node3D = %CameraPivot
@onready var _camera_target: Node3D = %RunnerCameraTarget
@onready var _camera: Node3D = %RunnerCamera
@onready var _skin: Node3D = %RunnerSkin
var _camera_input_direction := Vector2.ZERO
var _last_direction := Vector3.FORWARD
var _on_ground := false
@export var server_position := Vector3.ZERO
@export var server_rotation := Vector3.ZERO
func _ready() -> void:
if multiplayer.is_server():
return
if multiplayer.get_unique_id() == player_id:
%RunnerCamera.make_current()
else:
%RunnerCamera.clear_current(false)
func _input(event: InputEvent) -> void:
if multiplayer.get_unique_id() != player_id:
return
if event.is_action_pressed("mouse_capture"):
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
elif event.is_action_pressed("mouse_release"):
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
if event is InputEventMouseMotion:
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
_camera_input_direction += event.screen_relative * mouse_sensitivity
func _physics_process(delta: float) -> void:
if multiplayer.get_unique_id() == player_id:
_camera_pivot.rotation.x = clamp(
_camera_pivot.rotation.x - _camera_input_direction.y * delta,
-PI / 3.0,
PI / 6.0,
)
_camera_pivot.rotation.y -= _camera_input_direction.x * delta
_camera.global_rotation = _camera_pivot.global_rotation
if smooth_camera:
_camera.global_position = lerp(_camera.global_position, _camera_target.global_position, camera_follow_speed * delta)
else:
_camera.global_position = _camera_target.global_position
_camera_input_direction = Vector2.ZERO
if multiplayer.is_server():
var move_direction = Vector3(%RunnerInput.move_direction.x, 0, %RunnerInput.move_direction.y)
var y_velocity := velocity.y
velocity = velocity.move_toward(move_direction * move_speed, acceleration * delta)
velocity.y = y_velocity + (_gravity * delta)
move_and_slide()
if move_direction.length() >= 0.1:
_last_direction = move_direction
var target_angle := Vector3.FORWARD.signed_angle_to(_last_direction, Vector3.UP)
_skin.global_rotation.y = lerp_angle(_skin.rotation.y, target_angle, rotation_speed * delta)
server_position = position
server_rotation = _skin.global_rotation
else:
if client_smoothing:
position = lerp(position, server_position, client_smoothing_speed * delta)
_skin.global_rotation.y = lerp_angle(_skin.global_rotation.y, server_rotation.y, client_smoothing_rotation_speed * delta)
else:
position = server_position
_skin.global_rotation.y = server_rotation.y
+16
View File
@@ -0,0 +1,16 @@
extends MultiplayerSynchronizer
var move_direction: Vector2
func _ready() -> void:
move_direction = Vector2.ZERO
if multiplayer.is_server() or get_multiplayer_authority() != multiplayer.get_unique_id():
set_process(false)
set_physics_process(false)
return
func _physics_process(_delta: float) -> void:
var directional_input := Input.get_vector("move_right", "move_left", "move_forward", "move_back")
var camera_adjusted: Vector3 = (directional_input.x * %RunnerCameraTarget.global_basis.z) + (directional_input.y * %RunnerCameraTarget.global_basis.x)
move_direction = Vector2(camera_adjusted.x, camera_adjusted.z).rotated(PI / 2.0)
+22
View File
@@ -0,0 +1,22 @@
class_name State
extends Node
@export var move_speed: float = 100.0
@export var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
var subject
func enter() -> void:
pass
func exit() -> void:
pass
func process_input(_event: InputEvent) -> State:
return null
func process_frame(_delta: float) -> State:
return null
func process_physics(_delta: float) -> State:
return null
+33
View File
@@ -0,0 +1,33 @@
extends Node
@export var starting_state: State
var current_state: State
func init(subject: Node) -> void:
for state in get_children():
state.subject = subject
_change_state(starting_state)
func _change_state(new_state: State) -> void:
if current_state:
current_state.exit()
current_state = new_state
current_state.enter()
func _physics_process(delta: float) -> void:
var new_state = current_state.process_physics(delta)
if new_state:
_change_state(new_state)
func _unhandled_input(event: InputEvent) -> void:
var new_state = current_state.process_input(event)
if new_state:
_change_state(new_state)
func _process(delta: float) -> void:
var new_state = current_state.process_frame(delta)
if new_state:
_change_state(new_state)
+4
View File
@@ -0,0 +1,4 @@
extends State
func process_physics(delta: float) -> State:
return