From 4e04f38700214100f38029817ffa37bf8012e523 Mon Sep 17 00:00:00 2001 From: leca Date: Sun, 18 Feb 2024 17:36:39 +0300 Subject: [PATCH] Very unstable ammo and reloading system --- project.godot | 5 ++ scenes/hud.tscn | 18 +++++++ scripts/GameData.gd | 18 +++++-- scripts/Networking.gd | 44 +++++++++++++++--- scripts/Player.gd | 88 ++++++++++++++++++++++++++--------- settings/server-settings.json | 17 +++++-- 6 files changed, 156 insertions(+), 34 deletions(-) diff --git a/project.godot b/project.godot index f72c0aa..8477c68 100644 --- a/project.godot +++ b/project.godot @@ -74,3 +74,8 @@ MWD={ "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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } +reload={ +"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":82,"key_label":0,"unicode":114,"echo":false,"script":null) +] +} diff --git a/scenes/hud.tscn b/scenes/hud.tscn index 1a34b32..a375556 100644 --- a/scenes/hud.tscn +++ b/scenes/hud.tscn @@ -50,3 +50,21 @@ offset_bottom = 6.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 + +[node name="AmmoDisplay" type="Control" parent="."] +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Ammo" type="Label" parent="AmmoDisplay"] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 23.0 +text = "Ammo: " + +[node name="Magazine" type="Label" parent="AmmoDisplay"] +layout_mode = 0 +offset_top = 23.0 +offset_right = 40.0 +offset_bottom = 46.0 +text = "Magazine:" diff --git a/scripts/GameData.gd b/scripts/GameData.gd index 6926bfc..e295a00 100644 --- a/scripts/GameData.gd +++ b/scripts/GameData.gd @@ -1,9 +1,21 @@ extends Node var Weapons = { - "knife" = 0, - "pistol" = 1, - "ak-47" = 2 + "knife" = { + "number": 0, + "magazine": -1, + "ammo": -1 + }, + "pistol" = { + "number": 1, + "magazine": 50, + "ammo": 200 + }, + "ak-47" = { + "number": 2, + "magazine": 30, + "ammo": 100 + } } var client_settings diff --git a/scripts/Networking.gd b/scripts/Networking.gd index c6a0b0d..0e23c22 100644 --- a/scripts/Networking.gd +++ b/scripts/Networking.gd @@ -55,6 +55,15 @@ func send_everyone_except(client_id, args): elif (args.size() == 3): args[0].rpc_id(int(current_client_id), args[1], args[2]) else: args[0].rpc_id(int(current_client_id), args[1], args[2], args[3]) +func find_weapon_by_number(number): + var found_weapon + for weapon in settings["game"]["weapons"].keys(): + if (settings["game"]["weapons"][weapon]["number"] == number): + found_weapon = settings["game"]["weapons"][weapon].duplicate() + break + return found_weapon + + func _Peer_Connected(client_id): print("User " + str(client_id) + " has conected") var internal_id = last_client_id + 1 @@ -64,6 +73,9 @@ func _Peer_Connected(client_id): clients[client_id]["position"] = Vector3(0, 10, 0) clients[client_id]["internal_id"] = internal_id clients[client_id]["is_playable"] = false + clients[client_id]["current_weapon"] = settings["game"]["weapons"]["knife"].duplicate() + + print("New client's properties: " + str(clients[client_id])) var puppet = player_model.instantiate() var CB3D = puppet.find_child("CharacterBody3D") @@ -132,7 +144,11 @@ func set_nickname(client_id, nickname): func shot(client_id): var client = clients[client_id] var internal_id = client["internal_id"] + var current_weapon = settings["game"]["weapons"].find_key(find_weapon_by_number(client["current_weapon"]["number"])) + var current_weapon_settings = settings["game"]["weapons"][current_weapon] + var raycast:RayCast3D = find_cb3d_by_internal_id(internal_id).get_node("Head/Camera/RayCast3D") + raycast.target_position.z = -current_weapon_settings["range"] var target = raycast.get_collider() if (not target is CharacterBody3D): return var target_internal_id = int(target.get_node("..").name.get_slice("player", 1)) @@ -144,13 +160,13 @@ func shot(client_id): var target_cb3d = find_cb3d_by_internal_id(target_internal_id) var target_client_id = int(clients.find_key(target_client)) - var current_weapon = Weapons.find_key(client["current_weapon"]) - var current_weapon_settings = settings["game"]["weapons"][current_weapon] var damage = current_weapon_settings["damage"]; var time_since_last_shot = (Time.get_ticks_msec() - client["last_shot"]) / 1000. if (time_since_last_shot < current_weapon_settings["fireRate"] and client["last_shot"] > 0): return + if (client["current_weapon"]["magazine"] == 0): + return client["last_shot"] = Time.get_ticks_msec() target_client["HP"] -= damage @@ -160,13 +176,29 @@ func shot(client_id): target_cb3d.set_hp.rpc_id(target_client_id, target_client["HP"]) @rpc("reliable", "call_remote", "any_peer") -func change_weapon(client_id, new_weapon): +func change_weapon(client_id, new_weapon_number): var client = clients[client_id] var internal_id = str(client["internal_id"]) - client["current_weapon"] = new_weapon + for weapon in Weapons.keys(): + if (Weapons[weapon]["number"] == new_weapon_number): + client["current_weapon"] = Weapons[weapon] + break var client_cb3d = find_cb3d_by_internal_id(internal_id) - client_cb3d.change_weapon(new_weapon) - send_everyone_except(client_id, [client_cb3d.change_weapon_puppet, internal_id, new_weapon]) + client_cb3d.change_weapon(new_weapon_number) + send_everyone_except(client_id, [client_cb3d.change_weapon_puppet, internal_id, new_weapon_number]) + +@rpc("any_peer", "call_remote", "reliable") +func client_reloading(client_id): + var client = clients[client_id] + var current_weapon = settings["game"]["weapons"].find_key(find_weapon_by_number(client["current_weapon"]["number"])) + var current_weapon_settings = settings["game"]["weapons"][current_weapon] + var to_reload = current_weapon_settings["magazine"] - client["current_weapon"]["magazine"] + if (to_reload <= client["current_weapon"]["ammo"]): + client["current_weapon"]["magazine"] += to_reload + client["current_weapon"]["ammo"] -= to_reload + else: + client["current_weapon"]["magazine"] += client["current_weapon"]["ammo"] + client["current_weapon"]["ammo"] = 0 ##########################################CLIENT####################### var player diff --git a/scripts/Player.gd b/scripts/Player.gd index 96f8bc4..268d63b 100644 --- a/scripts/Player.gd +++ b/scripts/Player.gd @@ -27,7 +27,8 @@ var properties = { internal_id = 0, nickname = "Unnamed", ready = false, - current_weapon = 0, + current_weapon = null, #game_settings["weapons"]["knife"].duplicate(), + current_weapon_number = 0, last_shot = 0 } @@ -38,7 +39,7 @@ var jump = 0 var gravity = 0 var game_settings var client_settings -var current_weapon = Weapons["knife"] +#var current_weapon = Weapons["knife"] var can_shoot = true var time_since_last_shot = 0 @onready var head = $Head @@ -46,55 +47,79 @@ var time_since_last_shot = 0 @onready var playerCharacterBody = $"." var HUD var healthBar - +var ammoLabel +var magazineLabel func set_properties(props): properties = props $"..".name = "player" + str(properties["internal_id"]) - - -func change_weapon(new_weapon): + +func update_hud(): + healthBar.value = properties["HP"] + ammoLabel.text = "Ammo: " + str(properties["current_weapon"]["ammo"]) + magazineLabel.text = "Magazine: " + str(properties["current_weapon"]["magazine"]) + +func change_weapon(new_weapon_number): var weapons = $"Head/Camera/Hand".get_children() for weapon in weapons: weapon.visible = false - weapons[new_weapon].visible = true + weapons[new_weapon_number].visible = true + +func find_weapon_by_number(number): + var found_weapon + for weapon in game_settings["weapons"].keys(): + if (game_settings["weapons"][weapon]["number"] == number): + found_weapon = game_settings["weapons"][weapon].duplicate() + break + return found_weapon func _ready(): $"Head/Nickname".text = properties["nickname"] - change_weapon(properties["current_weapon"]) if (!properties["is_playable"]): return camera.make_current() + var hud = load("res://scenes/hud.tscn").instantiate() add_child(hud) HUD = $"HUD" healthBar = HUD.get_node("HealthBar") + ammoLabel = HUD.get_node("AmmoDisplay/Ammo") + magazineLabel = HUD.get_node("AmmoDisplay/Magazine") + playerCharacterBody.up_direction = Vector3.UP; Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) func try_shoot(): - var current_weapon = Weapons.find_key(properties["current_weapon"]) + print("aaaaa " + str((properties["current_weapon"]))) + var current_weapon = game_settings["weapons"].find_key(find_weapon_by_number(properties["current_weapon"]["number"])) var current_weapon_settings = game_settings["weapons"][current_weapon] + #print("Current weapon: " + str(current_weapon) + ", it's settings: " + str(current_weapon_settings)) + if (properties["current_weapon"]["magazine"] == 0): + return if Input.is_action_pressed("shoot") and current_weapon_settings["fireRate"] >= 0.5 and not Input.is_action_just_pressed("shoot"): return time_since_last_shot = (Time.get_ticks_msec() - properties["last_shot"]) / 1000. - print("TSLS: " + str(time_since_last_shot) + " fireRate: " + str(current_weapon_settings["fireRate"])) + #print("TSLS: " + str(time_since_last_shot) + " fireRate: " + str(current_weapon_settings["fireRate"])) if (time_since_last_shot > current_weapon_settings["fireRate"]): Networking.shot.rpc_id(1, multiplayer.get_unique_id()) + if (properties["current_weapon"]["magazine"] > 0): + properties["current_weapon"]["magazine"] -= 1 properties["last_shot"] = Time.get_ticks_msec() - print("I am shooting") + #print("I am shooting") func _unhandled_input(event): if (!properties["is_playable"]): return if Input.is_action_pressed("MWU"): - properties["current_weapon"] = wrap(properties["current_weapon"] + 1, 0, Weapons.size()) - Networking.change_weapon.rpc_id(1, multiplayer.get_unique_id(), properties["current_weapon"]) + var weapon_number = wrap(properties["current_weapon"]["number"] + 1, 0, game_settings["weapons"].size()) + properties["current_weapon"] = find_weapon_by_number(weapon_number) + Networking.change_weapon.rpc_id(1, multiplayer.get_unique_id(), properties["current_weapon"]["number"]) if Input.is_action_pressed("MWD"): - properties["current_weapon"] = wrap(properties["current_weapon"] - 1, 0, Weapons.size()) - Networking.change_weapon.rpc_id(1, multiplayer.get_unique_id(), properties["current_weapon"]) + var weapon_number = wrap(properties["current_weapon"]["number"] - 1, 0, game_settings["weapons"].size()) + properties["current_weapon"] = find_weapon_by_number(weapon_number) + Networking.change_weapon.rpc_id(1, multiplayer.get_unique_id(), properties["current_weapon"]["number"]) - change_weapon(properties["current_weapon"]) + change_weapon(properties["current_weapon"]["number"]) if event is InputEventMouseMotion: head.rotate_y(-event.relative.x * SENSETIVITY) @@ -110,7 +135,21 @@ func _physics_process(delta): healthBar.value = properties["HP"] if Input.is_action_pressed("shoot"): try_shoot() - + + update_hud() + + if Input.is_action_just_pressed("reload"): + var current_weapon = game_settings["weapons"].find_key(find_weapon_by_number(properties["current_weapon"]["number"])) + var current_weapon_settings = game_settings["weapons"][current_weapon] + var to_reload = current_weapon_settings["magazine"] - properties["current_weapon"]["magazine"] + if (to_reload <= properties["current_weapon"]["ammo"]): + properties["current_weapon"]["magazine"] += to_reload + properties["current_weapon"]["ammo"] -= to_reload + else: + properties["current_weapon"]["magazine"] += properties["current_weapon"]["ammo"] + properties["current_weapon"]["ammo"] = 0 + Networking.client_reloading.rpc_id(1, multiplayer.get_unique_id()) + var input_dir = Input.get_vector("left", "right", "forward", "backward") var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() @@ -157,19 +196,26 @@ func set_hp(hp): @rpc ("authority", "call_remote", "reliable") func set_game_settings(s): if(!properties["is_playable"]): return - print("Got settings from server: " + str(s)) + #print("Got settings from server: " + str(s)) game_settings = s gravity = game_settings["moving"]["gravity"] walk = game_settings["moving"]["walk"] run = game_settings["moving"]["run"] jump = game_settings["moving"]["jump"] - + print("Game settings weapon list: "+ str(game_settings["weapons"])) + print("Changing weapon to " + str(properties["current_weapon"]["number"])) + change_weapon(properties["current_weapon"]["number"]) + @rpc ("authority", "call_remote", "reliable") func teleport(pos): $".".position = pos print("Teleporing to " + str(pos)) @rpc ("authority", "call_remote", "reliable") -func change_weapon_puppet(i_id, new_weapon): +func change_weapon_puppet(i_id, new_weapon_number): if (int(i_id) == properties["internal_id"]): - change_weapon(new_weapon) + change_weapon(new_weapon_number) + +#@rpc("any_peer", "call_remote", "reliable") +#func shot_made(): + #properties["current_weapon"]["magazine"] -= 1 diff --git a/settings/server-settings.json b/settings/server-settings.json index 307ddf3..7d39154 100644 --- a/settings/server-settings.json +++ b/settings/server-settings.json @@ -11,25 +11,34 @@ }, "weapons": { "knife": { + "number": 0, "damage": 50, "reload": 3, - "magazine": 1, + "magazine": -1, "fireRate": 3, - "spreading": 0 + "spreading": 0, + "ammo": -1, + "range": 2 }, "pistol": { + "number": 1, "damage": 10, "reload": 2, "magazine": 10, "fireRate": 0.5, - "spreading": 0 + "spreading": 0, + "ammo": 200, + "range": 100 }, "ak-47": { + "number": 2, "damage": 5, "reload": 4, "magazine": 30, "fireRate": 0.2, - "spreading": 0 + "spreading": 0, + "ammo": 100, + "range": 100 } } }