Files
Dota-Zombie-Invasion/scripts/vscripts/abilities/creep/kaban_rofl_ability.lua
T
2026-05-29 15:11:31 +07:00

159 lines
6.4 KiB
Lua

local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.kaban_rofl_ability = __TS__Class()
local kaban_rofl_ability = ____exports.kaban_rofl_ability
kaban_rofl_ability.name = "kaban_rofl_ability"
kaban_rofl_ability.____file_path = "scripts/vscripts/abilities/creep/kaban_rofl_ability.lua"
__TS__ClassExtends(kaban_rofl_ability, BaseAbility)
function kaban_rofl_ability.prototype.GetIntrinsicModifierName(self)
return "modifier_kaban_rofl_ability"
end
kaban_rofl_ability = __TS__Decorate(
kaban_rofl_ability,
kaban_rofl_ability,
{registerAbility(nil)},
{kind = "class", name = "kaban_rofl_ability"}
)
____exports.kaban_rofl_ability = kaban_rofl_ability
____exports.modifier_kaban_rofl_ability = __TS__Class()
local modifier_kaban_rofl_ability = ____exports.modifier_kaban_rofl_ability
modifier_kaban_rofl_ability.name = "modifier_kaban_rofl_ability"
modifier_kaban_rofl_ability.____file_path = "scripts/vscripts/abilities/creep/kaban_rofl_ability.lua"
__TS__ClassExtends(modifier_kaban_rofl_ability, BaseModifier)
function modifier_kaban_rofl_ability.prototype.IsHidden(self)
return true
end
function modifier_kaban_rofl_ability.prototype.OnCreated(self, params)
Timers:CreateTimer(
30,
function()
UTIL_Remove(self:GetParent())
end
)
end
function modifier_kaban_rofl_ability.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE, MODIFIER_PROPERTY_MIN_HEALTH}
end
function modifier_kaban_rofl_ability.prototype.CheckState(self)
return {[MODIFIER_STATE_NO_HEALTH_BAR] = true}
end
function modifier_kaban_rofl_ability.prototype.GetMinHealth(self)
return 1
end
function modifier_kaban_rofl_ability.prototype.OnTakeDamage(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent():GetOwner() then
return
end
if event.unit ~= self:GetParent() then
return
end
local parent = self:GetParent()
local parentPos = parent:GetAbsOrigin()
local attacker = event.attacker
local hasEasterEgg = self:GetParent():HasModifier("modifier_easter_egg_dropped")
if not hasEasterEgg and RandomFloat(0, 100) <= 2 then
local easterEgg = CreateItem("item_easter_egg", nil, nil)
if easterEgg then
local physicalItem = CreateItemOnPositionForLaunch(parentPos, easterEgg)
if physicalItem ~= nil then
local randomAngle = RandomFloat(0, 2 * math.pi)
local randomDistance = RandomFloat(100, 500)
local randomX = parentPos.x + randomDistance * math.cos(randomAngle)
local randomY = parentPos.y + randomDistance * math.sin(randomAngle)
local randomPos = Vector(randomX, randomY, parentPos.z)
local dropRadius = RandomFloat(50, 100)
easterEgg:LaunchLootInitialHeight(
false,
0,
150,
0.5,
randomPos + RandomVector(dropRadius)
)
self:GetParent():AddNewModifier(
self:GetParent(),
getModifierSourceAbility(
nil,
self:GetParent()
),
"modifier_easter_egg_dropped",
{}
)
end
end
elseif RandomFloat(0, 100) <= 20 then
local item = CreateItem("item_candy", nil, nil)
if item then
local physicalItem = CreateItemOnPositionForLaunch(parentPos, item)
if physicalItem ~= nil then
local randomAngle = RandomFloat(0, 2 * math.pi)
local randomDistance = RandomFloat(100, 500)
local randomX = parentPos.x + randomDistance * math.cos(randomAngle)
local randomY = parentPos.y + randomDistance * math.sin(randomAngle)
local randomPos = Vector(randomX, randomY, parentPos.z)
local dropRadius = RandomFloat(50, 100)
item:LaunchLootInitialHeight(
false,
0,
150,
0.5,
randomPos + RandomVector(dropRadius)
)
Timers:CreateTimer(
30,
function()
if IsValidEntity(physicalItem) then
UTIL_Remove(physicalItem)
end
end
)
end
end
end
if attacker and attacker:IsAlive() then
self:MakeUnitFlee(parent, attacker)
end
end
function modifier_kaban_rofl_ability.prototype.MakeUnitFlee(self, fleeingUnit, fromUnit)
local fleeingPos = fleeingUnit:GetAbsOrigin()
local fromPos = fromUnit:GetAbsOrigin()
local directionX = fleeingPos.x - fromPos.x
local directionY = fleeingPos.y - fromPos.y
local distance = math.sqrt(directionX * directionX + directionY * directionY)
if distance > 0 then
local normalizedX = directionX / distance
local normalizedY = directionY / distance
local fleeDistance = math.min(800, distance * 2)
local fleeX = fleeingPos.x + normalizedX * fleeDistance
local fleeY = fleeingPos.y + normalizedY * fleeDistance
local fleePos = Vector(fleeX, fleeY, fleeingPos.z)
local groundHeight = GetGroundHeight(fleePos, nil)
local validPos = Vector(fleeX, fleeY, groundHeight)
fleeingUnit:MoveToPosition(toVectorWS(nil, validPos))
fleeingUnit:AddNewModifier(
fleeingUnit,
getModifierSourceAbility(nil, fleeingUnit),
"modifier_phased",
{duration = 2}
)
end
end
modifier_kaban_rofl_ability = __TS__Decorate(
modifier_kaban_rofl_ability,
modifier_kaban_rofl_ability,
{registerModifier(nil)},
{kind = "class", name = "modifier_kaban_rofl_ability"}
)
____exports.modifier_kaban_rofl_ability = modifier_kaban_rofl_ability
return ____exports