267 lines
10 KiB
Lua
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
|