From 42da9a5d856c2ffdc1138f94dbdcff8b59d9fdee Mon Sep 17 00:00:00 2001
From: Canopteks <thomas.duhamel@protonmail.com>
Date: Tue, 3 Mar 2020 14:18:21 +0100
Subject: [PATCH] commit of minimal version, dying is smooth and kick you out
 of the game

---
 client/entities/characters/player.gd |  8 +++---
 client/levels/test/game.gd           |  5 ++++
 server/autoloads/gamestate.gd        |  3 +++
 server/entities/characters/player.gd | 40 +++++++++++-----------------
 server/levels/test/game.gd           | 19 ++++++++-----
 server/levels/test/game.tscn         |  7 ++---
 6 files changed, 45 insertions(+), 37 deletions(-)

diff --git a/client/entities/characters/player.gd b/client/entities/characters/player.gd
index 38ae7d0..c19b556 100644
--- a/client/entities/characters/player.gd
+++ b/client/entities/characters/player.gd
@@ -5,13 +5,15 @@ puppet func getRemoteMovement(position:Vector3):
 	self.set_translation(position)
 
 # Feedback when hurt
-puppet func hurt(damages:int):
-	print("You suffered a hit and lost " + str(damages) + " HPs !")
+puppet func hurt(hpNow:int):
+	print("You suffered a hit and are now at " + String(hpNow) + " !")
 
 # Feedback when killed
 puppet func die(killerId:int):
 	print(str(killerId) + " killed " + self.name)
 	
 	# Hide the killed player (NB: the client is only about inputs and display)
-	self.set_visible(false)
+	#self.set_visible(false)
+	
+	
 	
\ No newline at end of file
diff --git a/client/levels/test/game.gd b/client/levels/test/game.gd
index ca18260..08680e3 100644
--- a/client/levels/test/game.gd
+++ b/client/levels/test/game.gd
@@ -44,3 +44,8 @@ func getPlayerInput():
 
 	# Sent without safety resend
 	rpc_unreliable_id(1, "sendPlayerInputs", movementInput, jumpInput, jumpId, sprintInput, attackStateInput)
+	
+puppet func backToLobby():
+	#get_node("/root/lobby").show()
+	get_tree().quit()
+	queue_free()
diff --git a/server/autoloads/gamestate.gd b/server/autoloads/gamestate.gd
index af0a0e0..6454431 100644
--- a/server/autoloads/gamestate.gd
+++ b/server/autoloads/gamestate.gd
@@ -7,6 +7,9 @@ const MAX_CLIENTS = 2
 
 var players = {}
 
+const ENVIRONMENT_LAYER = 0
+const PLAYER_LAYER = 1
+
 func _ready():
 	# When a client connects to the server
 	get_tree().connect("network_peer_connected", self, "_playerConnected")
diff --git a/server/entities/characters/player.gd b/server/entities/characters/player.gd
index c6eb89a..a87dfd2 100644
--- a/server/entities/characters/player.gd
+++ b/server/entities/characters/player.gd
@@ -36,7 +36,7 @@ const FLOOR_NORMAL:Vector3 = Vector3(0,1,0)
 
 ######### ATTACKS VARS ########
 
-var isAlive:bool = true
+onready var lastStrikerId:int = ownId;
 
 var isAttacking:bool = false
 onready var attackTimer:Tween = $attackTween
@@ -59,17 +59,14 @@ var secondaryAttackDist:float = 1.2
 var secondaryAttackDuration:float = 0.2
 
 # Health points related values
-var hpMax:int = 60
-var hpNow:int = hpMax
-
+var hp:int = 0
 
 ######## FUNCTIONS ########
 
 # called by the engine
 func _physics_process(delta):
-	if isAlive:
-		processMovement(delta)
-		broadcastMovement()
+	processMovement(delta)
+	broadcastMovement()
 
 
 # Called from the game script to update the vars
@@ -102,10 +99,13 @@ func processMovement(delta):
 	elif motion < 0:
 		set_rotation_degrees(Vector3(0, 180, 0))
 
-	# Reset permitted jump if on floor and decrease max number of jumps if falling
 	if self.is_on_floor():
+		# Reset the number of jumps left
 		currentJump = 0
+		# Reset the last striker
+		lastStrikerId = ownId
 	elif currentJump == 0 && !isJumping:
+		# Initial jump prevented
 		currentJump = 1
 
 	# Jump attempts computation
@@ -195,22 +195,14 @@ func secondaryAttack():
 
 
 # Called when detected by an attack's hitbox
-func hurt(damages:int, killerId:int):
-	hpNow -= damages
-	
-	# Player still alive
-	if hpNow>0:
-		rpc_id(ownId, "hurt", damages)
-	
-	# Player killed
-	else:
-		rpc("die", killerId)
-		
-		# Bool checked in the physics processing
-		isAlive = false
-		
-		# Make the player traversable
-		collisionShape.set_disabled(true)
+func hurt(damages:int, sourceId:int):
+	hp += damages
+	lastStrikerId = sourceId
+	rpc_unreliable_id(ownId, "hurt", hp)
+
+func die():
+	rpc("die", lastStrikerId)
+	self.queue_free()
 
 
 ######## SIGNALS ########
diff --git a/server/levels/test/game.gd b/server/levels/test/game.gd
index fef2631..86489f1 100644
--- a/server/levels/test/game.gd
+++ b/server/levels/test/game.gd
@@ -1,13 +1,18 @@
 extends Node
 
-master func sendPlayerInputs(movementInput, jumpInput, jumpId, sprintInput, attackStateInput):
+master func sendPlayerInputs(movementInput:int, jumpInput:bool, jumpId:int, sprintInput:bool, attackStateInput:int):
 	
 	# Get the input from a client and send it to the matching remote player
-	var senderId = get_tree().get_rpc_sender_id()
-	gamestate.get_node("/root/game/"+str(senderId)).getPlayerInputs(movementInput, jumpInput, jumpId, sprintInput, attackStateInput)
+	var senderId:int = get_tree().get_rpc_sender_id()
+	if gamestate.players.has(senderId):
+		gamestate.get_node("/root/game/"+str(senderId)).getPlayerInputs(movementInput, jumpInput, jumpId, sprintInput, attackStateInput)
 
 
-# When the player enter the area under the map
-func _on_killingFallArea_body_entered(body):
-	# Instant-kill with the server as killer
-	body.hurt(body.hpMax, 0)
+# When the player exits the game area 
+func _on_killingFallArea_body_exited(body:PhysicsBody):
+	# Instant-kill if the body is a living player
+	if body.get_collision_layer_bit(gamestate.PLAYER_LAYER):
+		gamestate.players.erase(body.ownId)
+		rpc_id(body.ownId, "backToLobby")
+		#gamestate.disconnect_network_peer(body.ownId)
+		body.die()
diff --git a/server/levels/test/game.tscn b/server/levels/test/game.tscn
index 097b1ed..0e4f930 100644
--- a/server/levels/test/game.tscn
+++ b/server/levels/test/game.tscn
@@ -4,7 +4,7 @@
 [ext_resource path="res://levels/test/bloc/bloc.tscn" type="PackedScene" id=2]
 
 [sub_resource type="BoxShape" id=1]
-extents = Vector3( 175.136, 7.53585, 1 )
+extents = Vector3( 175.136, 87.8901, 1 )
 
 [node name="game" type="Spatial"]
 script = ExtResource( 1 )
@@ -22,6 +22,7 @@ transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
 transform = Transform( 5, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.15191, 0 )
 
 [node name="spawnCollection" type="Spatial" parent="."]
+transform = Transform( 0.996196, -0.0845788, 0.0209877, 0.084609, 0.996414, -0.000553806, -0.0208656, 0.00232744, 0.99978, 0, 0, 0 )
 
 [node name="spawn1" type="Position3D" parent="spawnCollection"]
 transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 6, 0 )
@@ -35,6 +36,6 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 6, 0 )
 [node name="killingFallArea" type="Area" parent="."]
 
 [node name="CollisionShape" type="CollisionShape" parent="killingFallArea"]
-transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -38.2712, 0 )
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.208731, 0 )
 shape = SubResource( 1 )
-[connection signal="body_entered" from="killingFallArea" to="." method="_on_killingFallArea_body_entered"]
+[connection signal="body_exited" from="killingFallArea" to="." method="_on_killingFallArea_body_exited"]
-- 
GitLab