Cat_in_the_hat

Roblox bedwars /beehive ability / bedwars script

Oct 2nd, 2025 (edited)
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.92 KB | None | 0 0
  1. local radius = 20 -- radius to attake bees
  2. local itemNeeded = ItemType.HEADHUNT_SKULL -- item needed
  3. local amountNeeded = 5 -- amount needed of item
  4. local maxBeehivePlacement = 5 -- max beehives a player can place
  5. local maxBees = 10 -- max bees that can be in radius  local despawnTime = 30 -- time beehive can be alive
  6. local playersBeehive = {}
  7. local currentPlayerBeehives = {}
  8.  
  9. AbilityService.createAbility("beehive_ability", "KitSecondary", {
  10.     maxProgress = 10,
  11.     progressPerUse = 5,
  12.     iconImage = "rbxassetid://135845664733177"
  13. })
  14.  
  15. for _, player in pairs(PlayerService.getPlayers()) do
  16.     local abilities = AbilityService.getAbilities(player) or {}
  17.     local hasAbility = false
  18.     for _, a in pairs(abilities) do
  19.         if a == "beehive_ability" then
  20.             hasAbility = true
  21.             break
  22.         end
  23.     end
  24.     if not hasAbility then
  25.         AbilityService.enableAbility(player, "beehive_ability")
  26.         MessageService.sendInfo(player, "Enabled ability: beehive_ability")
  27.     else
  28.         MessageService.sendError(player, "You already have ability: beehive_ability")
  29.     end
  30. end
  31.  
  32. Events.EntitySpawn(function(event)
  33.     local player = event.entity:getPlayer()
  34.     if not player then return end
  35.  
  36.     local abilities = AbilityService.getAbilities(player) or {}
  37.     local hasAbility = false
  38.     for _, a in pairs(abilities) do
  39.         if a == "beehive_ability" then
  40.             hasAbility = true
  41.             break
  42.         end
  43.     end
  44.  
  45.     if not hasAbility then
  46.         AbilityService.enableAbility(player, "beehive_ability")
  47.         MessageService.sendInfo(player, "Enabled ability: beehive_ability")
  48.     else
  49.         MessageService.sendError(player, "You already have ability: beehive_ability")
  50.     end
  51. end)
  52.  
  53. local function createBeehiveAt(basePos, player)
  54.     local shake = false
  55.     local radius = 20
  56.     local baseParts = {}
  57.     local beesCount = 0
  58.     local activeBees = {}
  59.     local findRadius = radius + 1.5
  60.     local despawnTime = 30
  61.     local timerDefault = despawnTime
  62.  
  63.     if not playersBeehive[player] then
  64.         playersBeehive[player] = {}
  65.     end
  66.  
  67.     if #playersBeehive[player] >= maxBeehivePlacement then
  68.         MessageService.sendError(player, "You can only have " .. maxBeehivePlacement .. " beehive at a time!")
  69.         return
  70.     end
  71.  
  72.     local blockBelowPos = basePos - Vector3.new(0, 3, 0)
  73.     for _, pos in ipairs(playersBeehive[player]) do
  74.         if (pos - blockBelowPos).Magnitude < 1 then
  75.             MessageService.sendError(player, "You can't place beehive on top of each other")
  76.             return
  77.         end
  78.     end
  79.  
  80.     table.insert(playersBeehive[player], blockBelowPos)
  81.     currentPlayerBeehives[blockBelowPos] = {index = #playersBeehive[player]}
  82.  
  83.     local blockBelow = BlockService.getBlockAt(blockBelowPos)
  84.     local originalBlockType = nil
  85.     if blockBelow then
  86.         originalBlockType = blockBelow.blockType
  87.         BlockService.destroyBlock(blockBelowPos)
  88.         BlockService.placeBlock(ItemType.GLOWSTONE, blockBelowPos)
  89.     end
  90.  
  91.     local model = ModelService.createItemModel(ItemType.BEEHIVE_GRENADE, basePos + Vector3.new(0, 2.8, -1.2))
  92.     model:setScale(2)
  93.     model:setAnchored(true)
  94.     model:setCollidable(false)
  95.  
  96.     local part1 = PartService.createPart(ItemType.CLAY_LIGHT_BROWN, basePos + Vector3.new(0, 1.7, 1.5))
  97.     part1:setSize(Vector3.new(0.5, 6.5, 0.5))
  98.     part1:setAnchored(true)
  99.     part1:setCollidable(false)
  100.  
  101.     local part2 = PartService.createPart(ItemType.CLAY_LIGHT_BROWN, basePos + Vector3.new(0, 4.7, -0.1))
  102.     part2:setSize(Vector3.new(0.5, 0.5, 2.8))
  103.     part2:setAnchored(true)
  104.     part2:setCollidable(false)
  105.  
  106.     MessageService.sendInfo(player, "Beehive (" .. currentPlayerBeehives[blockBelowPos].index .. ") will despawn in " .. timerDefault .. " seconds")
  107.  
  108.     local function getNearbyEnemies(center, radiusToUse)
  109.         local allEntities, seen = {}, {}
  110.         for y = -300, 300, 20 do
  111.             local checkCenter = Vector3.new(center.X, center.Y + y, center.Z)
  112.             local nearby = EntityService.getNearbyEntities(checkCenter, radiusToUse)
  113.             if nearby then
  114.                 for _, e in ipairs(nearby) do
  115.                     if not seen[e] then
  116.                         local ePlayer = e:getPlayer()
  117.                         local pTeam = TeamService.getTeam(player)
  118.                         local eTeam = ePlayer and TeamService.getTeam(ePlayer) or nil
  119.                         if eTeam ~= pTeam then
  120.                             seen[e] = true
  121.                             table.insert(allEntities, e)
  122.                         end
  123.                     end
  124.                 end
  125.             end
  126.         end
  127.         return (#allEntities > 0) and allEntities or nil
  128.     end
  129.  
  130.     task.spawn(function()
  131.         local pivot = model:getCFrame()
  132.         while despawnTime > 0 do
  133.             local nearbyEntities = getNearbyEnemies(basePos, findRadius)
  134.             shake = nearbyEntities and #nearbyEntities > 0
  135.             if shake then
  136.                 local angle = math.sin(tick() * 40) * math.rad(2)
  137.                 model:setCFrame(pivot * CFrame.Angles(0, 0, angle))
  138.             else
  139.                 model:setCFrame(pivot)
  140.             end
  141.             task.wait(0.02)
  142.         end
  143.     end)
  144.  
  145.     local function makeParts(center, radius)
  146.         local count, size, parts = 8 + (radius * 2), Vector3.new(1, 0.2, 0.3), {}
  147.         for i = 1, count do
  148.             local angle = (i / count) * math.pi * 2
  149.             local pos = center + Vector3.new(math.cos(angle) * (radius + 1.3), 7, math.sin(angle) * (radius + 1.3))
  150.             local p = PartService.createPart(ItemType.WOOL_WHITE, pos)
  151.             p:setSize(size)
  152.             p:setAnchored(true)
  153.             p:setCollidable(false)
  154.             p.initialY = pos.Y
  155.             parts[i] = p
  156.         end
  157.         return parts
  158.     end
  159.  
  160.     local function updateParts(parts, center, radius)
  161.         local target = center + Vector3.new(0, -1.5, 0)
  162.         for i = 1, #parts do
  163.             local angle = (i / #parts) * math.pi * 2
  164.             local checkX = center.X + math.cos(angle) * (radius + 1.3)
  165.             local checkZ = center.Z + math.sin(angle) * (radius + 1.3)
  166.             local y = parts[i].initialY
  167.             local minY = center.Y - 60
  168.             while y > minY and not BlockService.getBlockAt(Vector3.new(checkX, y, checkZ)) do
  169.                 y = y - 1
  170.             end
  171.             local final = Vector3.new(checkX, y + 0.5, checkZ)
  172.             parts[i]:setPosition(final)
  173.             parts[i]:setCFrame(CFrame.new(final, target))
  174.         end
  175.     end
  176.  
  177.     baseParts = makeParts(basePos, radius)
  178.     task.spawn(function()
  179.         while despawnTime > 0 do
  180.             updateParts(baseParts, basePos, radius)
  181.             task.wait(0.1)
  182.         end
  183.     end)
  184.  
  185.     local timerLabel = UIService.createTextLabel("⏱️ " .. timerDefault, basePos + Vector3.new(0, 7, 0))
  186.     timerLabel:setBackgroundColor(Color3.fromRGB(0, 0, 0))
  187.     timerLabel:setBackgroundTransparency(0.2)
  188.     timerLabel:setTextColor(Color3.fromRGB(255, 255, 255))
  189.     timerLabel:setSize(UDim2.fromScale(12, 3))
  190.     timerLabel:setFont(Font.Arial)
  191.  
  192.     task.spawn(function()
  193.         while despawnTime > 0 do
  194.             timerLabel:setText("⏱️ " .. math.ceil(despawnTime))
  195.             despawnTime = despawnTime - 1
  196.             task.wait(1)
  197.         end
  198.     end)
  199.  
  200.     task.spawn(function()
  201.         while despawnTime > 0 do
  202.             if beesCount < maxBees then
  203.                 local nearbyEntities = getNearbyEnemies(basePos, findRadius)
  204.                 if nearbyEntities and #nearbyEntities > 0 then
  205.                     local totalEntities = #nearbyEntities
  206.                     local beesPerEntity = math.floor(maxBees / totalEntities)
  207.                     local remainingBees = maxBees % totalEntities
  208.                     local targetAssignments = {}
  209.                     for i, entityTarget in ipairs(nearbyEntities) do
  210.                         local count = beesPerEntity
  211.                         if remainingBees > 0 then
  212.                             count = count + 1
  213.                             remainingBees = remainingBees - 1
  214.                         end
  215.                         for j = 1, count do
  216.                             table.insert(targetAssignments, entityTarget)
  217.                         end
  218.                     end
  219.                     for _, targetEntity in ipairs(targetAssignments) do
  220.                         local bee = ModelService.createModel(ModelType.BEE, model:getPosition())
  221.                         bee:setScale(1)
  222.                         bee:setAnchored(true)
  223.                         bee:setCollidable(false)
  224.                         table.insert(activeBees, bee)
  225.                         beesCount = beesCount + 1
  226.                         local offset = Vector3.new(0, 0, math.random(-23, 23) / 10)
  227.                         task.spawn(function()
  228.                             local speed = 0.7
  229.                             while bee and despawnTime > 0 do
  230.                                 if not targetEntity or not targetEntity:isAlive() or (targetEntity:getPosition() - basePos).Magnitude > findRadius then
  231.                                     local nearby = getNearbyEnemies(basePos, findRadius)
  232.                                     if nearby and #nearby > 0 then
  233.                                         targetEntity = nearby[math.random(1, #nearby)]
  234.                                         offset = Vector3.new(0, 0, math.random(-23, 23) / 10)
  235.                                     else
  236.                                         targetEntity = nil
  237.                                     end
  238.                                 end
  239.                                 local targetPos = targetEntity and targetEntity:isAlive() and (targetEntity:getPosition() + offset) or model:getPosition()
  240.                                 local currentPos = bee:getPosition()
  241.                                 local direction = targetPos - currentPos
  242.                                 if direction.Magnitude > 0.05 then
  243.                                     direction = direction.Unit
  244.                                     local newPos = currentPos + direction * speed
  245.                                     bee:setPosition(newPos)
  246.                                     bee:setCFrame(CFrame.new(newPos, targetPos))
  247.                                 else
  248.                                     if not targetEntity and (currentPos - model:getPosition()).Magnitude <= 2 then
  249.                                         bee:destroy()
  250.                                         table.remove(activeBees, table.find(activeBees, bee))
  251.                                         beesCount = beesCount - 1
  252.                                         return
  253.                                     end
  254.                                 end
  255.                                 local nearby = EntityService.getNearbyEntities(bee:getPosition(), 3)
  256.                                 if nearby then
  257.                                     for _, e in ipairs(nearby) do
  258.                                         if e:isAlive() then
  259.                                             local ePlayer = e:getPlayer()
  260.                                             local pTeam = TeamService.getTeam(player)
  261.                                             local eTeam = ePlayer and TeamService.getTeam(ePlayer) or nil
  262.                                             if eTeam ~= pTeam then
  263.                                                 CombatService.damage(e, 10)
  264.                                                 bee:destroy()
  265.                                                 table.remove(activeBees, table.find(activeBees, bee))
  266.                                                 beesCount = beesCount - 1
  267.                                                 return
  268.                                             end
  269.                                         end
  270.                                     end
  271.                                 end
  272.                                 task.wait(0.05)
  273.                             end
  274.                         end)
  275.                         task.wait(0.1)
  276.                     end
  277.                 else
  278.                     task.wait(0.5)
  279.                 end
  280.             else
  281.                 task.wait(0.5)
  282.             end
  283.         end
  284.     end)
  285.  
  286.     task.spawn(function()
  287.         task.wait(timerDefault)
  288.         if BlockService.getBlockAt(blockBelowPos) then
  289.             BlockService.destroyBlock(blockBelowPos)
  290.             if originalBlockType then
  291.                 BlockService.placeBlock(originalBlockType, blockBelowPos)
  292.             end
  293.         end
  294.         model:destroy()
  295.         part1:destroy()
  296.         part2:destroy()
  297.         for _, p in ipairs(baseParts) do p:destroy() end
  298.         for _, bee in ipairs(activeBees) do bee:destroy() end
  299.         timerLabel:destroy()
  300.         MessageService.sendInfo(player, "Beehive (" .. currentPlayerBeehives[blockBelowPos].index .. ") time has run out")
  301.         table.remove(playersBeehive[player], table.find(playersBeehive[player], blockBelowPos))
  302.         currentPlayerBeehives[blockBelowPos] = nil
  303.     end)
  304.  
  305.     return {model = model, parts = baseParts, activeBees = activeBees}
  306. end
  307.  
  308.  
  309. Events.UseAbility(function(event)
  310.     if event.abilityName ~= "beehive_ability" then return end
  311.     local player = event.entity:getPlayer()
  312.     if not player then return end
  313.  
  314.     if InventoryService.getAmount(player, itemNeeded) < amountNeeded then
  315.         MessageService.sendError(player, "You need "..amountNeeded.." "..tostring(itemNeeded).." to use this ability!")
  316.         return
  317.     end
  318.  
  319.     InventoryService.removeItemAmount(player, itemNeeded, amountNeeded)
  320.  
  321.     if not playersBeehive[player] then
  322.         playersBeehive[player] = {}
  323.     end
  324.  
  325.     if #playersBeehive[player] >= maxBeehivePlacement then
  326.         MessageService.sendError(player, "You have already placed the maximum number of beehives!")
  327.         return
  328.     end
  329.  
  330.     local entity = player:getEntity()
  331.     if entity and entity:getPosition() then
  332.         local pos = entity:getPosition()
  333.         local snappedBasePos = Vector3.new(
  334.             math.floor(pos.X + 0.5),
  335.             math.floor(pos.Y - 2 + 0.5),
  336.             math.floor(pos.Z + 0.5)
  337.         )
  338.         createBeehiveAt(snappedBasePos, player)
  339.     end
  340. end)
  341.  
  342. Events.EntityDeath(function(event)
  343.     local player = event.entity:getPlayer()
  344.     if player and playersBeehive[player] and #playersBeehive[player] > 0 then
  345.         for _, blockPos in ipairs(playersBeehive[player]) do
  346.             local hiveData = currentPlayerBeehives[blockPos]
  347.             if hiveData then
  348.                 if hiveData.model then hiveData.model:destroy() end
  349.                 for _, part in ipairs(hiveData.parts or {}) do part:destroy() end
  350.                 for _, bee in ipairs(hiveData.activeBees or {}) do bee:destroy() end
  351.                 currentPlayerBeehives[blockPos] = nil
  352.             end
  353.         end
  354.         playersBeehive[player] = {}
  355.         MessageService.sendError(player, "All beehives have been destroyed on death")
  356.     end
  357. end)
Advertisement
Add Comment
Please, Sign In to add comment