Cat_in_the_hat

Skeleton ability

Sep 29th, 2025 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. local skullType = ItemType.HEADHUNT_SKULL
  2. local playerSkeletons = {}
  3. local hitDamage = 30
  4. local radius1, radius2, radius3, radius4 = 10, 20, 45, 32
  5. local updateInterval = 0.3
  6.  
  7. AbilityService.createAbility("script_skeleton", "KitPrimary", {
  8. maxProgress = 15,
  9. progressPerUse = 5,
  10. iconImage = "rbxassetid://94780640236752"
  11. })
  12.  
  13. for _, player in pairs(PlayerService.getPlayers()) do
  14. local abilities = AbilityService.getAbilities(player) or {}
  15. local hasAbility = false
  16. for _, a in pairs(abilities) do
  17. if a == "script_skeleton" then
  18. hasAbility = true
  19. break
  20. end
  21. end
  22. if not hasAbility then
  23. AbilityService.enableAbility(player, "script_skeleton")
  24. MessageService.sendInfo(player, "Enabled ability: script_skeleton")
  25. else
  26. MessageService.sendError(player, "You already have ability: script_skeleton")
  27. end
  28. end
  29.  
  30. Events.EntitySpawn(function(event)
  31. local player = event.entity:getPlayer()
  32. if not player then return end
  33.  
  34. local abilities = AbilityService.getAbilities(player) or {}
  35. local hasAbility = false
  36. for _, a in pairs(abilities) do
  37. if a == "script_skeleton" then
  38. hasAbility = true
  39. break
  40. end
  41. end
  42.  
  43. if not hasAbility then
  44. AbilityService.enableAbility(player, "script_skeleton")
  45. MessageService.sendInfo(player, "Enabled ability: script_skeleton")
  46. else
  47. MessageService.sendError(player, "You already have ability: script_skeleton")
  48. end
  49. end)
  50.  
  51. Events.UseAbility(function(event)
  52. if event.abilityName ~= "script_skeleton" then return end
  53. local player = event.entity:getPlayer()
  54. if not player then return end
  55.  
  56. local amt = InventoryService.getAmount(player, skullType) or 0
  57. if amt <= 0 then
  58. MessageService.sendError(player, "You need a Headhunt Skull to use this ability")
  59. return
  60. end
  61.  
  62. playerSkeletons[player] = playerSkeletons[player] or {}
  63. if #playerSkeletons[player] >= 3 then
  64. MessageService.sendError(player, "You already have 3 skeletons!")
  65. return
  66. end
  67.  
  68. InventoryService.removeItemAmount(player, skullType, 1)
  69. MessageService.sendInfo(player, "Spawned a skeleton to defend you")
  70.  
  71. local function spawnSkeleton()
  72. local offset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
  73. local skel = EntityService.spawnCreatureEntity(
  74. CreatureType.SKELETON,
  75. player:getEntity():getPosition() + offset,
  76. TeamService.getTeam(player)
  77. )
  78. skel:setMaxHealth(350)
  79. skel:setCustomName("Defender Skeleton")
  80. table.insert(playerSkeletons[player], skel)
  81. return skel
  82. end
  83.  
  84. local skeleton = spawnSkeleton()
  85. local masterTeam = TeamService.getTeam(player)
  86.  
  87. task.spawn(function()
  88. while player:getEntity() and skeleton:isAlive() do
  89. local skelPos = skeleton:getPosition()
  90. local playerPos = player:getEntity():getPosition()
  91. local targetEntity = nil
  92. local nearbyEntities = EntityService.getNearbyEntities(skelPos, radius4) or {}
  93.  
  94. for _, entity in ipairs(nearbyEntities) do
  95. if entity ~= skeleton and entity ~= player:getEntity() then
  96. local entPlayer = entity:getPlayer()
  97. local entityTeam = nil
  98. if entPlayer then
  99. entityTeam = TeamService.getTeam(entPlayer)
  100. end
  101. if entityTeam ~= masterTeam then
  102. targetEntity = entity
  103. break
  104. end
  105. end
  106. end
  107.  
  108. if targetEntity then
  109. local targetPos = targetEntity:getPosition()
  110. if targetPos then
  111. skeleton:moveTo(targetPos)
  112. end
  113. else
  114. local dist = (skelPos - playerPos).Magnitude
  115. if dist > radius3 then
  116. skeleton:destroy()
  117. for i, s in ipairs(playerSkeletons[player]) do
  118. if s == skeleton then
  119. table.remove(playerSkeletons[player], i)
  120. break
  121. end
  122. end
  123. skeleton = spawnSkeleton()
  124. elseif dist > radius2 then
  125. local moveOffset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
  126. skeleton:moveTo(playerPos + moveOffset)
  127. elseif dist > radius1 then
  128. local patrolOffset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
  129. skeleton:moveTo(playerPos + patrolOffset)
  130. end
  131. end
  132.  
  133. task.wait(updateInterval)
  134. end
  135.  
  136. for i, s in ipairs(playerSkeletons[player] or {}) do
  137. if s == skeleton then
  138. table.remove(playerSkeletons[player], i)
  139. break
  140. end
  141. end
  142. end)
  143. end)
  144.  
  145. Events.EntityDeath(function(event)
  146. local player = event.entity:getPlayer()
  147. if not player then return end
  148.  
  149. for _, skel in ipairs(playerSkeletons[player] or {}) do
  150. if skel and skel:isAlive() then
  151. skel:destroy()
  152. end
  153. end
  154. playerSkeletons[player] = {}
  155. end)
Advertisement
Add Comment
Please, Sign In to add comment