173 lines
4.9 KiB
Lua
Executable File
173 lines
4.9 KiB
Lua
Executable File
if CDotaSpawner == nil then
|
|
CDotaSpawner = class({})
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:constructor( szSpawnerNameInput, szLocatorNameInput, rgUnitsInfoInput )
|
|
self.szSpawnerName = szSpawnerNameInput
|
|
self.szLocatorName = szLocatorNameInput
|
|
self.rgUnitsInfo = rgUnitsInfoInput
|
|
self.rgSpawners = {}
|
|
self.Encounter = nil
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetSpawnerType()
|
|
return "CDotaSpawner"
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:Precache( context )
|
|
--print( "CDotaSpawner:Precache called for " .. self.szSpawnerName )
|
|
|
|
for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do
|
|
PrecacheUnitByNameSync( rgUnitInfo.EntityName, context, -1 )
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:OnEncounterLoaded( EncounterInput )
|
|
--print( "CDotaSpawner:OnEncounterLoaded called for " .. self.szSpawnerName )
|
|
self.Encounter = EncounterInput
|
|
self.rgSpawners = self.Encounter:GetRoom():FindAllEntitiesInRoomByName( self.szLocatorName, false )
|
|
if #self.rgSpawners == 0 then
|
|
print( "Failed to find entity " .. self.szSpawnerName .. " as spawner position in map " .. self.Encounter:GetRoom():GetMapName() )
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetSpawnPositionCount()
|
|
return #self.rgSpawners
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetSpawnCountPerSpawnPosition()
|
|
|
|
local nCount = 0
|
|
for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do
|
|
nCount = nCount + rgUnitInfo.Count
|
|
end
|
|
return nCount
|
|
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:SpawnUnits()
|
|
|
|
if #self.rgSpawners == 0 then
|
|
print( "ERROR - Spawner " .. self.szSpawnerName .. " found no spawn entities, cannot spawn" )
|
|
return
|
|
end
|
|
|
|
local nSpawned = 0
|
|
|
|
local hSpawnedUnits = {}
|
|
|
|
for nSpawnerIndex,hSpawner in pairs( self.rgSpawners ) do
|
|
local vLocation = hSpawner:GetAbsOrigin()
|
|
for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do
|
|
local hSingleSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo, vLocation )
|
|
nSpawned = nSpawned + rgUnitInfo.Count
|
|
|
|
for _,hUnit in pairs ( hSingleSpawnedUnits ) do
|
|
table.insert( hSpawnedUnits, hUnit )
|
|
end
|
|
end
|
|
end
|
|
|
|
printf( "%s spawning %d units", self.szSpawnerName, nSpawned )
|
|
|
|
if #hSpawnedUnits > 0 then
|
|
self.Encounter:OnSpawnerFinished( self, hSpawnedUnits )
|
|
end
|
|
|
|
return hSpawnedUnits
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:SpawnSingleUnitType( rgUnitInfo, vLocation )
|
|
local hSpawnedUnits = {}
|
|
for i=1,rgUnitInfo.Count do
|
|
local vSpawnPos = vLocation
|
|
if rgUnitInfo.PositionNoise ~= nil then
|
|
vSpawnPos = vSpawnPos + RandomVector( RandomFloat( 0.0, rgUnitInfo.PositionNoise ) )
|
|
end
|
|
|
|
local hUnit = CreateUnitByName( rgUnitInfo.EntityName, vSpawnPos, true, nil, nil, rgUnitInfo.Team )
|
|
|
|
if hUnit == nil then
|
|
print( "ERROR! Failed to spawn unit named " .. rgUnitInfo.EntityName )
|
|
|
|
else
|
|
hUnit:FaceTowards( vLocation )
|
|
if rgUnitInfo.PostSpawn ~= nil then
|
|
rgUnitInfo.PostSpawn( hUnit )
|
|
end
|
|
table.insert( hSpawnedUnits, hUnit )
|
|
end
|
|
end
|
|
|
|
return hSpawnedUnits
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetSpawners()
|
|
return self.rgSpawners
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:SpawnUnitsFromRandomSpawners( nSpawners )
|
|
print( "spawning from " .. nSpawners .. " " .. self.szSpawnerName .. " spawers out of " .. #self.rgSpawners )
|
|
local hAllSpawnedUnits = {}
|
|
local Spawners = nil
|
|
for n=1,nSpawners do
|
|
if Spawners == nil or #Spawners == 0 then
|
|
Spawners = deepcopy( self.rgSpawners )
|
|
end
|
|
|
|
--print ( #Spawners .. " potential spawners to use." )
|
|
|
|
local nIndex = math.random( 1, #Spawners )
|
|
local Spawner = Spawners[ nIndex ]
|
|
if Spawner == nil then
|
|
print ( "ERROR! SpawnUnitsFromRandomSpawners went WRONG!!!!!!!!!!!!!" )
|
|
else
|
|
local vLocation = Spawner:GetAbsOrigin()
|
|
for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do
|
|
local hSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo, vLocation )
|
|
for _,hUnit in pairs ( hSpawnedUnits ) do
|
|
table.insert( hAllSpawnedUnits, hUnit )
|
|
end
|
|
end
|
|
end
|
|
table.remove( Spawners, nIndex )
|
|
end
|
|
|
|
if #hAllSpawnedUnits > 0 then
|
|
self.Encounter:OnSpawnerFinished( self, hAllSpawnedUnits )
|
|
end
|
|
|
|
return hAllSpawnedUnits
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetSpawnerName()
|
|
return self.szSpawnerName
|
|
end
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
function CDotaSpawner:GetLocatorName()
|
|
return self.szLocatorName
|
|
end |