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