Very unstable ammo and reloading system
This commit is contained in:
parent
aa113c7ff8
commit
4e04f38700
|
@ -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)
|
||||
]
|
||||
}
|
||||
|
|
|
@ -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:"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue