Hi,
I need to make reviving system without making custom health system so I need to prevent player from dying at 0 health and attach my code which will run instead. Can someone help?
Alright, I’m back at my PC and I’ve rewritten this post to contain more helpful information and more code to help you out with your endeavour. What I’ve got here now should work for you.
First, let’s disable the player dying on the server-side in a Script
, preferably somewhere in ServerScriptService
.
local Players = game:GetService("Players")
local function handleCharacter(character: any): ()
local Humanoid = character:WaitForChild("Humanoid") :: Humanoid
Humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
Humanoid.HealthChanged:Connect(function (health)
if health > 0 then
return
end
-- Replace with your desired Down But Not Out (DBNO) behavior!
print(Players:GetPlayerFromCharacter(character).Name .. " was downed!")
end)
end
local function handlePlayer(player: Player): ()
local Character = if player.Character and player.Character.Parent
then player.Character
else player.CharacterAdded:Wait()
handleCharacter(Character)
player.CharacterAdded:Connect(handleCharacter)
end
for _, player in Players:GetPlayers() do
handlePlayer(player)
end
Players.PlayerAdded:Connect(handlePlayer)
Now for the client-side, we need to do this for every player as well, because the client handles things like joint breakage itself.
local Players = game:GetService("Players")
local function handlePlayer(player: Player): ()
local Character = if player.Character and player.Character.Parent
then player.Character
else player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid") :: Humanoid
Humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
player.CharacterAdded:Connect(function (character)
-- I didn't think it was worth creating a function for 2 lines.
local Humanoid = character:WaitForChild("Humanoid") :: Humanoid
Humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
end)
end
-- This will include the Players.LocalPlayer.
for _, player in Players:GetPlayers() do
handlePlayer(player)
end
Players.PlayerAdded:Connect(handlePlayer)
Some things for you to note:
-
If you wish to respawn the player, use
Player:LoadCharacter()
, because the game will no longer do this for you. This gives you more flexibility for when the player should be respawned (when you consider them dead). -
You may want to handle health regeneration in your DBNO behavior, lest players gain health whilst downed.
-
A player killing themselves via client-side damage (e.g. resetting) will do nothing, you are welcome to handle this using a
RemoteEvent
or otherwise. -
If you still want a player’s character to “break apart” you can use
Model:BreakJoints()
and setCanCollide
to true on the player’s parts (otherwise the limbs etc. will fall through the map). -
You should be able to adapt this code and use the
workspace.DescendantAdded
event to look for newHumanoid
s if you wish for it to apply allHumanoid
s and not just those owned by players.
Here’s an example of the code working!
Your code had a lot of mistakes so I corrected syntax error and SetStateType to SetStateEnabled but it didn’t work (zero affect on gameplay), I would send the corrected code but I already closed studio and my internet is bad, trust me I didn’t miss anything
Player will see incorrect amount of health on the top right corner of the screen
If you’re doing a custom revive logic, couldn’t you make a damage function yourself in a ModuleScript? You could have a function that checks if the player’s damage taken will be lethal, and instead of doing TakeDamage, it’ll just trigger the revive system.
I assume you have a module that takes away the health in your game. Just check the ending result before taking away the health. For example, Humanoid.Health currently equals to 10. And he touches something that would take away 15 health, do this first
result = Humanoid.Health - TakeAway
if result < 0 then
Humanoid.Health = Humanoid.Health + result – regenerate the health instead of taking away
– attach your code here!
end
Yes, let’s also make a custom engine that will handle my game better than roblox studio. The thing is that I want to keep this bar. I only need to attach other event to player’s death than the roblox’s default.
I want to swap the function that runs on event that roblox use to break joints, not use a module to prevent that event from firing @PrizeCounterPuncher same thing
Use Humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false)
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.