diff --git a/Game/Assets/Characters/Player.gd b/Game/Assets/Characters/Player.gd index aba6661..8eb1ccf 100644 --- a/Game/Assets/Characters/Player.gd +++ b/Game/Assets/Characters/Player.gd @@ -1,5 +1,13 @@ extends CharacterBody3D +var max_health = 100 +var health = max_health: + set(value): + main.player_list.players[self.get_multiplayer_authority()].health = value + main.push_local_player_info() + get: + return main.player_list.players[self.get_multiplayer_authority()].health + @export var mouse_sensitivity := 0.15 @onready var main = get_tree().root.get_node("Main") @@ -98,29 +106,29 @@ var previously_on_floor := false var lagging_movement_velocity = Vector3.ZERO -var dead = false: # used to workaround Godot crash when destroying player_nodes - set(value): - match value: - true: - #input_active = false - self.hide() - $Body.disabled = true - hud.pain = 3 - crosshair.hide() - #$Head/Camera.transform.origin.y - #set_physics_process(false) - false: - #input_active = true - self.show() - $Body.disabled = false - $SpawnSFX.play() - $SpawnVFX.emitting = true - hud.pain = 0 - crosshair.show() - #$Head/Camera.transform.origin = Vector3(0,0,0) - #set_physics_process(true) - dead = value - +var dead = false#: # used to workaround Godot crash when destroying player_nodes +# set(value): +# match value: +# true: +# #input_active = false +# self.hide() +# $Body.disabled = true +# hud.pain = 3 +# crosshair.hide() +# #$Head/Camera.transform.origin.y +# #set_physics_process(false) +# false: +# #input_active = true +# self.show() +# $Body.disabled = false +# $SpawnSFX.play() +# $SpawnVFX.emitting = true +# hud.pain = 0 +# crosshair.show() +# #$Head/Camera.transform.origin = Vector3(0,0,0) +# #set_physics_process(true) +# dead = value +# var focus_banner_alpha = 0 var focus_banner_inc = 5 var focus_banner_dec = 1 @@ -148,13 +156,13 @@ func view_banner(show:bool): jetpack_active = jetpack motion_velocity = lin_velocity -@rpc(any_peer, call_local, reliable) func set_dead(is_dead: bool): +#@rpc(any_peer, call_local, reliable) func set_dead(is_dead: bool): #print("Recieved RPC call for set_dead ", is_dead) - if not is_dead: - spawn() +# if not is_dead: +# spawn() - self.dead = is_dead +# self.dead = is_dead # if is_multiplayer_authority(): # print("Rebroadcasting RPC call for set_dead ", dead) @@ -267,15 +275,6 @@ func _input(event) -> void: weapon.trigger(1, false) func _process(delta): - if dead: -# $Head/Camera.position.y = -1 # lower the head to the ground, let the player see their gibs -# $Head/Camera.rotation.x = 0 # reset the tilt so the camera looks forward -# $Head/Camera.rotation.z = -20 - return - -# $Head/Camera.position.y = 0 -# $Head/Camera.rotation.z = 0 - $Jetpack/GPUParticles3D.emitting = jetpack_active if jetpack_active: @@ -338,10 +337,9 @@ func _process(delta): if is_multiplayer_authority(): print("Taken damage: ", damage, " by: ", attacker, " from: ", source_position) hud.damage(damage) - main.player_list.players[self.get_multiplayer_authority()].health -= damage # reduce health - main.push_local_player_info() + health -= damage # reduce health - if main.player_list.players[self.get_multiplayer_authority()].health <= 0: # are we dead? + if health <= 0: # are we dead? print("Died") rpc(&'die', attacker) @@ -354,13 +352,28 @@ func _process(delta): if not dead: rpc(&'moan') # all puppets must scream! -@rpc(any_peer, call_local, reliable) func spawn(): +@rpc(any_peer, call_local, reliable) func spawn(spawn_transform: Transform3D): + dead = false + + self.global_transform = spawn_transform + + health = max_health $Head/Camera.position.y = 0 $Head/Camera.rotation.z = 0 jetpack_fuel = jetpack_tank + self.show() + $Body.disabled = false + $SpawnSFX.play() + $SpawnVFX.emitting = true + + if is_multiplayer_authority(): # don't touch these on puppets + hud.pain = 0 + crosshair.show() @rpc(any_peer, call_local, reliable) func die(killer_pid: int): + dead = true + var gibs = gibs_vfx.instantiate() get_tree().root.add_child(gibs) gibs.global_transform = self.global_transform @@ -374,7 +387,14 @@ func _process(delta): # return #main.rpc(&'destroy_player', self.get_multiplayer_authority()) main.destroy_player(self.get_multiplayer_authority()) - set_dead(true) + + self.hide() + $Body.disabled = true + + if is_multiplayer_authority(): # don't touch these on puppets + hud.pain = 3 + crosshair.hide() + #main.chat.rpc(&'chat_notification', "Player [/i][b][color=" + main.player_list.players[self.get_multiplayer_authority()].color.to_html() + "]" + main.player_list.players[self.get_multiplayer_authority()].name + "[/color][/b][i] was killed by " + main.player_list.players[killer_pid].name ) main.chat.chat_notification("Player [/i][b][color=" + main.player_list.players[self.get_multiplayer_authority()].color.to_html() + "]" + main.player_list.players[self.get_multiplayer_authority()].name + "[/color][/b][i] was killed by " + main.player_list.players[killer_pid].name ) diff --git a/Game/Assets/Weapons/Weapon.tscn b/Game/Assets/Weapons/Weapon.tscn index d935ddf..371fe9e 100644 --- a/Game/Assets/Weapons/Weapon.tscn +++ b/Game/Assets/Weapons/Weapon.tscn @@ -12,6 +12,15 @@ script = ExtResource( "2" ) [node name="Handgun" parent="." instance=ExtResource( "1" )] +[node name="Static" parent="Handgun/Handgun_Armature/Skeleton3D" index="0"] +layers = 2 + +[node name="Hand" parent="Handgun/HandArmature/Skeleton3D2" index="0"] +layers = 2 + +[node name="AnimationPlayer" parent="Handgun" index="4"] +blend_times = [] + [node name="SFX" type="Node3D" parent="."] script = null @@ -48,6 +57,7 @@ unit_db = 4.0 unit_size = 16.0 max_db = 4.0 +[editable path="Handgun"] [editable path="SFX/Shoot A"] [editable path="SFX/Shoot B"] [editable path="SFX/Shoot C"] diff --git a/Game/Main.gd b/Game/Main.gd index 6f4f6f8..7c37862 100644 --- a/Game/Main.gd +++ b/Game/Main.gd @@ -288,8 +288,9 @@ func push_local_player_info(): # # alternative finale to this function that is a workaround to avoid Godot crashing due to an engine bug # https://github.com/godotengine/godot/issues/52853 if destroy_free_player_crash_workaround: - print("Setting player ", pid, " as DEAD") - player_node.set_dead(true) + pass + #print("Setting player ", pid, " as DEAD") + #player_node.set_dead(true) else: # regular method follows player_node.name = str(player_node.name) + "_dead" # avoids name collision when instancing another player scene @@ -308,14 +309,15 @@ func create_player(pid: int, is_local:= false, respawn:= false) -> void: if $Players.has_node(str(pid)): # if this is a respawn player_node = $Players.get_node(str(pid)) #print("Setting player ", pid, " as ALIVE") - player_node.set_dead(false) - + #player_node.set_dead(false) var spawnpoint = $Map/SpawnPoints.get_children()[randi() % len($Map/SpawnPoints.get_children())] - player_node.global_transform = spawnpoint.global_transform - player_list.players[pid].health = 100 + player_node.spawn(spawnpoint.global_transform) - if local_player: - push_local_player_info() +# player_node.global_transform = spawnpoint.global_transform +# player_list.players[pid].health = 100 + +# if local_player: +# push_local_player_info() #focus = GameFocus.GAME # make sure the player has no menu displayed when they respawn return # avoid running the rest of this function