A lot of unrelated stuff
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
class_name CameraMount extends Node3D
|
||||
|
||||
@export var camera_name: String
|
||||
@export var input_camera: bool = false
|
||||
@export var input_camera: bool = true
|
||||
@onready var camera: Camera3D = $Camera3D
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
|
@ -10,24 +10,27 @@ var current_index: int = 0
|
||||
func _input(event: InputEvent) -> void:
|
||||
if not is_connectied_to_input_camera:
|
||||
if Input.is_action_just_pressed("next_camera"):
|
||||
switch_camera(1)
|
||||
change_camera(1)
|
||||
if Input.is_action_just_pressed("previous_camera"):
|
||||
switch_camera(-1)
|
||||
change_camera(-1)
|
||||
|
||||
func switch_camera(direction: int):
|
||||
func change_camera(direction: int):
|
||||
if available_cameras.size() > 0:
|
||||
current_index = (current_index + direction) % available_cameras.size()
|
||||
if current_index < 0:
|
||||
current_index = available_cameras.size() - 1 # Wrap around for negative index
|
||||
var camera_dict: Dictionary = available_cameras.values()[current_index]
|
||||
camera_dict.get("camera").make_current()
|
||||
is_conected_to_camera = true
|
||||
if camera_dict.get("input_camera"):
|
||||
is_connectied_to_input_camera = true
|
||||
switch_to_camera(camera_dict)
|
||||
|
||||
func switch_to_camera(camera_dict: Dictionary) -> void:
|
||||
camera_dict.get("camera").make_current()
|
||||
is_conected_to_camera = true
|
||||
if camera_dict.get("input_camera"):
|
||||
is_connectied_to_input_camera = true
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if not is_conected_to_camera:
|
||||
switch_camera(0)
|
||||
change_camera(0)
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
@ -35,10 +38,13 @@ func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
func register_camera(camera_name: String, input_camera: bool, camera: Camera3D):
|
||||
available_cameras[camera_name] = {
|
||||
var camera_dict: Dictionary = {
|
||||
"camera": camera,
|
||||
"input_camera": input_camera,
|
||||
}
|
||||
available_cameras[camera_name] = camera_dict
|
||||
if input_camera:
|
||||
switch_to_camera(camera_dict)
|
||||
|
||||
func remove_camera(camera_name: String, ):
|
||||
available_cameras.erase(camera_name)
|
||||
|
@ -8,7 +8,7 @@ func _on_load_level():
|
||||
var config_file_path: String = ""
|
||||
|
||||
@onready var main_menu: MainMenu = $MainMenu
|
||||
@onready var server: Server = $Server
|
||||
@onready var server: Server = ServerInstance
|
||||
|
||||
# -- Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
@ -36,10 +36,11 @@ func start_server():
|
||||
warning.visible = true
|
||||
main_menu.add_child(warning)
|
||||
warning.popup_centered()
|
||||
main_menu.visible = 0
|
||||
|
||||
func join_server():
|
||||
var err := server.join_server("127.0.0.1", 27015)
|
||||
|
||||
main_menu.visible = 0
|
||||
# -- Parse command line arguments
|
||||
func parse_args() -> void:
|
||||
var args := Array(OS.get_cmdline_args())
|
||||
|
@ -1,8 +1,7 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://0hsqnr1kunv5"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://0hsqnr1kunv5"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/entrypoint.gd" id="1_ce80t"]
|
||||
[ext_resource type="PackedScene" uid="uid://dt7rhpcor1wh7" path="res://src/interfaces/main_menu/main_menu.tscn" id="2_dd6gs"]
|
||||
[ext_resource type="PackedScene" uid="uid://dkvbrav2sgs7m" path="res://src/server/server.tscn" id="3_uv83k"]
|
||||
|
||||
[node name="Entrypoint" type="Node"]
|
||||
script = ExtResource("1_ce80t")
|
||||
@ -11,5 +10,3 @@ script = ExtResource("1_ce80t")
|
||||
editor_description = "This node should be used for storing the map that is currently loaded"
|
||||
|
||||
[node name="MainMenu" parent="." instance=ExtResource("2_dd6gs")]
|
||||
|
||||
[node name="Server" parent="." instance=ExtResource("3_uv83k")]
|
||||
|
@ -3,7 +3,6 @@ class_name MainMenu extends Control
|
||||
signal create_server()
|
||||
signal join_server()
|
||||
|
||||
|
||||
func _on_create_server_pressed() -> void:
|
||||
emit_signal("create_server")
|
||||
|
||||
|
3434
godot/src/scenes/characters/y-bot/A.tscn
Normal file
3434
godot/src/scenes/characters/y-bot/A.tscn
Normal file
File diff suppressed because one or more lines are too long
7
godot/src/scenes/characters/y-bot/y-bot.tscn
Normal file
7
godot/src/scenes/characters/y-bot/y-bot.tscn
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://b7xhiof4260yf"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://p85ukvwlrh5q" path="res://assets/models/characters/y-bot.glb" id="1_f1nh2"]
|
||||
|
||||
[node name="Y-bot" type="Node3D"]
|
||||
|
||||
[node name="y-bot" parent="." instance=ExtResource("1_f1nh2")]
|
22
godot/src/scenes/levels/_test/gym_map.tscn
Normal file
22
godot/src/scenes/levels/_test/gym_map.tscn
Normal file
@ -0,0 +1,22 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://w85pakfqbksh"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://bv4un06wgrpxw" path="res://assets/textures/kenny_prototype/Dark/texture_05.png" id="1_ntrfg"]
|
||||
[ext_resource type="PackedScene" uid="uid://b2ogo643mvror" path="res://src/scenes/player/player.tscn" id="2_hem5n"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_506q6"]
|
||||
albedo_texture = ExtResource("1_ntrfg")
|
||||
|
||||
[node name="GymMap" type="Node3D"]
|
||||
|
||||
[node name="Floor" type="CSGBox3D" parent="."]
|
||||
transform = Transform3D(0.699002, 0, -0.71512, 0, 1, 0, 0.71512, 0, 0.699002, 0, -0.5, 0)
|
||||
material_override = SubResource("StandardMaterial3D_506q6")
|
||||
use_collision = true
|
||||
size = Vector3(100, 1, 100)
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.0224081, 0.999749, 0, -0.999749, 0.0224081, 0, 24.4279, 0)
|
||||
|
||||
[node name="Objects" type="Node3D" parent="."]
|
||||
|
||||
[node name="PlayerController" parent="." instance=ExtResource("2_hem5n")]
|
@ -1,6 +1,7 @@
|
||||
# -- Client space should be a parent of the player controller node and
|
||||
# -- of the models that are managed by the client and not by the server
|
||||
class_name ClientSpace extends Node3D
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
@ -1,6 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://84qxu04nc7ue"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://84qxu04nc7ue"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/scenes/levels/base/client_space/client_space.gd" id="1_1m0ys"]
|
||||
[ext_resource type="PackedScene" uid="uid://bcxt4cnuh8u0g" path="res://src/scenes/player/player_controller/player_controller.tscn" id="2_cgrei"]
|
||||
|
||||
[node name="ClientSpace" type="Node3D"]
|
||||
script = ExtResource("1_1m0ys")
|
||||
|
||||
[node name="PlayerController" parent="." instance=ExtResource("2_cgrei")]
|
||||
|
@ -1,14 +1,32 @@
|
||||
class_name MapController extends Node3D
|
||||
|
||||
|
||||
@onready var spawn_controller: SpawnController = $SpawnLocations
|
||||
var player_space: Node3D = null
|
||||
var player_controller: PlayerNode = null
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
|
||||
func _ready() -> void:
|
||||
# -- We need to add the client space to the level
|
||||
var err : Error
|
||||
err = add_client_space()
|
||||
if err != OK:
|
||||
logger.error("can't load the client space")
|
||||
pass # Replace with function body.
|
||||
player_space = Node3D.new()
|
||||
player_space.name = "PlayerSpace"
|
||||
add_child(player_space)
|
||||
spawn_controller.player_space = player_space
|
||||
if multiplayer.is_server():
|
||||
pass
|
||||
else:
|
||||
# -- If not server, request all the players that are spanwed and
|
||||
request_state.rpc_id(1)
|
||||
pass
|
||||
|
||||
@rpc("any_peer", "call_remote", "reliable")
|
||||
func request_state():
|
||||
for player in player_space.find_children("PLayer", "ServerSideCharacter", false, true):
|
||||
var player_casted : ServerSideCharacter = player as ServerSideCharacter
|
||||
spawn_controller.spawn_player(player_casted.player_id, player_casted.global_transform)
|
||||
|
||||
func add_client_space() -> Error :
|
||||
return load_scene("levels/base/client_space/client_space.tscn")
|
||||
@ -23,6 +41,7 @@ func load_scene(rel_path: String) -> Error :
|
||||
if scene.can_instantiate():
|
||||
# -- TODO: May we should case to a real type instead
|
||||
var node: Variant = scene.instantiate()
|
||||
player_controller = node as PlayerNode
|
||||
logger.info("loading scene: " + path)
|
||||
add_child(node)
|
||||
else:
|
||||
@ -30,6 +49,20 @@ func load_scene(rel_path: String) -> Error :
|
||||
return ERR_CANT_OPEN
|
||||
return OK
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if multiplayer.is_server():
|
||||
for player in ServerInstance.players:
|
||||
if ServerInstance.players[player].size() == 0:
|
||||
logger.info("player is not ready yet, id " + str(player))
|
||||
return
|
||||
if ! ServerInstance.players[player]["game_data"]["is_spawned"]:
|
||||
var team: String = ServerInstance.players[player]["game_data"]["team"]
|
||||
if team != consts.TEAM_UNDEFINED:
|
||||
logger.info("Spawning a player, id " + str(player))
|
||||
spawn_controller.prepare_spawn_location(player, team)
|
||||
ServerInstance.players[player]["game_data"]["is_spawned"] = true
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
@ -0,0 +1,18 @@
|
||||
class_name PlayerModelSpace extends Node3D
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
# -- If not server, request the server to send all the players
|
||||
if ! multiplayer.is_server():
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
@rpc("any_peer", "call_remote", "reliable")
|
||||
func get_existing_players() -> void:
|
||||
if multiplayer.is_server():
|
||||
for child in get_childer():
|
@ -0,0 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://d2am7vhli4gv8"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/scenes/levels/base/player_model_space/player_model_space.gd" id="1_0cb1a"]
|
||||
|
||||
[node name="PlayerModelSpace" type="Node3D"]
|
||||
script = ExtResource("1_0cb1a")
|
@ -0,0 +1,3 @@
|
||||
[gd_scene format=3 uid="uid://d1jfdbeko82rf"]
|
||||
|
||||
[node name="PlayerModelsSpace" type="Node3D"]
|
71
godot/src/scenes/levels/base/spawn_controller.gd
Normal file
71
godot/src/scenes/levels/base/spawn_controller.gd
Normal file
@ -0,0 +1,71 @@
|
||||
class_name SpawnController extends Node3D
|
||||
|
||||
var attack_spawners: Array[Node3D]
|
||||
var defend_spawners: Array[Node3D]
|
||||
|
||||
var server_side_character_scene: PackedScene = null
|
||||
var server_side_character_path: String = "player/server_side_character/server_side_character.tscn"
|
||||
|
||||
var player_space: Node3D
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
var err : Error = load_scene(server_side_character_path)
|
||||
if err != OK:
|
||||
logger.error("coudn't load the spawnable node, err " + str(err))
|
||||
if multiplayer.is_server():
|
||||
for spawner in $Attack.get_children():
|
||||
attack_spawners.append(spawner)
|
||||
for spawner in $Defend.get_children():
|
||||
defend_spawners.append(spawner)
|
||||
else:
|
||||
get_existing_players.rpc_id(1)
|
||||
|
||||
func prepare_spawn_location(id: int, team: String):
|
||||
logger.debug("preparing spawn location")
|
||||
var transform : Transform3D
|
||||
match team:
|
||||
consts.TEAM_ATTACK:
|
||||
transform = attack_spawners[0].global_transform
|
||||
attack_spawners.append(attack_spawners.pop_front())
|
||||
consts.TEAM_DEFEND:
|
||||
transform = defend_spawners[0].global_transform
|
||||
defend_spawners.append(defend_spawners.pop_front())
|
||||
consts.TEAM_UNDEFINED:
|
||||
logger.warning("can't spawn a player, the team is undefined")
|
||||
_:
|
||||
logger.warning("can't spawn a player, unknown team")
|
||||
logger.debug("triggering spawn")
|
||||
spawn_player.rpc(id, transform)
|
||||
|
||||
@rpc("any_peer", "call_remote", "reliable")
|
||||
func get_existing_players() -> void:
|
||||
if multiplayer.is_server():
|
||||
for child in player_space.get_children():
|
||||
# -- TODO: It must no look like that
|
||||
if child.name != str(multiplayer.get_unique_id()):
|
||||
spawn_player.rpc_id(multiplayer.get_remote_sender_id(), child.player_id, child.global_transform)
|
||||
|
||||
@rpc("authority", "reliable", "call_local")
|
||||
func spawn_player(id: int, transform: Transform3D):
|
||||
logger.info("spawn is triggered " + str(multiplayer.get_unique_id()) + " " + str(id))
|
||||
var node: ServerSideCharacter = server_side_character_scene.instantiate()
|
||||
node.player_id = id
|
||||
node.global_transform = transform
|
||||
node.name = str(id)
|
||||
player_space.add_child(node)
|
||||
|
||||
# -- TODO: It should be defined once, stop copy-pasting
|
||||
func load_scene(rel_path: String) -> Error :
|
||||
var path := consts.SCENES_PATH + rel_path
|
||||
logger.info("loading scene from " + path)
|
||||
if not ResourceLoader.exists(path):
|
||||
logger.error("scene " + path + " doesn't exist")
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if scene.can_instantiate():
|
||||
# -- TODO: May we should case to a real type instead
|
||||
server_side_character_scene = scene
|
||||
else:
|
||||
logger.error("can't initialize")
|
||||
return ERR_CANT_OPEN
|
||||
return OK
|
3
godot/src/scenes/levels/base/spawn_controller.tscn
Normal file
3
godot/src/scenes/levels/base/spawn_controller.tscn
Normal file
@ -0,0 +1,3 @@
|
||||
[gd_scene format=3 uid="uid://d3ptagl48oeyi"]
|
||||
|
||||
[node name="SpawnController" type="Node3D"]
|
@ -1,7 +1,8 @@
|
||||
[gd_scene load_steps=76 format=4 uid="uid://bmr6gia17jryx"]
|
||||
[gd_scene load_steps=77 format=4 uid="uid://bmr6gia17jryx"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/scenes/levels/base/map_controller.gd" id="1_g7bor"]
|
||||
[ext_resource type="PackedScene" uid="uid://bg24niws4pbnj" path="res://src/camera/camera_mount/camera_mount.tscn" id="2_vio63"]
|
||||
[ext_resource type="Script" path="res://src/scenes/levels/base/spawn_controller.gd" id="3_ovp7d"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_l214l"]
|
||||
resource_name = "New_Material"
|
||||
@ -750,7 +751,7 @@ sky_material = SubResource("ProceduralSkyMaterial_ypa5s")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_t783h"]
|
||||
background_mode = 2
|
||||
background_energy_multiplier = 0.0
|
||||
background_energy_multiplier = 0.5
|
||||
sky = SubResource("Sky_svaok")
|
||||
|
||||
[node name="Map" type="Node3D"]
|
||||
@ -946,6 +947,7 @@ transform = Transform3D(1, 0, 0, 0, -0.254112, 0.967175, 0, -0.967175, -0.254112
|
||||
camera_name = "ObservingCamera2"
|
||||
|
||||
[node name="SpawnLocations" type="Node3D" parent="."]
|
||||
script = ExtResource("3_ovp7d")
|
||||
|
||||
[node name="Attack" type="Node3D" parent="SpawnLocations"]
|
||||
|
||||
@ -956,3 +958,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -42.4604, 0, 0)
|
||||
|
||||
[node name="1" type="Node3D" parent="SpawnLocations/Defend"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 54.7065, 0, 0)
|
||||
|
||||
[node name="2" type="Node3D" parent="SpawnLocations/Defend"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 54.1302, 0, 5.33245)
|
||||
|
60
godot/src/scenes/player/aiming_modifier.gd
Normal file
60
godot/src/scenes/player/aiming_modifier.gd
Normal file
@ -0,0 +1,60 @@
|
||||
@tool
|
||||
|
||||
class_name AimingModifier
|
||||
extends SkeletonModifier3D
|
||||
|
||||
@export var look_raycast: RayCast3D
|
||||
@export var aim_raycast: RayCast3D
|
||||
|
||||
@export_enum(" ") var bone: String
|
||||
@export var aiming: bool = false
|
||||
|
||||
func _validate_property(property: Dictionary) -> void:
|
||||
if property.name == "bone":
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if skeleton:
|
||||
property.hint = PROPERTY_HINT_ENUM
|
||||
property.hint_string = skeleton.get_concatenated_bone_names()
|
||||
|
||||
func _process_modification() -> void:
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if !skeleton:
|
||||
return
|
||||
var bone_idx: int = skeleton.find_bone(bone)
|
||||
if bone_idx == -1:
|
||||
return
|
||||
|
||||
var target_position = look_raycast.get_collision_point() if look_raycast.is_colliding() else look_raycast.global_transform.origin + look_raycast.global_transform.basis.z * 30
|
||||
var target_position_local = to_local(target_position)
|
||||
aim_raycast.= target_position
|
||||
print(target_position_local)
|
||||
|
||||
var bone_pose = skeleton.get_bone_global_pose(bone_idx)
|
||||
#print(new_basis)
|
||||
|
||||
#skeleton.set_bone_global_pose(bone_idx, Transform3D(bone_pose.basis, bone_pose.origin + Vector3(0, 0, 1)))
|
||||
|
||||
func z_and_y_inverse(v : Vector3) -> Vector3 :
|
||||
var tmp: float = v.x
|
||||
v.x = v.y
|
||||
v.y = tmp
|
||||
return v
|
||||
|
||||
#var aim_position = aim_raycast.get_collision_point() if aim_raycast.is_colliding() else aim_raycast.global_transform.origin + aim_raycast.global_transform.basis.z * 20
|
||||
#var aim_position_local = to_local(aim_position)
|
||||
#var direction = (target_position_local - to_local(aim_raycast.global_transform.origin)).normalized()
|
||||
#var new_transform = Transform3D().looking_at(target_position_local, Vector3.UP)
|
||||
#skeleton.set_bone_pose_rotation(bone, new_transform.basis.get_euler())
|
||||
|
||||
#var gun_position = aim_raycast.global_transform.origin
|
||||
#var gun_direction = (target_position - gun_position).normalized()
|
||||
#if aiming:
|
||||
#var new_pose = upper_arm_transform.looking_at(target_position, Vector3.FORWARD, true)
|
||||
#var new_basis: Basis
|
||||
#new_basis.y = new_pose.basis.y
|
||||
#new_basis.y.y = -new_basis.y.y
|
||||
#new_basis.z = new_pose.basis.z
|
||||
#new_basis.x = new_pose.basis.x
|
||||
#new_pose.basis = new_basis
|
||||
#
|
||||
#skeleton.set_bone_global_pose(bone_idx, new_pose)
|
45
godot/src/scenes/player/body_follows_head_modifier.gd
Normal file
45
godot/src/scenes/player/body_follows_head_modifier.gd
Normal file
@ -0,0 +1,45 @@
|
||||
@tool
|
||||
|
||||
class_name BodyFollowsHead
|
||||
extends SkeletonModifier3D
|
||||
|
||||
@export_enum(" ") var head: String
|
||||
@export_enum(" ") var hips: String
|
||||
|
||||
func _validate_property(property: Dictionary) -> void:
|
||||
if property.name == "head":
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if skeleton:
|
||||
property.hint = PROPERTY_HINT_ENUM
|
||||
property.hint_string = skeleton.get_concatenated_bone_names()
|
||||
if property.name == "hips":
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if skeleton:
|
||||
property.hint = PROPERTY_HINT_ENUM
|
||||
property.hint_string = skeleton.get_concatenated_bone_names()
|
||||
|
||||
func _process_modification() -> void:
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if !skeleton:
|
||||
return
|
||||
var head_idx: int = skeleton.find_bone(head)
|
||||
var head_pose: Transform3D = skeleton.get_bone_global_pose(head_idx)
|
||||
var hips_idx: int = skeleton.find_bone(hips)
|
||||
var hips_pose: Transform3D = skeleton.get_bone_global_pose(hips_idx)
|
||||
|
||||
var new_basis: Basis
|
||||
new_basis.y = Vector3.UP
|
||||
|
||||
#
|
||||
#var hips_basis: Basis = hips_pose.basis
|
||||
#var head_basis: Basis = head_pose.basis
|
||||
#var head_yaw = head_basis.get_euler().y # Y-axis rotation in radians
|
||||
#var hips_euler = hips_basis.get_euler()
|
||||
#var hips_yaw = hips_euler.x
|
||||
#var new_yaw = lerp_angle(hips_yaw, head_yaw, 100)
|
||||
#hips_euler.x = new_yaw
|
||||
#hips_basis = Basis.from_euler(hips_euler)
|
||||
|
||||
# Apply the new transform back to the skeleton
|
||||
hips_pose.basis = hips_basis
|
||||
skeleton.set_bone_global_pose(hips_idx, hips_pose)
|
14
godot/src/scenes/player/character/character.tscn
Normal file
14
godot/src/scenes/player/character/character.tscn
Normal file
@ -0,0 +1,14 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://mv5nlhvdh14v"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_g8geq"]
|
||||
radius = 0.4
|
||||
height = 1.8
|
||||
|
||||
[node name="Character" type="CharacterBody3D"]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
|
||||
shape = SubResource("CapsuleShape3D_g8geq")
|
||||
|
||||
[node name="CameraMountPoint" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.167045, 1.31595, 0)
|
42
godot/src/scenes/player/look_forward_modifier.gd
Normal file
42
godot/src/scenes/player/look_forward_modifier.gd
Normal file
@ -0,0 +1,42 @@
|
||||
@tool
|
||||
|
||||
class_name LookForwardModifier
|
||||
extends SkeletonModifier3D
|
||||
|
||||
@export var target_object: Marker3D
|
||||
@export var head_marker: Marker3D
|
||||
@export_enum(" ") var bone: String
|
||||
|
||||
func _validate_property(property: Dictionary) -> void:
|
||||
if property.name == "bone":
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if skeleton:
|
||||
property.hint = PROPERTY_HINT_ENUM
|
||||
property.hint_string = skeleton.get_concatenated_bone_names()
|
||||
|
||||
func _process_modification() -> void:
|
||||
var skeleton: Skeleton3D = get_skeleton()
|
||||
if !skeleton:
|
||||
return
|
||||
var bone_idx: int = skeleton.find_bone(bone)
|
||||
if bone_idx == -1:
|
||||
return
|
||||
|
||||
var target_position_global: Vector3 = target_object.global_position
|
||||
var target_position_local: Vector3 = to_local(target_position_global)
|
||||
var head_bone_pose: Transform3D = skeleton.get_bone_global_pose(bone_idx)
|
||||
var new_pose: Transform3D = head_bone_pose.looking_at(target_position_local, Vector3.FORWARD, true)
|
||||
|
||||
var new_basis: Basis
|
||||
new_basis.y = new_pose.basis.y
|
||||
new_basis.z = new_pose.basis.z
|
||||
new_basis.x = new_pose.basis.x
|
||||
new_pose.basis = new_basis
|
||||
|
||||
skeleton.set_bone_global_pose(bone_idx, new_pose)
|
||||
|
||||
func z_and_y_inverse(v : Vector3) -> Vector3 :
|
||||
var tmp: float = v.z
|
||||
v.z = v.y
|
||||
v.y = tmp
|
||||
return v
|
29
godot/src/scenes/player/player.gd
Normal file
29
godot/src/scenes/player/player.gd
Normal file
@ -0,0 +1,29 @@
|
||||
extends Node3D
|
||||
|
||||
|
||||
const SPEED = 5.0
|
||||
const JUMP_VELOCITY = 4.5
|
||||
var camera_sens: float = 0.002
|
||||
|
||||
@onready var player_camera: Node3D = $VisualsController/Camera/CameraMount
|
||||
@onready var marker = $LookDirection
|
||||
@onready var eye_marker: Marker3D = $EyeMarker
|
||||
@onready var movement_contrller: Node3D = $MovementController
|
||||
@onready var v_rotation: Node3D = $MovementController/VRotation
|
||||
@onready var visual_controller: Node3D = $VisualsController
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||
var look_dir = event.relative * 1
|
||||
movement_contrller.rotation.y -= look_dir.x * camera_sens * 1.0
|
||||
v_rotation.rotation.x = clamp(
|
||||
v_rotation.rotation.x - look_dir.y * camera_sens * 1.0, -1.5, 1.5
|
||||
)
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
|
||||
visual_controller.global_rotation.y = lerp_angle(visual_controller.global_rotation.y, movement_contrller.global_rotation.y, 0.3)
|
||||
|
||||
pass
|
||||
func _ready() -> void:
|
||||
$VisualsController/Model/Armature/Skeleton3D/SkeletonIK3D.start()
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
3558
godot/src/scenes/player/player.tscn
Normal file
3558
godot/src/scenes/player/player.tscn
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,92 @@
|
||||
class_name PlayerNode extends Node3D
|
||||
|
||||
var jumping: bool = false
|
||||
var shooting: bool = false
|
||||
var moving: bool = false
|
||||
var look_dir: Vector2
|
||||
var input_direction: Vector2
|
||||
var camera_sens: float = 0.002
|
||||
|
||||
var camera_gt_prev: Transform3D
|
||||
var camera_gt_cur: Transform3D
|
||||
var update_camera: bool = false
|
||||
|
||||
var is_connected_to_server = false
|
||||
@onready var body: CharacterBody3D = $Character
|
||||
@onready var camera_mount_point: Node3D = $Character/CameraMountPoint
|
||||
@onready var camera_mount: CameraMount = $CameraMount
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
set_multiplayer_authority(multiplayer.get_unique_id())
|
||||
camera_mount.global_transform = camera_mount_point.global_transform
|
||||
camera_gt_prev = camera_mount.global_transform
|
||||
camera_gt_cur = camera_mount.global_transform
|
||||
|
||||
func update_camera_transform() -> void :
|
||||
camera_gt_prev = camera_gt_cur
|
||||
camera_gt_cur = camera_mount_point.global_transform
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
if Input.is_action_just_pressed("jump"):
|
||||
jump()
|
||||
|
||||
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||
look_dir = event.relative * 1
|
||||
body.rotation.y -= look_dir.x * camera_sens * 1.0
|
||||
camera_mount_point.rotation.x = clamp(
|
||||
camera_mount_point.rotation.x - look_dir.y * camera_sens * 1.0, -1.5, 1.5
|
||||
)
|
||||
|
||||
input_direction = Input.get_vector(
|
||||
"move_left", "move_right", "move_forward", "move_backward"
|
||||
)
|
||||
|
||||
if Input.is_action_just_pressed("shoot"):
|
||||
shooting = true
|
||||
if Input.is_action_just_released("shoot"):
|
||||
shooting = false
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
update_camera = true
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
|
||||
if not body.is_on_floor():
|
||||
body.velocity += body.get_gravity() * delta
|
||||
if body.is_on_floor() && jumping:
|
||||
body.velocity.y = consts.DEFAULT_JUMP_VELOCITY
|
||||
|
||||
#if shooting:
|
||||
jumping = false
|
||||
|
||||
|
||||
var direction := (
|
||||
(body.transform.basis * Vector3(input_direction.x, 0, input_direction.y))
|
||||
. normalized()
|
||||
)
|
||||
if body.is_on_floor():
|
||||
if direction:
|
||||
body.velocity.x = direction.x * consts.DEFAULT_CHARACTER_SPEED
|
||||
body.velocity.z = direction.z * consts.DEFAULT_CHARACTER_SPEED
|
||||
else:
|
||||
body.velocity.x = move_toward(
|
||||
body.velocity.x, 0, consts.DEFAULT_CHARACTER_SPEED
|
||||
)
|
||||
body.velocity.z = move_toward(
|
||||
body.velocity.z, 0, consts.DEFAULT_CHARACTER_SPEED
|
||||
)
|
||||
body.move_and_slide()
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
# -- TODO: Rewrite it
|
||||
if not is_connected_to_server:
|
||||
var map_controller: MapController = find_parent("Map")
|
||||
if update_camera:
|
||||
update_camera_transform()
|
||||
update_camera = false
|
||||
var f = clamp(Engine.get_physics_interpolation_fraction(), 0 , 1)
|
||||
camera_mount.global_transform = camera_gt_prev.interpolate_with(camera_gt_cur, f)
|
||||
func jump():
|
||||
jumping = true
|
@ -0,0 +1,15 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bcxt4cnuh8u0g"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://mv5nlhvdh14v" path="res://src/scenes/player/character/character.tscn" id="1_1fx4c"]
|
||||
[ext_resource type="Script" path="res://src/scenes/player/player_controller/player_controller.gd" id="1_v31xn"]
|
||||
[ext_resource type="PackedScene" uid="uid://bg24niws4pbnj" path="res://src/camera/camera_mount/camera_mount.tscn" id="2_csswn"]
|
||||
|
||||
[node name="PlayerController" type="Node3D"]
|
||||
script = ExtResource("1_v31xn")
|
||||
|
||||
[node name="CameraMount" parent="." instance=ExtResource("2_csswn")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.80384, 0)
|
||||
camera_name = "PlayerCamera"
|
||||
input_camera = true
|
||||
|
||||
[node name="Character" parent="." instance=ExtResource("1_1fx4c")]
|
32
godot/src/scenes/player/player_movement.gd
Normal file
32
godot/src/scenes/player/player_movement.gd
Normal file
@ -0,0 +1,32 @@
|
||||
extends CharacterBody3D
|
||||
@onready var animation_player = $"../VisualsController/Model/AnimationPlayer"
|
||||
|
||||
|
||||
const SPEED = 5.0
|
||||
const JUMP_VELOCITY = 4.5
|
||||
var camera_sens: float = 0.002
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
|
||||
# Handle jump.
|
||||
if Input.is_action_just_pressed("jump") and is_on_floor():
|
||||
velocity.y = JUMP_VELOCITY
|
||||
|
||||
# Get the input direction and handle the movement/deceleration.
|
||||
# As good practice, you should replace UI actions with custom gameplay actions.
|
||||
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
|
||||
var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
||||
if direction:
|
||||
animation_player.play("Walk-aim")
|
||||
velocity.x = direction.x * SPEED
|
||||
velocity.z = direction.z * SPEED
|
||||
else:
|
||||
animation_player.pause()
|
||||
velocity.x = move_toward(velocity.x, 0, SPEED)
|
||||
velocity.z = move_toward(velocity.z, 0, SPEED)
|
||||
|
||||
move_and_slide()
|
@ -0,0 +1,41 @@
|
||||
class_name ServerSideCharacter extends Node3D
|
||||
|
||||
var local_prev_position: Transform3D
|
||||
var local_cur_position: Transform3D
|
||||
var update_local_node := false
|
||||
|
||||
var player_id: int
|
||||
@onready var local_node: Node3D = $LocalNode
|
||||
@onready var server_node: Node3D = $ServerNode
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
server_node.global_transform = global_transform
|
||||
local_node.set_multiplayer_authority(multiplayer.get_unique_id())
|
||||
local_node.global_transform = server_node.global_transform
|
||||
|
||||
local_prev_position = local_node.global_transform
|
||||
local_cur_position = local_node.global_transform
|
||||
$LocalNode.set_multiplayer_authority(multiplayer.get_unique_id())
|
||||
|
||||
func update_local_transform() -> void :
|
||||
local_prev_position = local_cur_position
|
||||
local_cur_position = server_node.global_transform
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
update_local_node = true
|
||||
|
||||
if multiplayer.is_server():
|
||||
sync_transform.rpc(global_transform)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if update_local_node:
|
||||
update_local_transform()
|
||||
update_local_node = false
|
||||
var f = clamp(Engine.get_physics_interpolation_fraction(), 0 , 1)
|
||||
local_node.global_transform = local_prev_position.interpolate_with(local_cur_position, f)
|
||||
|
||||
@rpc("authority", "call_remote", "unreliable")
|
||||
func sync_transform(transform: Transform3D) -> void :
|
||||
server_node.global_transform = transform
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
@ -0,0 +1,16 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://di0necvyvluy7"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://mv5nlhvdh14v" path="res://src/scenes/player/character/character.tscn" id="1_n6me3"]
|
||||
[ext_resource type="Script" path="res://src/scenes/player/server_side_character/server_side_character.gd" id="1_vm82e"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5dqvb"]
|
||||
albedo_color = Color(1, 0, 1, 1)
|
||||
|
||||
[node name="ServerSideCharacter" type="Node3D"]
|
||||
script = ExtResource("1_vm82e")
|
||||
|
||||
[node name="ServerNode" parent="." instance=ExtResource("1_n6me3")]
|
||||
|
||||
[node name="LocalNode" type="CSGBox3D" parent="."]
|
||||
size = Vector3(1, 4, 4)
|
||||
material = SubResource("StandardMaterial3D_5dqvb")
|
15
godot/src/scenes/player/visuals_controller.gd
Normal file
15
godot/src/scenes/player/visuals_controller.gd
Normal file
@ -0,0 +1,15 @@
|
||||
extends Node3D
|
||||
|
||||
@export var movement_controller: CharacterBody3D
|
||||
@onready var skeleton: Skeleton3D = $Model/Armature/Skeleton3D
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _physics_process(delta: float) -> void:
|
||||
global_position = movement_controller.global_position
|
||||
# -- Get the head rotation on x
|
||||
# -- Rotate the body on x
|
||||
var bone_idx: int = skeleton.find_bone("mixamorig_Head")
|
||||
if bone_idx == -1:
|
||||
return
|
||||
#global_rotation.y = head_pose.y
|
||||
pass
|
445
godot/src/scenes/weapon/ak-47.tscn
Normal file
445
godot/src/scenes/weapon/ak-47.tscn
Normal file
File diff suppressed because one or more lines are too long
15
godot/src/scripts/get_all_bones_positions.gd
Normal file
15
godot/src/scripts/get_all_bones_positions.gd
Normal file
@ -0,0 +1,15 @@
|
||||
@tool
|
||||
extends EditorScript
|
||||
|
||||
# Called when the script is executed (using File -> Run in Script Editor).
|
||||
func _run():
|
||||
var scene_path = "res://src/scenes/player/player.tscn"
|
||||
var scene: PackedScene = ResourceLoader.load(scene_path)
|
||||
var node: Node3D = scene.instantiate()
|
||||
var skeleton: Skeleton3D = node.find_child("Skeleton3D")
|
||||
var count = skeleton.get_bone_count()
|
||||
for i in count:
|
||||
#print(skeleton.get_bone_global_pose(i))
|
||||
print(skeleton.get_bone_pose_position(i))
|
||||
print(skeleton.get_bone_pose_rotation(i))
|
||||
print(skeleton)
|
@ -47,6 +47,7 @@ func send_profile_id(profile_id: String) -> void:
|
||||
players[id]["game_data"] = {
|
||||
"team": consts.TEAM_DEFEND,
|
||||
"is_alive": false,
|
||||
"is_spawned": false,
|
||||
"stats": {
|
||||
"kills": 0,
|
||||
"headshots": 0,
|
||||
|
@ -7,4 +7,4 @@ const SCENES_PATH: String = "res://src/scenes/"
|
||||
|
||||
const TEAM_UNDEFINED = "undefined"
|
||||
const TEAM_ATTACK = "attack"
|
||||
const TEAM_DEFEND = "defent"
|
||||
const TEAM_DEFEND = "defend"
|
||||
|
Reference in New Issue
Block a user