217 lines
7.7 KiB
Lua
217 lines
7.7 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 BaseItem = ____dota_ts_adapter.BaseItem
|
|
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
|
local registerAbility = ____dota_ts_adapter.registerAbility
|
|
local registerModifier = ____dota_ts_adapter.registerModifier
|
|
____exports.item_easter_egg = __TS__Class()
|
|
local item_easter_egg = ____exports.item_easter_egg
|
|
item_easter_egg.name = "item_easter_egg"
|
|
item_easter_egg.____file_path = "scripts/vscripts/items/util_items/item_easter_egg.lua"
|
|
__TS__ClassExtends(item_easter_egg, BaseItem)
|
|
function item_easter_egg.prototype.OnSpellStart(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local caster = self:GetCaster()
|
|
caster:AddNewModifier(caster, self, "modifier_orbiting_wisp", {duration = 60})
|
|
self:RemoveSelf()
|
|
end
|
|
item_easter_egg = __TS__Decorate(
|
|
item_easter_egg,
|
|
item_easter_egg,
|
|
{registerAbility(nil)},
|
|
{kind = "class", name = "item_easter_egg"}
|
|
)
|
|
____exports.item_easter_egg = item_easter_egg
|
|
____exports.modifier_orbiting_wisp = __TS__Class()
|
|
local modifier_orbiting_wisp = ____exports.modifier_orbiting_wisp
|
|
modifier_orbiting_wisp.name = "modifier_orbiting_wisp"
|
|
modifier_orbiting_wisp.____file_path = "scripts/vscripts/items/util_items/item_easter_egg.lua"
|
|
__TS__ClassExtends(modifier_orbiting_wisp, BaseModifier)
|
|
function modifier_orbiting_wisp.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.interval = 0.03
|
|
self.rotation = 0
|
|
self.rotateDelta = 0
|
|
self.rotateRadius = 200
|
|
self.revolution = 2
|
|
self.baseFacing = Vector(0, 1, 0)
|
|
self.relativePos = Vector(0, 0, 0)
|
|
self.position = Vector(0, 0, 0)
|
|
self.facing = Vector(0, 0, 0)
|
|
self.zero = Vector(0, 0, 0)
|
|
end
|
|
function modifier_orbiting_wisp.prototype.GetTexture(self)
|
|
return "util_items/eggs"
|
|
end
|
|
function modifier_orbiting_wisp.prototype.OnCreated(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local parent = self:GetParent()
|
|
self.rotateDelta = 360 / self.revolution * self.interval
|
|
self.relativePos = Vector(-self.rotateRadius, 0, 100)
|
|
local origin = parent:GetAbsOrigin()
|
|
self.position = Vector(origin.x + self.relativePos.x, origin.y + self.relativePos.y, origin.z + self.relativePos.z)
|
|
self.rotation = 0
|
|
self.facing = self.baseFacing
|
|
self.wisp = CreateUnitByName(
|
|
"npc_dota_golden_fish",
|
|
self.position,
|
|
true,
|
|
parent,
|
|
parent:GetOwner(),
|
|
parent:GetTeamNumber()
|
|
)
|
|
if self.wisp ~= nil then
|
|
self.wisp:SetForwardVector(self.facing)
|
|
self.wisp:AddNewModifier(
|
|
self:GetCaster(),
|
|
self:GetAbility(),
|
|
"modifier_wisp_orbiting",
|
|
{}
|
|
)
|
|
self.wisp:AddNewModifier(
|
|
self:GetCaster(),
|
|
self:GetAbility(),
|
|
"modifier_wisp_attack",
|
|
{duration = 60}
|
|
)
|
|
end
|
|
self:StartIntervalThink(self.interval)
|
|
end
|
|
function modifier_orbiting_wisp.prototype.OnIntervalThink(self)
|
|
if not IsServer() or not self.wisp then
|
|
return
|
|
end
|
|
local parent = self:GetParent()
|
|
self.rotation = self.rotation + self.rotateDelta
|
|
local origin = parent:GetAbsOrigin()
|
|
local targetPos = Vector(origin.x + self.relativePos.x, origin.y + self.relativePos.y, origin.z + self.relativePos.z)
|
|
local rotatedPos = rotatePositionYaw(nil, origin, -self.rotation, targetPos)
|
|
self.position = rotatedPos
|
|
self.facing = rotatePositionYaw(nil, self.zero, -self.rotation, self.baseFacing)
|
|
self.wisp:SetAbsOrigin(self.position)
|
|
self.wisp:SetForwardVector(self.facing)
|
|
end
|
|
function modifier_orbiting_wisp.prototype.OnDestroy(self)
|
|
if IsClient() then
|
|
return
|
|
end
|
|
if self.wisp then
|
|
UTIL_Remove(self.wisp)
|
|
end
|
|
end
|
|
modifier_orbiting_wisp = __TS__Decorate(
|
|
modifier_orbiting_wisp,
|
|
modifier_orbiting_wisp,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_orbiting_wisp"}
|
|
)
|
|
____exports.modifier_orbiting_wisp = modifier_orbiting_wisp
|
|
____exports.modifier_wisp_orbiting = __TS__Class()
|
|
local modifier_wisp_orbiting = ____exports.modifier_wisp_orbiting
|
|
modifier_wisp_orbiting.name = "modifier_wisp_orbiting"
|
|
modifier_wisp_orbiting.____file_path = "scripts/vscripts/items/util_items/item_easter_egg.lua"
|
|
__TS__ClassExtends(modifier_wisp_orbiting, BaseModifier)
|
|
function modifier_wisp_orbiting.prototype.IsHidden(self)
|
|
return true
|
|
end
|
|
function modifier_wisp_orbiting.prototype.GetEffectName(self)
|
|
return "particles/econ/items/lifestealer/lifestealer_immortal_backbone_gold/lifestealer_immortal_backbone_gold_rage.vpcf"
|
|
end
|
|
function modifier_wisp_orbiting.prototype.GetEffectAttachType(self)
|
|
return PATTACH_OVERHEAD_FOLLOW
|
|
end
|
|
function modifier_wisp_orbiting.prototype.CheckState(self)
|
|
return {
|
|
[MODIFIER_STATE_INVULNERABLE] = true,
|
|
[MODIFIER_STATE_UNSELECTABLE] = true,
|
|
[MODIFIER_STATE_UNTARGETABLE] = true,
|
|
[MODIFIER_STATE_OUT_OF_GAME] = true,
|
|
[MODIFIER_STATE_NO_HEALTH_BAR] = true
|
|
}
|
|
end
|
|
modifier_wisp_orbiting = __TS__Decorate(
|
|
modifier_wisp_orbiting,
|
|
modifier_wisp_orbiting,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_wisp_orbiting"}
|
|
)
|
|
____exports.modifier_wisp_orbiting = modifier_wisp_orbiting
|
|
____exports.modifier_wisp_attack = __TS__Class()
|
|
local modifier_wisp_attack = ____exports.modifier_wisp_attack
|
|
modifier_wisp_attack.name = "modifier_wisp_attack"
|
|
modifier_wisp_attack.____file_path = "scripts/vscripts/items/util_items/item_easter_egg.lua"
|
|
__TS__ClassExtends(modifier_wisp_attack, BaseModifier)
|
|
function modifier_wisp_attack.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.interval = 0.33
|
|
end
|
|
function modifier_wisp_attack.prototype.IsHidden(self)
|
|
return false
|
|
end
|
|
function modifier_wisp_attack.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_wisp_attack.prototype.OnCreated(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
self:StartIntervalThink(self.interval)
|
|
end
|
|
function modifier_wisp_attack.prototype.OnIntervalThink(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local parent = self:GetParent()
|
|
local caster = self:GetCaster()
|
|
if not caster then
|
|
return
|
|
end
|
|
if RandomFloat(0, 100) <= 50 then
|
|
self:CreateGoldBag(parent:GetAbsOrigin())
|
|
end
|
|
end
|
|
function modifier_wisp_attack.prototype.CreateGoldBag(self, position)
|
|
local goldBag = CreateItem("item_bag_of_gold", nil, nil)
|
|
if goldBag then
|
|
local physicalItem = CreateItemOnPositionForLaunch(position, goldBag)
|
|
if physicalItem ~= nil then
|
|
local randomAngle = RandomFloat(0, 2 * math.pi)
|
|
local randomDistance = RandomFloat(50, 200)
|
|
local randomX = position.x + randomDistance * math.cos(randomAngle)
|
|
local randomY = position.y + randomDistance * math.sin(randomAngle)
|
|
local randomPos = Vector(randomX, randomY, position.z)
|
|
goldBag:LaunchLootInitialHeight(
|
|
false,
|
|
0,
|
|
100,
|
|
0.5,
|
|
randomPos
|
|
)
|
|
Timers:CreateTimer(
|
|
15,
|
|
function()
|
|
if IsValidEntity(physicalItem) then
|
|
UTIL_Remove(physicalItem)
|
|
end
|
|
end
|
|
)
|
|
end
|
|
end
|
|
end
|
|
modifier_wisp_attack = __TS__Decorate(
|
|
modifier_wisp_attack,
|
|
modifier_wisp_attack,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_wisp_attack"}
|
|
)
|
|
____exports.modifier_wisp_attack = modifier_wisp_attack
|
|
return ____exports
|