Very unstable ammo and reloading system

This commit is contained in:
leca 2024-02-18 17:36:39 +03:00
parent aa113c7ff8
commit 4e04f38700
6 changed files with 156 additions and 34 deletions

View File

@ -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)
]
}

View File

@ -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:"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}
}
}