Huge amount of updates
This commit is contained in:
@ -12,15 +12,15 @@ config_version=5
|
||||
|
||||
config/name="Killbox"
|
||||
config/version="0.1.0"
|
||||
run/main_scene="res://scenes/game_root/game_root.tscn"
|
||||
run/main_scene="res://scenes/utils/game_root/game_root.tscn"
|
||||
config/features=PackedStringArray("4.3", "Forward Plus")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[autoload]
|
||||
|
||||
logger="*res://scenes/utils/logger.gd"
|
||||
consts="*res://scenes/utils/consts.gd"
|
||||
GameServerAutoload="*res://scenes/server/server.gd"
|
||||
helpers="*res://scenes/helpers/functions.gd"
|
||||
consts="*res://scenes/helpers/consts.gd"
|
||||
logger="*res://scenes/helpers/logger.gd"
|
||||
|
||||
[display]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=20 format=4 uid="uid://ddwrs0so7swxn"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/characters/character_wrapper.gd" id="1_k4p2i"]
|
||||
[ext_resource type="Script" path="res://scenes/characters/hit_detected.gd" id="2_oqdj0"]
|
||||
[ext_resource type="Script" path="res://scenes_old/characters/character_wrapper.gd" id="1_k4p2i"]
|
||||
[ext_resource type="Script" path="res://scenes_old/characters/hit_detected.gd" id="2_oqdj0"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_su866"]
|
||||
resource_name = "Alpha_Joints_MAT"
|
||||
|
@ -1,106 +0,0 @@
|
||||
extends Node
|
||||
class_name GameRoot
|
||||
|
||||
signal load_map(name: String)
|
||||
|
||||
# -- config from args
|
||||
var config_file: String = ""
|
||||
|
||||
const MAIN_MENU_SCENE := "res://scenes/menus/main/main_menu.tscn"
|
||||
|
||||
@onready var level_root: Node3D = $LevelLoader/Level
|
||||
@onready var level_spawner: MultiplayerSpawner = $LevelLoader/MultiplayerSpawner
|
||||
|
||||
func _parse_args() -> void:
|
||||
var args := Array(OS.get_cmdline_args())
|
||||
|
||||
var config_arg: String = "--config"
|
||||
if args.has(config_arg):
|
||||
var index := args.find(config_arg)
|
||||
config_file = args[index + 1]
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
_parse_args()
|
||||
|
||||
if OS.has_feature("dedicated_server") or DisplayServer.get_name() == "headless":
|
||||
var err := _start_dedicated_server()
|
||||
if err != OK:
|
||||
logger.error("couldn't start the server, err is " + str(err))
|
||||
else:
|
||||
var err := _start_game()
|
||||
if err != OK:
|
||||
logger.error("couldn't start the game, err is " + str(err))
|
||||
|
||||
func _start_dedicated_server() -> Error:
|
||||
if config_file != "":
|
||||
logger.info("reading config from the file: " + config_file)
|
||||
logger.info("starting in the dedicated server mode")
|
||||
return OK
|
||||
|
||||
|
||||
func _start_game() -> Error:
|
||||
logger.info("starting in the game mode")
|
||||
|
||||
if not ResourceLoader.exists(MAIN_MENU_SCENE):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(MAIN_MENU_SCENE)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
|
||||
var node: MainMenu = scene.instantiate()
|
||||
add_child(node)
|
||||
return OK
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
|
||||
func _on_load_map(map_name: String) -> void:
|
||||
for c in level_root.get_children():
|
||||
level_root.remove_child(c)
|
||||
c.queue_free()
|
||||
|
||||
var path_tmpl := "res://scenes/maps/maps/%s"
|
||||
var path := path_tmpl % map_name
|
||||
|
||||
if not ResourceLoader.exists(path):
|
||||
logger.error("map " + map_name + " doesn't exist")
|
||||
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if scene.can_instantiate():
|
||||
var node: Node3D = scene.instantiate()
|
||||
logger.info("loading map: " + map_name)
|
||||
$LevelLoader/MultiplayerSpawner.spawn_function = _map_spawn_function
|
||||
$LevelLoader/MultiplayerSpawner.spawn(map_name)
|
||||
#level_root.add_child(node)
|
||||
else:
|
||||
logger.error("Can't initialize")
|
||||
|
||||
var thread: Thread
|
||||
var map_node: Node
|
||||
var mutex: Mutex
|
||||
|
||||
func _load_the_map_in_thread(map_name):
|
||||
var path_tmpl := "res://scenes/maps/maps/%s"
|
||||
var path := path_tmpl % map_name
|
||||
|
||||
if not ResourceLoader.exists(path):
|
||||
logger.error("map " + map_name + " doesn't exist")
|
||||
mutex.lock()
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if scene.can_instantiate():
|
||||
map_node = scene.instantiate()
|
||||
mutex.unlock()
|
||||
|
||||
func _map_spawn_function(map_name: Variant) -> Node:
|
||||
thread = Thread.new()
|
||||
mutex = Mutex.new()
|
||||
thread.start(Callable(self, "_load_the_map_in_thread").bind(map_name))
|
||||
await thread.wait_to_finish()
|
||||
mutex.lock()
|
||||
var result = map_node
|
||||
mutex.unlock()
|
||||
return result
|
||||
|
@ -1,9 +0,0 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://d3qjxw4rk4yn4"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/game_root/game_root.gd" id="1_eb14f"]
|
||||
|
||||
[node name="GameRoot" type="Node"]
|
||||
editor_description = "This node serves a starting point for the game. When the game is running as a dedicated server it's supposed to read the config file and start the server, when the game is running in a default mode, it should render the main menu"
|
||||
script = ExtResource("1_eb14f")
|
||||
|
||||
[connection signal="load_map" from="." to="." method="_on_load_map"]
|
49
godot/scenes/helpers/functions.gd
Normal file
49
godot/scenes/helpers/functions.gd
Normal file
@ -0,0 +1,49 @@
|
||||
class_name Functions extends Node
|
||||
|
||||
func get_root_node() -> GameRoot:
|
||||
return get_tree().get_root().find_child("GameRoot", true, false)
|
||||
|
||||
func get_server_node() -> ServerData:
|
||||
return get_tree().get_root().find_child("ServerData", true, false)
|
||||
|
||||
func get_map_node() -> MapController:
|
||||
return get_tree().get_root().find_child("Map", true, false)
|
||||
|
||||
func player_data_into_dict(player_data: PlayerData) -> Dictionary:
|
||||
var result: Dictionary = {
|
||||
"id": player_data.id,
|
||||
"username": player_data.id,
|
||||
"score": player_data.score,
|
||||
"damage": player_data.damage,
|
||||
"headshots": player_data.headshots,
|
||||
"active": player_data.active
|
||||
}
|
||||
var side: String
|
||||
match player_data.side:
|
||||
-1:
|
||||
side = "undefined"
|
||||
0:
|
||||
side = "attack"
|
||||
1:
|
||||
side = "defend"
|
||||
result["side"] = side
|
||||
return result
|
||||
|
||||
func player_data_from_dict(player_data: Dictionary) -> PlayerData:
|
||||
var result := PlayerData.new()
|
||||
result.id = player_data.get("id")
|
||||
result.username = player_data.get("username")
|
||||
result.active = player_data.get("active")
|
||||
result.damage = player_data.get("damage")
|
||||
result.headshots = player_data.get("headshots")
|
||||
result.score = player_data.get("score")
|
||||
var side: int
|
||||
match player_data.side:
|
||||
"undefined":
|
||||
side = -1
|
||||
"attack":
|
||||
side = 0
|
||||
"defend":
|
||||
side = 1
|
||||
result.side = side
|
||||
return result
|
18
godot/scenes/hud/in_game_tab/in_game_tab.tscn
Normal file
18
godot/scenes/hud/in_game_tab/in_game_tab.tscn
Normal file
@ -0,0 +1,18 @@
|
||||
[gd_scene format=3 uid="uid://cibyicqmkr7h8"]
|
||||
|
||||
[node name="InGameTab" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="HFlowContainer" type="HFlowContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
@ -6,13 +6,12 @@ const MAP_DIR := "res://scenes/maps/maps/"
|
||||
@onready var map_list: ItemList = $CreateServerMenu/MapList
|
||||
@onready var create_server_panel: VBoxContainer = $CreateServerMenu
|
||||
@onready var join_server_panel: VBoxContainer = $JoinServerMenu
|
||||
var game_root: GameRoot
|
||||
var chosen_map: String
|
||||
|
||||
func _get_game_root() -> GameRoot:
|
||||
var game_root: GameRoot = find_parent("GameRoot")
|
||||
return game_root
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
game_root = helpers.get_root_node()
|
||||
var map_dir := DirAccess.open(MAP_DIR)
|
||||
if map_dir:
|
||||
map_dir.list_dir_begin()
|
||||
@ -20,7 +19,6 @@ func _ready() -> void:
|
||||
while file_name != "":
|
||||
map_list.add_item(file_name)
|
||||
file_name = map_dir.get_next()
|
||||
GameServerAutoload.current_map = map_list.get_item_text(0)
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
@ -48,20 +46,20 @@ func _on_close_create_pressed() -> void:
|
||||
create_server_panel.visible = false
|
||||
|
||||
func _on_map_list_item_selected(index: int) -> void:
|
||||
GameServerAutoload.current_map = map_list.get_item_text(index)
|
||||
chosen_map = map_list.get_item_text(index)
|
||||
|
||||
|
||||
func _on_create_pressed() -> void:
|
||||
GameServerAutoload.create_server(false)
|
||||
_get_game_root().load_map.emit(GameServerAutoload.current_map)
|
||||
game_root.create_server(27015, 30, false, chosen_map)
|
||||
var server_data := helpers.get_server_node()
|
||||
game_root.load_map.emit(server_data.current_map)
|
||||
visible = false
|
||||
|
||||
|
||||
func _on_join_server_pressed() -> void:
|
||||
var ip: String = $JoinServerMenu/Host/TextEdit.text
|
||||
var port: int = $JoinServerMenu/Port/TextEdit.text.to_int()
|
||||
|
||||
GameServerAutoload.join_server(ip, port)
|
||||
_get_game_root().load_map.emit(GameServerAutoload.current_map)
|
||||
var err := game_root.join_server(ip, port)
|
||||
var server_data: ServerData = null
|
||||
visible = false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://dnqi0ih2hcpym"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/menus/main/main_menu.gd" id="1_mns85"]
|
||||
[ext_resource type="Script" path="res://scenes/interface/main_menu/main_menu.gd" id="1_ogguo"]
|
||||
|
||||
[node name="MainMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
@ -10,7 +10,7 @@ anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 4
|
||||
script = ExtResource("1_mns85")
|
||||
script = ExtResource("1_ogguo")
|
||||
|
||||
[node name="Buttons" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
@ -1,9 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://dp1lcbwr7vaq1"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/bullet_spawner/bullet_controller.gd" id="1_ohxtg"]
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/bullet_spawner/bullet_controller.gd" id="1_pwpt3"]
|
||||
|
||||
[node name="BulletSpawner" type="Node3D"]
|
||||
script = ExtResource("1_ohxtg")
|
||||
script = ExtResource("1_pwpt3")
|
||||
|
||||
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/weapon/bullet.tscn")
|
||||
|
12
godot/scenes/maps/base/entry_screen/entry_screen.gd
Normal file
12
godot/scenes/maps/base/entry_screen/entry_screen.gd
Normal file
@ -0,0 +1,12 @@
|
||||
extends Control
|
||||
|
||||
|
||||
|
||||
func _on_blue_pressed() -> void:
|
||||
helpers.get_server_node().set_player_side.rpc_id(1, PlayerData.blue)
|
||||
visible = false
|
||||
|
||||
|
||||
func _on_red_pressed() -> void:
|
||||
helpers.get_server_node().set_player_side.rpc_id(1, PlayerData.red)
|
||||
visible = false
|
41
godot/scenes/maps/base/entry_screen/entry_screen.tscn
Normal file
41
godot/scenes/maps/base/entry_screen/entry_screen.tscn
Normal file
@ -0,0 +1,41 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://guhvtj7wqb2y"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/entry_screen/entry_screen.gd" id="1_akbgo"]
|
||||
|
||||
[node name="EntryScreen" 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_akbgo")
|
||||
|
||||
[node name="Blue" type="Button" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 6
|
||||
anchor_left = 1.0
|
||||
anchor_top = 0.5
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -8.0
|
||||
offset_top = -4.0
|
||||
offset_bottom = 4.0
|
||||
grow_horizontal = 0
|
||||
grow_vertical = 2
|
||||
text = "Blue"
|
||||
|
||||
[node name="Red" type="Button" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 4
|
||||
anchor_top = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_top = -4.0
|
||||
offset_right = 8.0
|
||||
offset_bottom = 4.0
|
||||
grow_vertical = 2
|
||||
text = "Red
|
||||
"
|
||||
|
||||
[connection signal="pressed" from="Blue" to="." method="_on_blue_pressed"]
|
||||
[connection signal="pressed" from="Red" to="." method="_on_red_pressed"]
|
@ -3,21 +3,20 @@ class_name MapController
|
||||
|
||||
const PLAYER_SPAWNER: String = "res://scenes/maps/base/player_spawner/player_spawner.tscn"
|
||||
const BULLET_SPAWNER: String = "res://scenes/maps/base/bullet_spawner/bullet_spawner.tscn"
|
||||
const WORLD: String = "res://scenes/maps/maps/world.tscn"
|
||||
const ENTRY_SCREEN: String = "res://scenes/maps/base/entry_screen/entry_screen.tscn"
|
||||
|
||||
var player_spawner: PlayerSpawnerController
|
||||
var bullet_spawner: BulletSpawnerController
|
||||
var entry_screen: Control
|
||||
|
||||
var client_node: Node3D
|
||||
|
||||
@onready var spawn_locations: SpawnController = $SpawnLocations
|
||||
@onready var spawn_controller: SpawnController = $SpawnLocations
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
# add player spawner
|
||||
var err: Error = OK
|
||||
err = _add_world()
|
||||
if err != OK:
|
||||
push_error("Couldn't load world")
|
||||
return
|
||||
err = _add_player_spawner()
|
||||
if err != OK:
|
||||
push_error("Couldn't load player spawner")
|
||||
@ -33,20 +32,24 @@ func _ready() -> void:
|
||||
|
||||
# add objects spawner
|
||||
if not OS.has_feature("dedicated_server"):
|
||||
_request_spawn.rpc_id(1)
|
||||
err = _add_entry_screen()
|
||||
if err != OK:
|
||||
logger.error("Couldn't load the entry screen, err " + str(err))
|
||||
|
||||
|
||||
@rpc("call_local", "unreliable", "any_peer")
|
||||
func _request_spawn():
|
||||
var id: int = multiplayer.get_remote_sender_id()
|
||||
_spawn_player(id)
|
||||
|
||||
func _spawn_player(id: int):
|
||||
if multiplayer.is_server():
|
||||
player_spawner.spawn_players(spawn_locations, id)
|
||||
var controlled_node: ServerNode = player_spawner.get_player_node(id)
|
||||
var position := controlled_node.shared_node.global_position
|
||||
_spawn_player_controller_node.rpc_id(id, position.x, position.y, position.z)
|
||||
func _process(delta: float) -> void:
|
||||
if not multiplayer.is_server():
|
||||
pass
|
||||
#@rpc("call_local", "unreliable", "any_peer")p
|
||||
#func _request_spawn():
|
||||
#var id: int = multiplayer.get_remote_sender_id()
|
||||
#_spawn_player(id)
|
||||
#
|
||||
#func _spawn_player(id: int):
|
||||
#if multiplayer.is_server():
|
||||
#player_spawner.spawn_players(id)
|
||||
#var controlled_node: ServerNode = player_spawner.get_player_node(id)
|
||||
#var position := controlled_node.shared_node.global_position
|
||||
#_spawn_player_controller_node.rpc_id(id, position.x, position.y, position.z)
|
||||
|
||||
@rpc("any_peer", "call_local", "unreliable")
|
||||
func _spawn_player_controller_node(x: float, y: float, z: float):
|
||||
@ -57,7 +60,7 @@ func _spawn_player_controller_node(x: float, y: float, z: float):
|
||||
var controlled_node: ServerNode = player_spawner.get_player_node(multiplayer.get_unique_id())
|
||||
player_node.controlled_node = controlled_node
|
||||
client_node.add_child(player_node)
|
||||
player_node.shared_node.global_position = Vector3(x,y,z)
|
||||
player_node.shared_node.global_position = Vector3(x,y,z)
|
||||
controlled_node.bind_player_node()
|
||||
|
||||
func spawn_player_model(owner_node: CharacterBody3D, owner_id: int):
|
||||
@ -67,16 +70,6 @@ func spawn_player_model(owner_node: CharacterBody3D, owner_id: int):
|
||||
func _remove_player(id: int):
|
||||
player_spawner.remove_player(id)
|
||||
|
||||
func _add_world() -> Error :
|
||||
if not ResourceLoader.exists(WORLD):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(WORLD)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
|
||||
var node: Node3D = scene.instantiate()
|
||||
add_child(node)
|
||||
return OK
|
||||
|
||||
func _add_player_spawner() -> Error :
|
||||
if not ResourceLoader.exists(PLAYER_SPAWNER):
|
||||
@ -85,9 +78,10 @@ func _add_player_spawner() -> Error :
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
|
||||
var node: Node3D = scene.instantiate()
|
||||
var node: PlayerSpawnerController = scene.instantiate()
|
||||
add_child(node)
|
||||
player_spawner = node
|
||||
player_spawner.spawn_controller = spawn_controller
|
||||
return OK
|
||||
|
||||
func _add_bullet_spawner() -> Error :
|
||||
@ -100,6 +94,17 @@ func _add_bullet_spawner() -> Error :
|
||||
add_child(node)
|
||||
bullet_spawner = node
|
||||
return OK
|
||||
|
||||
func _add_entry_screen() -> Error :
|
||||
if not ResourceLoader.exists(ENTRY_SCREEN):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(ENTRY_SCREEN)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
var node: Control = scene.instantiate()
|
||||
add_child(node)
|
||||
entry_screen = node
|
||||
return OK
|
||||
|
||||
# -- TODO: Better bullet naming handler
|
||||
var bullet_amount: int = -2147483647
|
||||
|
@ -1,6 +1,9 @@
|
||||
class_name PlayerSpawnerController
|
||||
extends Node3D
|
||||
|
||||
var spawned_players: Dictionary = {}
|
||||
@export var spawn_controller: SpawnController
|
||||
var server_node: ServerData
|
||||
func _get_spawner() -> MultiplayerSpawner:
|
||||
return $PlayersSpawner
|
||||
|
||||
@ -12,21 +15,39 @@ func _get_model_spawner() -> MultiplayerSpawner:
|
||||
|
||||
func _get_model_root() -> Node3D:
|
||||
return $Models
|
||||
func _ready() -> void:
|
||||
server_node = helpers.get_server_node()
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
for player in server_node.players:
|
||||
if not spawned_players.has(player):
|
||||
logger.debug("Spawning a player with id: " + str(player))
|
||||
var err := spawn_players(server_node.players[player])
|
||||
if err != OK:
|
||||
logger.error("Couldn't spawn a player, err: " + str(err))
|
||||
else:
|
||||
spawned_players[player] = 1
|
||||
|
||||
# -- Spawn a player node and sync it across all peers
|
||||
func spawn_players(spawn_location: SpawnController, id: int) -> Error:
|
||||
if multiplayer.is_server():
|
||||
var char : ServerNode = null
|
||||
var player_data: PlayerData = GameServerAutoload.players[id]
|
||||
char = ResourceLoader.load("res://scenes/player/server_node.tscn").instantiate()
|
||||
char.name = "PlayerPlaceholder_" + str(player_data.id)
|
||||
var new_position: Vector3 = spawn_location.get_spawner(SpawnController.Sides.BLUE)
|
||||
char.owner_id = id
|
||||
_get_root().add_child(char)
|
||||
char.shared_node.global_position = new_position
|
||||
|
||||
return OK
|
||||
return ERR_UNAUTHORIZED
|
||||
func spawn_players(player_data: Dictionary) -> Error:
|
||||
var char : ServerNode = null
|
||||
|
||||
char = ResourceLoader.load("res://scenes/player/server_node.tscn").instantiate()
|
||||
char.name = "PlayerPlaceholder_" + str(player_data.get("id"))
|
||||
var side = "attack"
|
||||
var spawn
|
||||
if side == PlayerData.blue:
|
||||
spawn = SpawnController.Sides.BLUE
|
||||
elif side == PlayerData.red:
|
||||
spawn = SpawnController.Sides.RED
|
||||
else:
|
||||
return ERR_CANT_CREATE
|
||||
var new_position: Vector3 = spawn_controller.get_spawner(spawn)
|
||||
char.owner_id = player_data.get("id")
|
||||
_get_root().add_child(char)
|
||||
char.shared_node.global_position = new_position
|
||||
|
||||
return OK
|
||||
|
||||
func spawn_player_model(owner_node: CharacterBody3D):
|
||||
var model_scene: PackedScene = ResourceLoader.load("res://scenes/characters/y-bot/character.tscn")
|
||||
|
@ -1,14 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://xh710fr73bid"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/player_spawner/player_spawner.gd" id="1_2hsyd"]
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/player_spawner/player_spawner.gd" id="1_pl471"]
|
||||
|
||||
[node name="PlayerSpawner" type="Node3D"]
|
||||
script = ExtResource("1_2hsyd")
|
||||
|
||||
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="."]
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/player/server_node.tscn")
|
||||
spawn_path = NodePath("../Players")
|
||||
spawn_limit = 100
|
||||
script = ExtResource("1_pl471")
|
||||
|
||||
[node name="Players" type="Node3D" parent="."]
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://bbqh8e8t0rvwj"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/player_synchronizer/player_synchronizer.gd" id="1_cam4s"]
|
||||
[ext_resource type="Script" path="res://scenes/maps/base/player_synchronizer/player_synchronizer.gd" id="1_o2up5"]
|
||||
|
||||
[node name="PlayerSynchronizer" type="Node"]
|
||||
script = ExtResource("1_cam4s")
|
||||
script = ExtResource("1_o2up5")
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
|
@ -42,8 +42,8 @@ func get_spawner(team: Sides) -> Vector3:
|
||||
var spawn := _get_available_spawn(blue_spawners)
|
||||
return spawn.choose_spawn_location()
|
||||
Sides.RED:
|
||||
print("red")
|
||||
return Vector3(0,0,0)
|
||||
var spawn := _get_available_spawn(red_spawners)
|
||||
return spawn.choose_spawn_location()
|
||||
_:
|
||||
return Vector3(0,0,0)
|
||||
# Get all spawners for each team
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=71 format=4 uid="uid://bn2w1n2oj37m0"]
|
||||
[gd_scene load_steps=71 format=4 uid="uid://cirhbchr5g0dn"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_twmpc"]
|
||||
resource_name = "New_Material"
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=12 format=3 uid="uid://btlkodvngm634"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/hud.gd" id="1_1ffy2"]
|
||||
[ext_resource type="Script" path="res://scenes_old/player/hud.gd" id="1_1ffy2"]
|
||||
[ext_resource type="Texture2D" uid="uid://oopj5mj1vdp0" path="res://assets/crosshairs/crosshair_default.png" id="1_u13st"]
|
||||
[ext_resource type="Script" path="res://scenes/player/gun_mount.gd" id="3_qmcsd"]
|
||||
[ext_resource type="Script" path="res://scenes_old/player/gun_mount.gd" id="3_qmcsd"]
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_3bk8i"]
|
||||
font_size = 70
|
||||
|
@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://bm80m5x5me4mp"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/server_node.gd" id="1_djt0m"]
|
||||
[ext_resource type="PackedScene" uid="uid://ddwrs0so7swxn" path="res://scenes/characters/y-bot/character.tscn" id="2_a22jl"]
|
||||
[ext_resource type="Script" path="res://scenes_old/player/server_node.gd" id="1_djt0m"]
|
||||
[ext_resource type="PackedScene" uid="uid://ddwrs0so7swxn" path="res://scenes_old/characters/y-bot/character.tscn" id="2_a22jl"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1v0rt"]
|
||||
height = 1.8
|
||||
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://d3ohhfsnbspsm"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/player_node.gd" id="1_8uxms"]
|
||||
[ext_resource type="Script" path="res://scenes_old/player/player_node.gd" id="1_8uxms"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_uacs5"]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://conlvf1vqni6c"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/player_node.gd" id="1_q00bg"]
|
||||
[ext_resource type="PackedScene" uid="uid://cirun2v34nfpg" path="res://scenes/player/shared_node.tscn" id="2_4mkad"]
|
||||
[ext_resource type="Script" path="res://scenes_old/player/player_node.gd" id="1_q00bg"]
|
||||
[ext_resource type="PackedScene" uid="uid://cirun2v34nfpg" path="res://scenes_old/player/shared_node.tscn" id="2_4mkad"]
|
||||
|
||||
[node name="PlayerNode" type="Node3D"]
|
||||
script = ExtResource("1_q00bg")
|
||||
|
@ -23,7 +23,7 @@ func _ready() -> void:
|
||||
shared_node.set_collision_mask_value(3, true)
|
||||
map_controller = find_parent("Map")
|
||||
_load_weapon()
|
||||
map_controller.spawn_player_model(shared_node, owner_id)
|
||||
#map_controller.spawn_player_model(shared_node, owner_id)
|
||||
# Load the default weapon and set the current attack properties
|
||||
|
||||
func _load_weapon() -> void:
|
||||
@ -86,8 +86,8 @@ func set_rotation_y(y: float):
|
||||
|
||||
func _on_reconciliation_timer_timeout() -> void:
|
||||
if multiplayer.is_server():
|
||||
_veryfy_position_and_rotation.rpc_id(owner_id)
|
||||
update_position.rpc(shared_node.global_transform.origin)
|
||||
#_veryfy_position_and_rotation.rpc_id(owner_id)
|
||||
#update_position.rpc(shared_node.global_transform.origin)
|
||||
$ReconciliationTimer.start()
|
||||
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://clq0b7tbincut"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/server_node.gd" id="1_bau14"]
|
||||
[ext_resource type="Script" path="res://scenes/player/server_node.gd" id="1_wco3t"]
|
||||
[ext_resource type="PackedScene" uid="uid://cirun2v34nfpg" path="res://scenes/player/shared_node.tscn" id="1_ybp5y"]
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_2dhi2"]
|
||||
@ -18,7 +18,7 @@ properties/3/spawn = true
|
||||
properties/3/replication_mode = 2
|
||||
|
||||
[node name="ServerNode" type="Node3D"]
|
||||
script = ExtResource("1_bau14")
|
||||
script = ExtResource("1_wco3t")
|
||||
|
||||
[node name="SharedNode" parent="." instance=ExtResource("1_ybp5y")]
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
extends Resource
|
||||
class_name PlayerData
|
||||
|
||||
@export var id: int = 0
|
||||
@export var username: String = ""
|
@ -1,69 +0,0 @@
|
||||
extends Node
|
||||
class_name GameServer
|
||||
|
||||
@export var port: int = 27015
|
||||
@export var player_limit: int = 30
|
||||
@export var current_map: String = "lowpoly_tdm_2"
|
||||
|
||||
@export var current_player_data := PlayerData.new()
|
||||
|
||||
# -- This variable should store all the active players
|
||||
var players: Dictionary = {}
|
||||
|
||||
func _ready() -> void:
|
||||
multiplayer.peer_connected.connect(_on_player_connected)
|
||||
multiplayer.peer_disconnected.connect(_on_player_disconnected)
|
||||
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
||||
|
||||
|
||||
func _on_player_disconnected(id) -> void:
|
||||
logger.info("player is disconnected with id: " + str(id))
|
||||
|
||||
|
||||
func _on_player_connected(id) -> void:
|
||||
if multiplayer.is_server():
|
||||
logger.info("player is connected with id: " + str(id))
|
||||
|
||||
func _on_connected_to_server() -> void:
|
||||
logger.info("connection is successful, sending info")
|
||||
register_player.rpc_id(1, multiplayer.get_unique_id(), current_player_data.username)
|
||||
|
||||
func create_server(server_only: bool = false) -> Error:
|
||||
var peer := ENetMultiplayerPeer.new()
|
||||
logger.info("starting a server the port: " + str(port))
|
||||
var err := peer.create_server(port, player_limit)
|
||||
multiplayer.multiplayer_peer = peer
|
||||
if err:
|
||||
return err
|
||||
if !server_only:
|
||||
var player_data := PlayerData.new()
|
||||
player_data.id = 1
|
||||
logger.warning("TODO: player name is not yet implemented")
|
||||
player_data.username = "dummy"
|
||||
players[1] = player_data
|
||||
return OK
|
||||
|
||||
func join_server(ip: String, port: int) -> Error:
|
||||
var peer = ENetMultiplayerPeer.new()
|
||||
logger.info("trying to connect to: " + ip + ":" + str(port))
|
||||
var err = peer.create_client(ip, port)
|
||||
if err != OK:
|
||||
return err
|
||||
multiplayer.multiplayer_peer = peer
|
||||
return OK
|
||||
|
||||
@rpc("any_peer", "reliable", "call_remote")
|
||||
func register_player(id: int, name: String):
|
||||
if multiplayer.is_server():
|
||||
logger.info("registering player: " + str(id))
|
||||
var player_data := PlayerData.new()
|
||||
player_data.id = id
|
||||
player_data.username = name
|
||||
players[multiplayer.get_remote_sender_id()] = player_data
|
||||
logger.info("player " + str(id) + " is registered")
|
||||
else:
|
||||
logger.debug("register player is supposed to be executed on the server")
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
@ -1,15 +0,0 @@
|
||||
extends CharacterBody3D
|
||||
class_name TmpNode
|
||||
|
||||
@export var owner_placeholder: CharacterBody3D = null
|
||||
|
||||
func _ready() -> void:
|
||||
set_multiplayer_authority(multiplayer.get_unique_id())
|
||||
global_position = owner_placeholder.global_position
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
velocity = owner_placeholder.velocity
|
||||
move_and_slide()
|
@ -1,18 +0,0 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://kjeyhc8qpykm"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/tmp_node.gd" id="1_vutt1"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_crgjo"]
|
||||
size = Vector3(0.01, 0.01, 0.01)
|
||||
|
||||
[node name="TmpNode" type="CharacterBody3D"]
|
||||
collision_layer = 0
|
||||
collision_mask = 0
|
||||
script = ExtResource("1_vutt1")
|
||||
|
||||
[node name="CSGBox3D" type="CSGBox3D" parent="."]
|
||||
transform = Transform3D(32.0413, 0, 0, 0, 32.0413, 0, 0, 0, 32.0413, 0, 565.322, 0)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.54251, 0)
|
||||
shape = SubResource("BoxShape3D_crgjo")
|
147
godot/scenes/utils/game_root/game_root.gd
Normal file
147
godot/scenes/utils/game_root/game_root.gd
Normal file
@ -0,0 +1,147 @@
|
||||
extends Node
|
||||
class_name GameRoot
|
||||
|
||||
signal load_map(name: String)
|
||||
|
||||
# -- config from args
|
||||
var config_file: String = ""
|
||||
|
||||
const MAIN_MENU_SCENE := "res://scenes/interface/main_menu/main_menu.tscn"
|
||||
const SERVER_DATA_NODE := "res://scenes/utils/server_data/server_data.tscn"
|
||||
|
||||
@onready var level_root: Node3D = $Level
|
||||
@onready var utils_root: Node = $Utils
|
||||
|
||||
func _parse_args() -> void:
|
||||
var args := Array(OS.get_cmdline_args())
|
||||
|
||||
var config_arg: String = "--config"
|
||||
if args.has(config_arg):
|
||||
var index := args.find(config_arg)
|
||||
config_file = args[index + 1]
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
_parse_args()
|
||||
var err: Error
|
||||
|
||||
if err != OK:
|
||||
logger.error("Couldn't load utils node")
|
||||
return
|
||||
if OS.has_feature("dedicated_server") or DisplayServer.get_name() == "headless":
|
||||
err = _start_dedicated_server()
|
||||
if err != OK:
|
||||
logger.error("couldn't start the server, err is " + str(err))
|
||||
else:
|
||||
err = _start_game()
|
||||
if err != OK:
|
||||
logger.error("couldn't start the game, err is " + str(err))
|
||||
multiplayer.peer_connected.connect(_on_player_connected)
|
||||
multiplayer.peer_disconnected.connect(_on_player_disconnected)
|
||||
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
||||
|
||||
func _on_player_disconnected(id) -> void:
|
||||
logger.info("player is disconnected with id: " + str(id))
|
||||
|
||||
func _on_player_connected(id) -> void:
|
||||
# Send the client information about the server
|
||||
if multiplayer.is_server():
|
||||
logger.info("player is connected with id: " + str(id))
|
||||
_sync_map_from_server.rpc_id(id)
|
||||
|
||||
@rpc("authority", "reliable", "call_remote")
|
||||
func _sync_map_from_server() -> void:
|
||||
var server_node := helpers.get_server_node()
|
||||
load_map.emit(server_node.current_map)
|
||||
|
||||
func _on_connected_to_server() -> void:
|
||||
logger.info("connection is successful, sending info")
|
||||
register_player.rpc_id(1, multiplayer.get_unique_id(), "client")
|
||||
|
||||
@rpc("any_peer", "reliable", "call_remote")
|
||||
func register_player(id: int, name: String):
|
||||
logger.info("registering player: " + str(id))
|
||||
if multiplayer.is_server():
|
||||
var player_data := PlayerData.new()
|
||||
player_data.id = id
|
||||
player_data.username = name
|
||||
player_data.active = true
|
||||
var server_node: ServerData = helpers.get_server_node()
|
||||
server_node.players[id] = helpers.player_data_into_dict(player_data)
|
||||
logger.info("player " + str(id) + " is registered")
|
||||
else:
|
||||
logger.debug("register player is supposed to be executed on the server")
|
||||
|
||||
func _start_dedicated_server() -> Error:
|
||||
if config_file != "":
|
||||
logger.info("reading config from the file: " + config_file)
|
||||
logger.info("starting in the dedicated server mode")
|
||||
return OK
|
||||
|
||||
|
||||
func _start_game() -> Error:
|
||||
logger.info("starting in the game mode")
|
||||
|
||||
if not ResourceLoader.exists(MAIN_MENU_SCENE):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(MAIN_MENU_SCENE)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
|
||||
var node: MainMenu = scene.instantiate()
|
||||
add_child(node)
|
||||
return OK
|
||||
|
||||
func _load_utils() -> Error:
|
||||
if not ResourceLoader.exists(SERVER_DATA_NODE):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(SERVER_DATA_NODE)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
|
||||
var node: ServerData = scene.instantiate()
|
||||
utils_root.add_child(node)
|
||||
return OK
|
||||
|
||||
func _on_load_map(map_name: String) -> void:
|
||||
var path_tmpl := "res://scenes/maps/maps/%s"
|
||||
var path := path_tmpl % map_name
|
||||
logger.info("Loading map from " + path)
|
||||
|
||||
if not ResourceLoader.exists(path):
|
||||
logger.error("map " + map_name + " doesn't exist")
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if scene.can_instantiate():
|
||||
var node: Node3D = scene.instantiate()
|
||||
logger.info("loading map: " + map_name)
|
||||
for c in level_root.get_children():
|
||||
level_root.remove_child(c)
|
||||
c.queue_free()
|
||||
level_root.add_child(node)
|
||||
else:
|
||||
logger.error("Can't initialize")
|
||||
|
||||
func create_server(port: int, player_limit: int, server_only: bool = false, map: String = "lowpoly_tdm_2.tscn") -> Error:
|
||||
var peer := ENetMultiplayerPeer.new()
|
||||
logger.info("starting a server the port: " + str(port))
|
||||
var err := peer.create_server(port, player_limit)
|
||||
multiplayer.multiplayer_peer = peer
|
||||
if err:
|
||||
return err
|
||||
_load_utils()
|
||||
var server_data: ServerData = helpers.get_server_node()
|
||||
server_data.port = port
|
||||
server_data.player_limit = player_limit
|
||||
server_data.current_map = map
|
||||
if !server_only:
|
||||
register_player(1, "server")
|
||||
return OK
|
||||
|
||||
func join_server(ip: String, port: int) -> Error:
|
||||
var peer = ENetMultiplayerPeer.new()
|
||||
logger.info("trying to connect to: " + ip + ":" + str(port))
|
||||
var err = peer.create_client(ip, port)
|
||||
if err != OK:
|
||||
return err
|
||||
multiplayer.multiplayer_peer = peer
|
||||
return OK
|
17
godot/scenes/utils/game_root/game_root.tscn
Normal file
17
godot/scenes/utils/game_root/game_root.tscn
Normal file
@ -0,0 +1,17 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://f3lbhroreypw"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/utils/game_root/game_root.gd" id="1_ogtsj"]
|
||||
|
||||
[node name="GameRoot" type="Node"]
|
||||
script = ExtResource("1_ogtsj")
|
||||
|
||||
[node name="ServerDataSpawner" type="MultiplayerSpawner" parent="."]
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/utils/server_data/server_data.tscn")
|
||||
spawn_path = NodePath("../Utils")
|
||||
spawn_limit = 1
|
||||
|
||||
[node name="Utils" type="Node" parent="."]
|
||||
|
||||
[node name="Level" type="Node3D" parent="."]
|
||||
|
||||
[connection signal="load_map" from="." to="." method="_on_load_map"]
|
21
godot/scenes/utils/player_data/player_data.gd
Normal file
21
godot/scenes/utils/player_data/player_data.gd
Normal file
@ -0,0 +1,21 @@
|
||||
class_name PlayerData extends Resource
|
||||
|
||||
@export var id: int = 0
|
||||
@export var username: String = ""
|
||||
|
||||
@export var score: int = 0
|
||||
@export var damage: int = 0
|
||||
@export var headshots: int = 0
|
||||
|
||||
enum Side {
|
||||
BLUE = 0,
|
||||
RED = 1,
|
||||
UNDEFINED = -1,
|
||||
}
|
||||
|
||||
const blue = "attack"
|
||||
const red = "defend"
|
||||
const underfined = "unddefined"
|
||||
@export var side: PlayerData.Side = Side.UNDEFINED
|
||||
|
||||
@export var active: bool = false
|
16
godot/scenes/utils/server_data/server_data.gd
Normal file
16
godot/scenes/utils/server_data/server_data.gd
Normal file
@ -0,0 +1,16 @@
|
||||
class_name ServerData extends Node
|
||||
|
||||
@export var players: Dictionary = {}
|
||||
@export var port: int = 27015
|
||||
@export var player_limit: int = 30
|
||||
@export var current_map: String = "lowpoly_tdm_2"
|
||||
|
||||
@rpc("any_peer", "reliable", "call_local")
|
||||
func set_player_side(side: String):
|
||||
if multiplayer.is_server():
|
||||
var id: int = multiplayer.get_remote_sender_id()
|
||||
if players.has(id):
|
||||
players[id]["side"] = side
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
17
godot/scenes/utils/server_data/server_data.tscn
Normal file
17
godot/scenes/utils/server_data/server_data.tscn
Normal file
@ -0,0 +1,17 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://cu6t3m38skton"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/utils/server_data/server_data.gd" id="1_o07e3"]
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_t8y34"]
|
||||
properties/0/path = NodePath(".:players")
|
||||
properties/0/spawn = true
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:current_map")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
|
||||
[node name="ServerData" type="Node"]
|
||||
script = ExtResource("1_o07e3")
|
||||
|
||||
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
|
||||
replication_config = SubResource("SceneReplicationConfig_t8y34")
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://b0agqeg53tey5"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/weapon/bullet.gd" id="1_th28m"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/bullet.gd" id="1_th28m"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_vxst2"]
|
||||
size = Vector3(0.2, 0.2, 0.5)
|
||||
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=59 format=4 uid="uid://wu6qyd0aqeib"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_h1xyo"]
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_tgfji"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes/weapon/misc/bullet_trace_distance.tscn" id="3_5ff4y"]
|
||||
[ext_resource type="PackedScene" uid="uid://dab7jttp7ywfh" path="res://scenes/weapon/guns/ak/gun.tscn" id="3_q7t3c"]
|
||||
[ext_resource type="AudioStream" uid="uid://prh2ip5vkpyu" path="res://assets/audio/weapon/generic_gun_sound.mp3" id="4_v0f30"]
|
||||
@ -640,9 +640,9 @@ _data = {
|
||||
|
||||
[node name="WithHands" type="Node3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.528017, -0.924033, 0)
|
||||
script = ExtResource("1_h1xyo")
|
||||
script = ExtResource("1_tgfji")
|
||||
damage = 50
|
||||
cooldown = 0.15
|
||||
cooldown = 0.5
|
||||
mag_capacity = 30
|
||||
|
||||
[node name="HandsMount" type="Node3D" parent="."]
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=58 format=4 uid="uid://qi8d8e1bcjup"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_pwx7d"]
|
||||
[ext_resource type="PackedScene" uid="uid://d0hchficby0xv" path="res://scenes/weapon/guns/deagle/gun.tscn" id="2_xd57f"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes/weapon/misc/bullet_trace_distance.tscn" id="3_mcrys"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/generic_weapon_controller.gd" id="1_pwx7d"]
|
||||
[ext_resource type="PackedScene" uid="uid://d0hchficby0xv" path="res://scenes_old/weapon/guns/deagle/gun.tscn" id="2_xd57f"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes_old/weapon/misc/bullet_trace_distance.tscn" id="3_mcrys"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_238tw"]
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=58 format=4 uid="uid://cnmxinvpast1w"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://c44x2x2rbws4o" path="res://scenes/weapon/guns/hk/gun.tscn" id="1_deakt"]
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_vg0jf"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes/weapon/misc/bullet_trace_distance.tscn" id="3_jp8nc"]
|
||||
[ext_resource type="PackedScene" uid="uid://c44x2x2rbws4o" path="res://scenes_old/weapon/guns/hk/gun.tscn" id="1_deakt"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/generic_weapon_controller.gd" id="1_vg0jf"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes_old/weapon/misc/bullet_trace_distance.tscn" id="3_jp8nc"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_tg27p"]
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=58 format=4 uid="uid://dnkx3jy425v1p"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://bwwd8y1k3c2x0" path="res://scenes/weapon/guns/m1/gun.tscn" id="1_krf2i"]
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_m3jaa"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes/weapon/misc/bullet_trace_distance.tscn" id="3_els3d"]
|
||||
[ext_resource type="PackedScene" uid="uid://bwwd8y1k3c2x0" path="res://scenes_old/weapon/guns/m1/gun.tscn" id="1_krf2i"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/generic_weapon_controller.gd" id="1_m3jaa"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes_old/weapon/misc/bullet_trace_distance.tscn" id="3_els3d"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bbor6"]
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=58 format=4 uid="uid://c8vx4rdprro68"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/weapon/generic_weapon_controller.gd" id="1_o1qda"]
|
||||
[ext_resource type="PackedScene" uid="uid://c4u03cdf3exwb" path="res://scenes/weapon/guns/vector/gun.tscn" id="2_5811w"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes/weapon/misc/bullet_trace_distance.tscn" id="3_57f4j"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/generic_weapon_controller.gd" id="1_o1qda"]
|
||||
[ext_resource type="PackedScene" uid="uid://c4u03cdf3exwb" path="res://scenes_old/weapon/guns/vector/gun.tscn" id="2_5811w"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjyltbtx45cqs" path="res://scenes_old/weapon/misc/bullet_trace_distance.tscn" id="3_57f4j"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bbor6"]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://balgqtw1ijpw3"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/weapon/misc/bullet_trail_generic.gd" id="1_k8eg1"]
|
||||
[ext_resource type="Script" path="res://scenes_old/weapon/misc/bullet_trail_generic.gd" id="1_k8eg1"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ybqvs"]
|
||||
transparency = 1
|
||||
|
Reference in New Issue
Block a user