Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local skullType = ItemType.HEADHUNT_SKULL
- local playerSkeletons = {}
- local hitDamage = 30
- local radius1, radius2, radius3, radius4 = 10, 20, 45, 32
- local updateInterval = 0.3
- AbilityService.createAbility("script_skeleton", "KitPrimary", {
- maxProgress = 15,
- progressPerUse = 5,
- iconImage = "rbxassetid://94780640236752"
- })
- for _, player in pairs(PlayerService.getPlayers()) do
- local abilities = AbilityService.getAbilities(player) or {}
- local hasAbility = false
- for _, a in pairs(abilities) do
- if a == "script_skeleton" then
- hasAbility = true
- break
- end
- end
- if not hasAbility then
- AbilityService.enableAbility(player, "script_skeleton")
- MessageService.sendInfo(player, "Enabled ability: script_skeleton")
- else
- MessageService.sendError(player, "You already have ability: script_skeleton")
- end
- end
- Events.EntitySpawn(function(event)
- local player = event.entity:getPlayer()
- if not player then return end
- local abilities = AbilityService.getAbilities(player) or {}
- local hasAbility = false
- for _, a in pairs(abilities) do
- if a == "script_skeleton" then
- hasAbility = true
- break
- end
- end
- if not hasAbility then
- AbilityService.enableAbility(player, "script_skeleton")
- MessageService.sendInfo(player, "Enabled ability: script_skeleton")
- else
- MessageService.sendError(player, "You already have ability: script_skeleton")
- end
- end)
- Events.UseAbility(function(event)
- if event.abilityName ~= "script_skeleton" then return end
- local player = event.entity:getPlayer()
- if not player then return end
- local amt = InventoryService.getAmount(player, skullType) or 0
- if amt <= 0 then
- MessageService.sendError(player, "You need a Headhunt Skull to use this ability")
- return
- end
- playerSkeletons[player] = playerSkeletons[player] or {}
- if #playerSkeletons[player] >= 3 then
- MessageService.sendError(player, "You already have 3 skeletons!")
- return
- end
- InventoryService.removeItemAmount(player, skullType, 1)
- MessageService.sendInfo(player, "Spawned a skeleton to defend you")
- local function spawnSkeleton()
- local offset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
- local skel = EntityService.spawnCreatureEntity(
- CreatureType.SKELETON,
- player:getEntity():getPosition() + offset,
- TeamService.getTeam(player)
- )
- skel:setMaxHealth(350)
- skel:setCustomName("Defender Skeleton")
- table.insert(playerSkeletons[player], skel)
- return skel
- end
- local skeleton = spawnSkeleton()
- local masterTeam = TeamService.getTeam(player)
- task.spawn(function()
- while player:getEntity() and skeleton:isAlive() do
- local skelPos = skeleton:getPosition()
- local playerPos = player:getEntity():getPosition()
- local targetEntity = nil
- local nearbyEntities = EntityService.getNearbyEntities(skelPos, radius4) or {}
- for _, entity in ipairs(nearbyEntities) do
- if entity ~= skeleton and entity ~= player:getEntity() then
- local entPlayer = entity:getPlayer()
- local entityTeam = nil
- if entPlayer then
- entityTeam = TeamService.getTeam(entPlayer)
- end
- if entityTeam ~= masterTeam then
- targetEntity = entity
- break
- end
- end
- end
- if targetEntity then
- local targetPos = targetEntity:getPosition()
- if targetPos then
- skeleton:moveTo(targetPos)
- end
- else
- local dist = (skelPos - playerPos).Magnitude
- if dist > radius3 then
- skeleton:destroy()
- for i, s in ipairs(playerSkeletons[player]) do
- if s == skeleton then
- table.remove(playerSkeletons[player], i)
- break
- end
- end
- skeleton = spawnSkeleton()
- elseif dist > radius2 then
- local moveOffset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
- skeleton:moveTo(playerPos + moveOffset)
- elseif dist > radius1 then
- local patrolOffset = Vector3.new(math.random(-radius1, radius1), 0, math.random(-radius1, radius1))
- skeleton:moveTo(playerPos + patrolOffset)
- end
- end
- task.wait(updateInterval)
- end
- for i, s in ipairs(playerSkeletons[player] or {}) do
- if s == skeleton then
- table.remove(playerSkeletons[player], i)
- break
- end
- end
- end)
- end)
- Events.EntityDeath(function(event)
- local player = event.entity:getPlayer()
- if not player then return end
- for _, skel in ipairs(playerSkeletons[player] or {}) do
- if skel and skel:isAlive() then
- skel:destroy()
- end
- end
- playerSkeletons[player] = {}
- end)
Advertisement
Add Comment
Please, Sign In to add comment