Advertisement
Cat_in_the_hat

Drain ability version 1 /2

Jul 14th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.00 KB | None | 0 0
  1. local SPECTRAL_DRAIN_ABILITY1 = "SpectralDrain"
  2. local ITEM_NEEDED = ItemType.DIAMOND
  3. local AMOUNT_NEEDED = 12
  4.  
  5. AbilityService.createAbility(SPECTRAL_DRAIN_ABILITY1, KeyCode.F, {
  6.     maxProgress = 1,
  7.     progressPerUse = 1,
  8.     iconImage = "rbxassetid://1234567890"
  9. })
  10.  
  11. local abilityOnList = {}
  12. local abilityOffList = {}
  13. local abilityUnlocked = {}
  14.  
  15. for _, player in pairs(PlayerService.getPlayers()) do
  16.     AbilityService.enableAbility(player, SPECTRAL_DRAIN_ABILITY1)
  17.     local username = player.name
  18.     abilityOffList[username] = true
  19. end
  20.  
  21. local spawnSideCounter = 1
  22. local aimTargetCounter = 1
  23. local currentSnowballHitSoundIndex = 1
  24.  
  25. local snowballHitSoundList = {
  26. "None"
  27. }
  28.  
  29. local function damageNearbyEntities(event, position, radius, damageAmount)
  30.     local nearbyEntities = EntityService.getNearbyEntities(position, radius)
  31.     if nearbyEntities then
  32.         for _, entity in pairs(nearbyEntities) do
  33.             local entityPlayer = entity:getPlayer()
  34.             local entityTeam = entityPlayer and TeamService.getTeam(entityPlayer)
  35.             local eventTeam = TeamService.getTeam(event.entity:getPlayer())
  36.  
  37.             if entityPlayer and entityTeam and eventTeam and entityTeam == eventTeam then
  38.                 print("Can't damage player teammates")
  39.             else
  40.                 CombatService.damage(entity, damageAmount)
  41.                 Events.EntityDamage(function(event)
  42.                     event.knockback.horizontal = 0
  43.                     event.knockback.vertical = 0
  44.                     event.knockback.fromPosition = event.entity:getPosition()
  45.                 end)
  46.             end
  47.         end
  48.     end
  49. end
  50.  
  51. local function spawnSoulModel(player, entity, angle, speed)
  52.     local radius = 8.5
  53.     local entityPosition = entity:getPosition()
  54.     local xOffset = radius * math.cos(angle)
  55.     local yOffset = radius * math.sin(angle)
  56.     local spawnPosition = entityPosition + Vector3.new(xOffset, 0, yOffset)
  57.  
  58.     local soulModel = ModelService.createModel("eldertree_orb", spawnPosition)
  59.     soulModel:setAnchored(true)
  60.     soulModel:setCollidable(false)
  61.     soulModel:setScale(2)
  62.    
  63.     SoundService.playSound(SoundType.WARLOCK_HEAL_START, soulModel:getPosition())
  64.  
  65.    
  66.     task.delay(3.5, function()
  67.         if soulModel then
  68.             soulModel:destroy()
  69.             soulModel = nil
  70.         end
  71.     end)
  72.  
  73.     task.spawn(function()
  74.         local startTime = tick()
  75.         local playerEntity = player:getEntity()
  76.         local forwardDirection = playerEntity:getCFrame().LookVector
  77.         local targetPosition = playerEntity:getPosition() + forwardDirection * 9.5
  78.         local moveSpeed = 34
  79.         local halfCircleTime = math.pi * radius / speed
  80.  
  81.         while soulModel do
  82.             local currentTime = tick()
  83.             local elapsedTime = currentTime - startTime
  84.  
  85.             if elapsedTime < halfCircleTime then
  86.                 local currentAngle = angle + elapsedTime * speed / radius
  87.                 local x = radius * math.cos(currentAngle)
  88.                 local y = radius * math.sin(currentAngle)
  89.                 if xOffset > 0 then
  90.                     soulModel:setPosition(entityPosition + Vector3.new(x, 0, y))
  91.                 else
  92.                     soulModel:setPosition(entityPosition + Vector3.new(x, 0, -y))
  93.                 end
  94.             else
  95.                 local currentPosition = soulModel:getPosition()
  96.                 local direction = (targetPosition - currentPosition).Unit
  97.                 local step = direction * moveSpeed * task.wait(0.05)
  98.                 soulModel:setPosition(currentPosition + step)
  99.  
  100.                 if (targetPosition - currentPosition).Magnitude < 2 then
  101.                     if abilityOnList[player.name] then
  102.                         local aimModel = aimTargetCounter == 1 and abilityOnList[player.name].aim1Model or abilityOnList[player.name].aim2Model
  103.                         aimTargetCounter = aimTargetCounter == 1 and 2 or 1
  104.                         local aimPosition = aimModel:getPosition()
  105.                         direction = (aimPosition - currentPosition).Unit
  106.  
  107.                         while (aimPosition - currentPosition).Magnitude >= 2 do
  108.                             if abilityOffList[player.name] then
  109.                                 soulModel:destroy()
  110.                                 soulModel = nil
  111.                                 break
  112.                             end
  113.  
  114.                             step = direction * moveSpeed * task.wait(0.05)
  115.                             soulModel:setPosition(currentPosition + step)
  116.                             currentPosition = soulModel:getPosition()
  117.                         end
  118.  
  119.                         if soulModel then
  120.                        
  121.                             SoundService.playSound(SoundType[snowballHitSoundList[currentSnowballHitSoundIndex]], aimPosition)
  122.                            
  123.                          
  124.                             currentSnowballHitSoundIndex = (currentSnowballHitSoundIndex % #snowballHitSoundList) + 1
  125.                            
  126.                             soulModel:destroy()
  127.                             soulModel = nil
  128.                         end
  129.                     end
  130.                 end
  131.             end
  132.  
  133.             if abilityOffList[player.name] and soulModel then
  134.                 soulModel:destroy()
  135.                 soulModel = nil
  136.             end
  137.  
  138.             task.wait(-9999)
  139.         end
  140.     end)
  141. end
  142.  
  143. local function handleSoulModel(event, player, position, maxRadius)
  144.     local nearbyEntities = EntityService.getNearbyEntities(position, maxRadius)
  145.     if nearbyEntities then
  146.         for _, entity in pairs(nearbyEntities) do
  147.             local entityPlayer = entity:getPlayer()
  148.             local entityTeam = entityPlayer and TeamService.getTeam(entityPlayer)
  149.             local eventTeam = TeamService.getTeam(event.entity:getPlayer())
  150.  
  151.             if entityPlayer and entityTeam and eventTeam and entityTeam == eventTeam then
  152.                 print("Can't damage player teammates")
  153.             else
  154.                 local entityPosition = entity:getPosition()
  155.                 local angle
  156.  
  157.                 if spawnSideCounter == 1 then
  158.                     angle = math.random() * math.pi - math.pi / 2
  159.                 else
  160.                     angle = math.random() * math.pi + math.pi / 2
  161.                 end
  162.  
  163.                 spawnSideCounter = spawnSideCounter + 1
  164.                 if spawnSideCounter > 2 then
  165.                     spawnSideCounter = 1
  166.                 end
  167.  
  168.                 local speed = 36
  169.                 spawnSoulModel(player, entity, angle, speed)
  170.             end
  171.         end
  172.     end
  173. end
  174.  
  175. local function updateSoulsuckerPosition(player, soulsuckerModel, offset)
  176.     while soulsuckerModel do
  177.         local playerEntity = player:getEntity()
  178.         soulsuckerModel:setCFrame(playerEntity:getCFrame() * CFrame.new(offset))
  179.         task.wait(-999999999)
  180.     end
  181. end
  182.  
  183. local function updateGun2Position(player, gun2Model, offset)
  184.     while gun2Model do
  185.         local playerEntity = player:getEntity()
  186.         gun2Model:setCFrame(playerEntity:getCFrame() * CFrame.new(offset))
  187.         gun2Model:setRotation(Vector3.new(-45, -25, -194))
  188.         task.wait(-9999999)
  189.     end
  190. end
  191.  
  192. local function updateGun1Position(player, gun1Model, offset)
  193.     while gun1Model do
  194.         local playerEntity = player:getEntity()
  195.         gun1Model:setCFrame(playerEntity:getCFrame() * CFrame.new(offset))
  196.         gun1Model:setRotation(Vector3.new(-45, 25, -150))
  197.         task.wait(-999999999)
  198.     end
  199. end
  200.  
  201. local function updateAim1Position(player, aim1Model, offset)
  202.     while aim1Model do
  203.         local playerEntity = player:getEntity()
  204.         aim1Model:setCFrame(playerEntity:getCFrame() * CFrame.new(offset))
  205.         aim1Model:setRotation(Vector3.new(0, 10, 0))
  206.         task.wait(-999999999)
  207.     end
  208. end
  209.  
  210. local function updateAim2Position(player, aim2Model, offset)
  211.     while aim2Model do
  212.         local playerEntity = player:getEntity()
  213.         aim2Model:setCFrame(playerEntity:getCFrame() * CFrame.new(offset))
  214.         aim2Model:setRotation(Vector3.new(0, 10, 0))
  215.         task.wait(-999999999)
  216.     end
  217. end
  218.  
  219. local function fadeAimModels(username)
  220.     task.spawn(function()
  221.         local aim1Model = abilityOnList[username].aim1Model
  222.         local aim2Model = abilityOnList[username].aim2Model
  223.        
  224.         if aim1Model and aim2Model then
  225.             aim1Model:setTransparency(1)
  226.             aim2Model:setTransparency(1)
  227.            
  228.             local transparency = 1
  229.             local shouldContinue = true
  230.             while transparency > 0 and shouldContinue do
  231.                 transparency = transparency - 0.1
  232.                 aim1Model:setTransparency(transparency)
  233.                 aim2Model:setTransparency(transparency)
  234.                
  235.                 if transparency <= 0 or abilityOffList[username] then
  236.                     shouldContinue = false
  237.                 end
  238.                 task.wait(0.1)
  239.             end
  240.         end
  241.     end)
  242. end
  243.  
  244. Events.UseAbility(function(event)
  245.     if event.abilityName == SPECTRAL_DRAIN_ABILITY1 then
  246.         local player = event.entity:getPlayer()
  247.         if player then
  248.             local username = player.name
  249.  
  250.             if not abilityUnlocked[username] then
  251.                 local itemCount = InventoryService.getAmount(player, ITEM_NEEDED)
  252.                 if itemCount < AMOUNT_NEEDED then
  253.                     MessageService.sendError(player, "You need " .. AMOUNT_NEEDED .. " diamonds to unlock Spectral Drain.")
  254.                     return
  255.                 else
  256.                     InventoryService.removeItemAmount(player, ITEM_NEEDED, AMOUNT_NEEDED)
  257.                     abilityUnlocked[username] = true
  258.                 end
  259.             end
  260.  
  261.             if abilityOnList[username] then
  262.                 if abilityOnList[username].soulsuckerModel then
  263.                     local soulsuckerModel = abilityOnList[username].soulsuckerModel
  264.                     soulsuckerModel:destroy()
  265.                     abilityOnList[username].soulsuckerModel = nil
  266.                     abilityOffList[username] = true
  267.                 end
  268.                 if abilityOnList[username].gun2Model then
  269.                     local gun2Model = abilityOnList[username].gun2Model
  270.                     gun2Model:destroy()
  271.                     abilityOnList[username].gun2Model = nil
  272.                 end
  273.                 if abilityOnList[username].gun1Model then
  274.                     local gun1Model = abilityOnList[username].gun1Model
  275.                     gun1Model:destroy()
  276.                     abilityOnList[username].gun1Model = nil
  277.                 end
  278.                 if abilityOnList[username].aim1Model then
  279.                     local aim1Model = abilityOnList[username].aim1Model
  280.                     aim1Model:destroy()
  281.                     abilityOnList[username].aim1Model = nil
  282.                 end
  283.                 if abilityOnList[username].aim2Model then
  284.                     local aim2Model = abilityOnList[username].aim2Model
  285.                     aim2Model:destroy()
  286.                     abilityOnList[username].aim2Model = nil
  287.                 end
  288.                 abilityOnList[username] = nil
  289.                 abilityOffList[username] = true
  290.             else
  291.                 local soulsuckerOffset = Vector3.new(0, 1, -13.9)
  292.                 local soulsuckerPosition = (player:getEntity():getCFrame() * CFrame.new(soulsuckerOffset)).Position
  293.                 local soulsuckerModel = ModelService.createItemModel("star", soulsuckerPosition)
  294.                 soulsuckerModel:setAnchored(true)
  295.                 soulsuckerModel:setCollidable(false)
  296.                 soulsuckerModel:setScale(17.8)
  297.                 soulsuckerModel:setTransparency(0.950)
  298.  
  299.                 local gun2Offset = Vector3.new(-7, 8.5, 1.5)
  300.                 local gun2Position = (player:getEntity():getCFrame() * CFrame.new(gun2Offset)).Position
  301.                 local gun2Model = ModelService.createItemModel("player_vacuum", gun2Position)
  302.                 gun2Model:setAnchored(true)
  303.                 gun2Model:setCollidable(false)
  304.                 gun2Model:setScale(3.5)
  305.                 gun2Model:setTransparency(0)
  306.                 gun2Model:setRotation(Vector3.new(-90, 0, 0))
  307.  
  308.                 local gun1Offset = Vector3.new(7.5, 8.5, 1.5)
  309.                 local gun1Position = (player:getEntity():getCFrame() * CFrame.new(gun1Offset)).Position
  310.                 local gun1Model = ModelService.createItemModel("player_vacuum", gun1Position)
  311.                 gun1Model:setAnchored(true)
  312.                 gun1Model:setCollidable(false)
  313.                 gun1Model:setScale(3.5)
  314.                 gun1Model:setTransparency(0)
  315.                
  316.                 local aim1Offset = Vector3.new(-4.6, 3.7, -2.76)
  317.                 local aim1Position = (player:getEntity():getCFrame() * CFrame.new(aim1Offset)).Position
  318.                 local aim1Model = ModelService.createItemModel("owl_orb", aim1Position)
  319.                 aim1Model:setAnchored(true)
  320.                 aim1Model:setCollidable(false)
  321.                 aim1Model:setScale(1.8)
  322.                 aim1Model:setTransparency(0)
  323.  
  324.                 local aim2Offset = Vector3.new(4.6, 3.7, -2.35)
  325.                 local aim2Position = (player:getEntity():getCFrame() * CFrame.new(aim2Offset)).Position
  326.                 local aim2Model = ModelService.createItemModel("owl_orb", aim2Position)
  327.                 aim2Model:setAnchored(true)
  328.                 aim2Model:setCollidable(false)
  329.                 aim2Model:setScale(1.8)
  330.                 aim2Model:setTransparency(0)
  331.  
  332.                 abilityOnList[username] = {
  333.                     soulsuckerModel = soulsuckerModel,
  334.                     gun2Model = gun2Model,
  335.                     gun1Model = gun1Model,
  336.                     aim1Model = aim1Model,
  337.                     aim2Model = aim2Model
  338.                 }
  339.                 abilityOffList[username] = nil
  340.  
  341.  
  342.  
  343.  
  344.  
  345.                 task.spawn(function() updateSoulsuckerPosition(player, soulsuckerModel, soulsuckerOffset) end)
  346.                 task.spawn(function() updateGun2Position(player, gun2Model, gun2Offset) end)
  347.                 task.spawn(function() updateGun1Position(player, gun1Model, gun1Offset) end)
  348.                 task.spawn(function() updateAim1Position(player, aim1Model, aim1Offset) end)
  349.                 task.spawn(function() updateAim2Position(player, aim2Model, aim2Offset) end)
  350.  
  351.          
  352.                 wait(0.1)
  353.  
  354.              
  355.                 if aim1Model and aim2Model then
  356.                     task.spawn(function()
  357.                         fadeAimModels(username)
  358.                     end)
  359.                 end
  360.  
  361.                
  362.                 wait(2.3)
  363.                 task.spawn(function()
  364.                     while soulsuckerModel do
  365.                         if not abilityOffList[username] then
  366.                             damageNearbyEntities(event, soulsuckerModel:getPosition(), 12, 32)
  367.                         end
  368.                         task.wait(0.272)
  369.                     end
  370.                 end)
  371.  
  372.                 task.spawn(function()
  373.                     while soulsuckerModel do
  374.                         if not abilityOffList[username] then
  375.                             handleSoulModel(event, player, soulsuckerModel:getPosition(), 13)
  376.                         end
  377.                         task.wait(0.3)
  378.                     end
  379.                 end)
  380.             end
  381.         end
  382.     end
  383. end)
  384.  
  385. Events.DisableAbility(function(event)
  386.     if event.abilityName == SPECTRAL_DRAIN_ABILITY1 then
  387.         local player = event.entity:getPlayer()
  388.         if player then
  389.             local username = player.name
  390.  
  391.             if abilityOnList[username] then
  392.                 if abilityOnList[username].soulsuckerModel then
  393.                     local soulsuckerModel = abilityOnList[username].soulsuckerModel
  394.                     soulsuckerModel:destroy()
  395.                     abilityOnList[username].soulsuckerModel = nil
  396.                 end
  397.                 if abilityOnList[username].gun2Model then
  398.                     local gun2Model = abilityOnList[username].gun2Model
  399.                     gun2Model:destroy()
  400.                     abilityOnList[username].gun2Model = nil
  401.                 end
  402.                 if abilityOnList[username].gun1Model then
  403.                     local gun1Model = abilityOnList[username].gun1Model
  404.                     gun1Model:destroy()
  405.                     abilityOnList[username].gun1Model = nil
  406.                 end
  407.                 if abilityOnList[username].aim1Model then
  408.                     local aim1Model = abilityOnList[username].aim1Model
  409.                     aim1Model:destroy()
  410.                     abilityOnList[username].aim1Model = nil
  411.                 end
  412.                 if abilityOnList[username].aim2Model then
  413.                     local aim2Model = abilityOnList[username].aim2Model
  414.                     aim2Model:destroy()
  415.                     abilityOnList[username].aim2Model = nil
  416.                 end
  417.                 abilityOnList[username] = nil
  418.                 abilityOffList[username] = true
  419.             end
  420.         end
  421.     end
  422. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement