Advertisement
HanzerCopy

Versi 2

Apr 17th, 2025
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.47 KB | Source Code | 0 0
  1. local TARGET_BLOCK_NAME = "Kill" -- Ganti ini kalau kamu mau pakai nama lain, contoh: "Lava", "DangerZone"
  2. local DAMAGE_PER_SECOND = 10
  3. local REGEN_PER_SECOND = 1
  4. local TOUCH_DELAY = 0.2
  5. local touchingPlayers = {}
  6. local function isStillTouching(part, character)
  7.     for _, limb in ipairs(character:GetChildren()) do
  8.         if limb:IsA("BasePart") then
  9.             for _, touching in ipairs(limb:GetTouchingParts()) do
  10.                 if touching == part then
  11.                     return true
  12.                 end
  13.             end
  14.         end
  15.     end
  16.     return false
  17. end
  18. local function applyDamage(part, character)
  19.     local humanoid = character:FindFirstChild("Humanoid")
  20.     if not humanoid then return end
  21.     local id = character:GetFullName()..part:GetFullName()
  22.     if not touchingPlayers[id] then
  23.         touchingPlayers[id] = true
  24.         while touchingPlayers[id] and humanoid.Health > 0 do
  25.             humanoid:TakeDamage(DAMAGE_PER_SECOND * TOUCH_DELAY)
  26.             wait(TOUCH_DELAY)
  27.         end
  28.     end
  29. end
  30. local function startRegen(part, character)
  31.     local humanoid = character:FindFirstChild("Humanoid")
  32.     if not humanoid then return end
  33.     local id = character:GetFullName()..part:GetFullName()
  34.     wait(0.2)
  35.     if isStillTouching(part, character) then return end
  36.     while not touchingPlayers[id] and humanoid.Health < humanoid.MaxHealth do
  37.         local target = math.min(humanoid.Health + REGEN_PER_SECOND * TOUCH_DELAY, humanoid.MaxHealth)
  38.         local current = humanoid.Health
  39.         local steps = 5
  40.         local interval = TOUCH_DELAY / steps
  41.         for i = 1, steps do
  42.             if touchingPlayers[id] then return end
  43.             humanoid.Health = current + (target - current) * (i / steps)
  44.             wait(interval)
  45.         end
  46.     end
  47. end
  48. local function setupKillBlock(part)
  49.     part.Touched:Connect(function(hit)
  50.         local player = game.Players:GetPlayerFromCharacter(hit.Parent)
  51.         if player then
  52.             applyDamage(part, hit.Parent)
  53.         end
  54.     end)
  55.     part.TouchEnded:Connect(function(hit)
  56.         local player = game.Players:GetPlayerFromCharacter(hit.Parent)
  57.         if player then
  58.             local id = hit.Parent:GetFullName()..part:GetFullName()
  59.             touchingPlayers[id] = nil
  60.             coroutine.wrap(function()
  61.                 startRegen(part, hit.Parent)
  62.             end)()
  63.         end
  64.     end)
  65. end
  66. -- Pasang ke semua balok bernama sesuai TARGET_BLOCK_NAME
  67. for _, obj in ipairs(workspace:GetDescendants()) do
  68.     if obj:IsA("BasePart") and obj.Name == TARGET_BLOCK_NAME then
  69.         setupKillBlock(obj)
  70.     end
  71. end
  72. -- Kalau ada balok baru bernama TARGET_BLOCK_NAME
  73. workspace.DescendantAdded:Connect(function(obj)
  74.     if obj:IsA("BasePart") and obj.Name == TARGET_BLOCK_NAME then
  75.         setupKillBlock(obj)
  76.     end
  77. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement