Files
Dota-Zombie-Invasion/scripts/vscripts/items/default_items/item_clean_harbor.lua
T
2026-05-29 15:11:31 +07:00

267 lines
10 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 __TS__StringIncludes = ____lualib.__TS__StringIncludes
local __TS__ArrayForEach = ____lualib.__TS__ArrayForEach
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
local ____clean_harbor_flag_markers = require("quests.clean_harbor_flag_markers")
local hideCleanHarborFlagPlacementMarkers = ____clean_harbor_flag_markers.hideCleanHarborFlagPlacementMarkers
local isNearCleanHarborFlagPlacement = ____clean_harbor_flag_markers.isNearCleanHarborFlagPlacement
local ____SpawnManager = require("SpawnManager")
local SpawnManager = ____SpawnManager.SpawnManager
local ____QuestSystem = require("quests.QuestSystem")
local QuestSystem = ____QuestSystem.QuestSystem
____exports.item_clean_harbor = __TS__Class()
local item_clean_harbor = ____exports.item_clean_harbor
item_clean_harbor.name = "item_clean_harbor"
item_clean_harbor.____file_path = "scripts/vscripts/items/default_items/item_clean_harbor.lua"
__TS__ClassExtends(item_clean_harbor, BaseItem)
function item_clean_harbor.prototype.canPlaceFlagHere(self, caster)
return isNearCleanHarborFlagPlacement(
nil,
caster:GetAbsOrigin()
)
end
function item_clean_harbor.prototype.CastFilterResult(self)
if IsServer() then
local caster = self:GetCaster()
if not self:canPlaceFlagHere(caster) then
return UF_FAIL_CUSTOM
end
return UF_SUCCESS
end
return UF_SUCCESS
end
function item_clean_harbor.prototype.GetCustomCastError(self)
if IsServer() then
local caster = self:GetCaster()
if not self:canPlaceFlagHere(caster) then
return "#dota_hud_error_not_in_zone"
end
end
return ""
end
function item_clean_harbor.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not self:canPlaceFlagHere(caster) then
self:EndCooldown()
return
end
hideCleanHarborFlagPlacementMarkers(nil)
local duration = 60
CreateModifierThinker(
caster,
self,
____exports.modifier_clean_harbor_flag.name,
{duration = duration},
caster:GetAbsOrigin(),
caster:GetTeamNumber(),
false
)
self:RemoveSelf()
end
item_clean_harbor = __TS__Decorate(
item_clean_harbor,
item_clean_harbor,
{registerAbility(nil)},
{kind = "class", name = "item_clean_harbor"}
)
____exports.item_clean_harbor = item_clean_harbor
____exports.modifier_clean_harbor_flag = __TS__Class()
local modifier_clean_harbor_flag = ____exports.modifier_clean_harbor_flag
modifier_clean_harbor_flag.name = "modifier_clean_harbor_flag"
modifier_clean_harbor_flag.____file_path = "scripts/vscripts/items/default_items/item_clean_harbor.lua"
__TS__ClassExtends(modifier_clean_harbor_flag, BaseModifier)
function modifier_clean_harbor_flag.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.lastHeroInRangeTime = 0
self.lastBuffTime = 0
end
function modifier_clean_harbor_flag.prototype.IsHidden(self)
return true
end
function modifier_clean_harbor_flag.prototype.IsPurgable(self)
return false
end
function modifier_clean_harbor_flag.prototype.OnCreated(self)
if not IsServer() then
return
end
local parent = self:GetParent()
local pos = parent:GetAbsOrigin()
self.flagEntity = SpawnEntityFromTableSynchronous("prop_dynamic", {model = "models/props_gameplay/roshans_banner.vmdl", targetname = "clean_harbor_flag", origin = pos})
if self.flagParticleId ~= nil then
ParticleManager:DestroyParticle(self.flagParticleId, false)
ParticleManager:ReleaseParticleIndex(self.flagParticleId)
end
self.flagParticleId = ParticleManager:CreateParticle("particles/bloodbath_circle.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(self.flagParticleId, 0, pos)
ParticleManager:SetParticleControl(
self.flagParticleId,
1,
Vector(350, 0, 0)
)
self.lastHeroInRangeTime = GameRules:GetGameTime()
self.lastBuffTime = self.lastHeroInRangeTime
self:StartIntervalThink(0.25)
end
function modifier_clean_harbor_flag.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
local parent = self:GetParent()
if not parent or parent:IsNull() then
return
end
local pos = parent:GetAbsOrigin()
local heroes = FindUnitsInRadius(
parent:GetTeamNumber(),
pos,
nil,
350,
DOTA_UNIT_TARGET_TEAM_FRIENDLY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS,
FIND_ANY_ORDER,
false
)
local now = GameRules:GetGameTime()
if #heroes > 0 then
self.lastHeroInRangeTime = now
local targetHero = heroes[1]
local spawnManager = SpawnManager:getInstance()
local skeletonZoneIds = spawnManager:GetZoneIdsByPrefixes({"zone_skeletons_", "zone_skeletons2_"})
local shouldBuff = now - self.lastBuffTime >= 1
__TS__ArrayForEach(
skeletonZoneIds,
function(____, zoneId)
local units = spawnManager:GetSpawnedUnits(zoneId)
__TS__ArrayForEach(
units,
function(____, unit)
if unit and IsValidEntity(unit) and unit.IsAlive and unit:IsAlive() then
local creep = unit
creep:MoveToTargetToAttack(targetHero)
if shouldBuff then
local name
do
local function ____catch()
name = ""
end
local ____try = pcall(function()
name = creep:GetUnitName()
end)
if not ____try then
____catch()
end
end
if __TS__StringIncludes(name, "skeleton") then
local anyCreep = creep
if anyCreep._cleanHarborBaseMin == nil then
anyCreep._cleanHarborBaseMin = creep:GetBaseDamageMin()
anyCreep._cleanHarborBaseMax = creep:GetBaseDamageMax()
anyCreep._cleanHarborBuffStacks = 0
end
anyCreep._cleanHarborBuffStacks = (anyCreep._cleanHarborBuffStacks or 0) + 1
local stacks = anyCreep._cleanHarborBuffStacks
local mult = 1 + 0.02 * stacks
local newMin = math.floor(anyCreep._cleanHarborBaseMin * mult)
local newMax = math.floor(anyCreep._cleanHarborBaseMax * mult)
creep:SetBaseDamageMin(newMin)
creep:SetBaseDamageMax(newMax)
end
end
end
end
)
end
)
if shouldBuff then
self.lastBuffTime = now
end
else
if now - self.lastHeroInRangeTime >= 1 then
CustomGameEventManager:Send_ServerToAllClients("CreateIngameErrorMessage", {reason = 80, message = "#clean_harbor_no_hero_near_flag"})
end
if now - self.lastHeroInRangeTime >= 5 then
local questSystem = QuestSystem:getInstance()
questSystem:failQuest("kunkka_quest_clean_harbor")
self:Destroy()
return
end
end
local enemies = FindUnitsInRadius(
DOTA_TEAM_NEUTRALS,
pos,
nil,
400,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
if #enemies > 0 then
local questSystem = QuestSystem:getInstance()
questSystem:failQuest("kunkka_quest_clean_harbor")
self:Destroy()
end
end
function modifier_clean_harbor_flag.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
if not parent or parent:IsNull() then
return
end
if self.flagParticleId ~= nil then
ParticleManager:DestroyParticle(self.flagParticleId, false)
ParticleManager:ReleaseParticleIndex(self.flagParticleId)
self.flagParticleId = nil
end
if self.flagEntity and IsValidEntity(self.flagEntity) then
UTIL_Remove(self.flagEntity)
self.flagEntity = nil
end
if self:GetRemainingTime() <= 0 then
local spawnManager = SpawnManager:getInstance()
spawnManager:RemoveSpawnZonesByType("skeletons")
spawnManager:RemoveSpawnZonesByType("skeletons2")
local skeletonZoneIds = spawnManager:GetZoneIdsByPrefixes({"zone_skeletons_", "zone_skeletons2_"})
__TS__ArrayForEach(
skeletonZoneIds,
function(____, zoneId)
local units = spawnManager:GetSpawnedUnits(zoneId)
__TS__ArrayForEach(
units,
function(____, unit)
if unit and IsValidEntity(unit) and unit.IsAlive and unit:IsAlive() then
unit:ForceKill(false)
end
end
)
end
)
local questSystem = QuestSystem:getInstance()
questSystem:addQuestProgress("kunkka_quest_clean_harbor", "clean_harbor", 1)
end
end
modifier_clean_harbor_flag = __TS__Decorate(
modifier_clean_harbor_flag,
modifier_clean_harbor_flag,
{registerModifier(nil)},
{kind = "class", name = "modifier_clean_harbor_flag"}
)
____exports.modifier_clean_harbor_flag = modifier_clean_harbor_flag
return ____exports