- 26 Фев 2023
- 25
- 0
Lua:
if Spawner == nil then
Spawner = {}
Spawner.__index = Spawner
print('[Spawner] Spawner Created')
end
function Spawner:Init()
print('[Spawner] Spawner Init')
self:ReadKeyValue()
self:Setting()
ListenToGameEvent('entity_killed', Dynamic_Wrap(Spawner, 'OnUnitKilled'), self)
LinkLuaModifier("modifier_creep_antilag", "modifiers/modifier_creep_antilag.lua", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_no_health", "modifiers/modifier_no_health.lua", LUA_MODIFIER_MOTION_NONE)
end
function Spawner:ReadKeyValue()
print('[Spawner] Reading KeyValues from spawn_info.kv')
self.kvTable = LoadKeyValues("scripts/kv/spawn_info.kv")
end
function Spawner:Setting()
print('[Spawner] Setting Up Spawner')
local kv = self.kvTable
self.natureList = kv.nature_list
self.natureSpawnInterval = tonumber(kv.spawn_interval)
self.natureRemaining = {}
self.natureName = {}
self.natureBossName = {}
self.natureMaxCount = {}
self.natureBossSpawnRate = {}
self.natureCampLocation = {}
for k, v in pairs(self.natureList) do
self.natureRemaining[k] = {}
self.natureName[k] = v.unit.name
self.natureBossName[k] = v.boss.name
self.natureMaxCount[k] = tonumber(v.maxCount)
self.natureBossSpawnRate[k] = tonumber(v.bossRate)
self.natureCampLocation[k] = Entities:FindByName(nil, v.campName):GetAbsOrigin()
end
end
function Spawner:UnitProperty(unit, unitData, isBoss)
local experienceMultiplier = tonumber(unitData.experienceMultiplier)
local goldBountyMultiplier = tonumber(unitData.goldBountyMultiplier)
local damageMultiplier = tonumber(unitData.damageMultiplier)
local armorMultiplier = tonumber(unitData.armorMultiplier)
local healthMultiplier = tonumber(unitData.healthMultiplier)
unit:SetDeathXP(unit:GetDeathXP() * experienceMultiplier)
unit:SetMinimumGoldBounty(unit:GetMinimumGoldBounty() * goldBountyMultiplier)
unit:SetMaximumGoldBounty(unit:GetMaximumGoldBounty() * goldBountyMultiplier)
unit:SetBaseDamageMin(unit:GetBaseDamageMin() * damageMultiplier)
unit:SetBaseDamageMax(unit:GetBaseDamageMax() * damageMultiplier)
unit:SetBaseMaxHealth(unit:GetBaseMaxHealth() * healthMultiplier)
unit:SetPhysicalArmorBaseValue(unit:GetPhysicalArmorBaseValue() * armorMultiplier)
for i = 1, 16 do
local ability = unit:GetAbilityByIndex(i - 1)
if ability then
ability:SetLevel(5)
end
end
-- Применяем модификаторы, если они указаны в .kv файле
if unitData.modifiers then
for modifierName, _ in pairs(unitData.modifiers) do
unit:AddNewModifier(unit, nil, modifierName, nil)
print('[Spawner] Applied modifier ' .. modifierName .. ' to ' .. unit:GetUnitName())
end
end
end
function Spawner:NatureStart()
print('[Spawner] Nature Spawner Started')
self:NatureThink()
end
function Spawner:NatureThink()
print('[Spawner] Nature Think')
Timers:CreateTimer(function()
for k, v in pairs(self.natureList) do
if #self.natureRemaining[k] == 0 then
self:DoNatureSpawn(k)
end
end
return self.natureSpawnInterval
end)
end
function Spawner:DoNatureSpawn(k)
print('[Spawner] Spawning Units for Location: ' .. k)
local locationData = self.natureList[k]
local unitData = locationData.unit
local bossData = locationData.boss
for i = 1, self.natureMaxCount[k] do
local point = self.natureCampLocation[k]
local random_point = Vector(point.x + RandomFloat(-200, 200), point.y + RandomFloat(-200, 200), point.z)
local spawnData = RollPercentage(locationData.bossRate) and bossData or unitData
PrecacheUnitByNameAsync(spawnData.name, function()
local unit = CreateUnitByName(spawnData.name, random_point, true, nil, nil, DOTA_TEAM_BADGUYS)
self:UnitProperty(unit, spawnData, spawnData == bossData)
unit.campIndex = k
table.insert(self.natureRemaining[k], unit)
--print('[Spawner] Spawned Unit: ' .. spawnData.name .. ' at Location: ' .. k)
end)
end
end
function Spawner:OnUnitKilled(t)
local caster = EntIndexToHScript(t.entindex_killed)
if caster.campIndex then
for i, unit in pairs(self.natureRemaining[caster.campIndex]) do
if caster == unit then
table.remove(self.natureRemaining[caster.campIndex], i)
break
end
end
end
print('[Spawner] Unit Killed: ' .. caster:GetUnitName())
end
JSON:
"Spawns"
{
"spawn_interval" "120"
"nature_list"
{
"forest"
{
"unit"
{
"name" "npc_dota_forest_1_creep"
"experienceMultiplier" "1.6"
"goldBountyMultiplier" "0.6"
"damageMultiplier" "1.0"
"armorMultiplier" "1.0"
"healthMultiplier" "1.0"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"boss"
{
"name" "npc_dota_forest_1_boss"
"experienceMultiplier" "2.0"
"goldBountyMultiplier" "1.0"
"damageMultiplier" "1.5"
"armorMultiplier" "2.0"
"healthMultiplier" "2.5"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"maxCount" "4"
"bossRate" "20"
"campName" "forest_loc"
}
"forest_1"
{
"unit"
{
"name" "npc_dota_forest_1_creep"
"experienceMultiplier" "1.6"
"goldBountyMultiplier" "0.6"
"damageMultiplier" "1.0"
"armorMultiplier" "1.0"
"healthMultiplier" "1.0"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"boss"
{
"name" "npc_dota_forest_1_boss"
"experienceMultiplier" "2.0"
"goldBountyMultiplier" "1.0"
"damageMultiplier" "1.5"
"armorMultiplier" "2.0"
"healthMultiplier" "2.5"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"maxCount" "4"
"bossRate" "20"
"campName" "forest_loc1"
}
"forest_2"
{
"unit"
{
"name" "npc_dota_forest_1_creep"
"experienceMultiplier" "1.6"
"goldBountyMultiplier" "0.6"
"damageMultiplier" "1.0"
"armorMultiplier" "1.0"
"healthMultiplier" "1.0"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"boss"
{
"name" "npc_dota_forest_1_boss"
"experienceMultiplier" "2.0"
"goldBountyMultiplier" "1.0"
"damageMultiplier" "1.5"
"armorMultiplier" "2.0"
"healthMultiplier" "2.5"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"maxCount" "4"
"bossRate" "20"
"campName" "forest_loc2"
}
"forest_3"
{
"unit"
{
"name" "npc_dota_forest_1_creep"
"experienceMultiplier" "1.6"
"goldBountyMultiplier" "0.6"
"damageMultiplier" "1.0"
"armorMultiplier" "1.0"
"healthMultiplier" "1.0"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"boss"
{
"name" "npc_dota_forest_1_boss"
"experienceMultiplier" "2.0"
"goldBountyMultiplier" "1.0"
"damageMultiplier" "1.5"
"armorMultiplier" "2.0"
"healthMultiplier" "2.5"
"modifiers"
{
"modifier_creep_antilag" "modifier_creep_antilag"
"modifier_no_health" "modifier_no_health"
}
}
"maxCount" "4"
"bossRate" "20"
"campName" "forest_loc3"
}
}
}
Теперь он позволяет редактировать параметры юнитов на каждой локации