initial commit
This commit is contained in:
847
aghanim_singleplayer/scripts/vscripts/map_room.lua
Executable file
847
aghanim_singleplayer/scripts/vscripts/map_room.lua
Executable file
@@ -0,0 +1,847 @@
|
||||
require( "spawner" )
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
if CMapRoom == nil then
|
||||
CMapRoom = class({})
|
||||
_G.CMapRoom = CMapRoom
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:constructor( szRoomName, nRoomType, nDepth, vMins, vMaxs, vOrigin )
|
||||
self.szRoomName = szRoomName
|
||||
self.nRoomType = nRoomType
|
||||
self.nDepth = nDepth
|
||||
self.nEliteDepthBonus = 0
|
||||
self.vMins = vMins
|
||||
self.vMaxs = vMaxs
|
||||
self.vOrigin = vOrigin
|
||||
self.nAct = tonumber( string.sub( szRoomName, 2, 2 ) )
|
||||
self.bHidden = false;
|
||||
self.PlayerUnitsInRoom = {}
|
||||
self.szEncounterName = nil
|
||||
self.Encounter = nil
|
||||
self.exits = {}
|
||||
self.exitRewards = {}
|
||||
self.bActivated = false
|
||||
self.bSpawnGroupReady = false
|
||||
self.szExitRoomSelected = nil
|
||||
self.szMapName = "main"
|
||||
self.szRoomChoiceReward = nil
|
||||
self.bHasCrystal = false
|
||||
self.nPlayerChosenExitDirection = ROOM_EXIT_INVALID
|
||||
self.nPlayerEntranceDirection = ROOM_EXIT_INVALID
|
||||
|
||||
self.hRandomStream = CreateUniformRandomStream( GameRules.Aghanim:GetRandomSeed() + MakeStringToken( szRoomName ) )
|
||||
self.bDisplayHiddenAsElite = ( self:RoomRandomInt( 1, 4 ) == 1 )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:ShouldDisplayHiddenAsElite( )
|
||||
return self.bDisplayHiddenAsElite
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:AddExit( exitDirection, szRoomName )
|
||||
self.exits[ exitDirection ] = szRoomName
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetExit( exitDirection )
|
||||
return self.exits[ exitDirection ]
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetExits( )
|
||||
return self.exits
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetExitDirectionForRoom( szRoomName )
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szRoomName == szExitRoomName then
|
||||
return nExitDirection
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetExitLocation( exitDirection )
|
||||
|
||||
local bIsSpecialTransition = ( self.nDepth == 7 )
|
||||
if self.nRoomType ~= ROOM_TYPE_BOSS and bIsSpecialTransition == false then
|
||||
|
||||
if exitDirection == ROOM_EXIT_LEFT then
|
||||
return Vector( self.vMins.x, self.vOrigin.y, self.vOrigin.z )
|
||||
elseif exitDirection == ROOM_EXIT_TOP then
|
||||
return Vector( self.vOrigin.x, self.vMaxs.y, self.vOrigin.z )
|
||||
elseif exitDirection == ROOM_EXIT_RIGHT then
|
||||
return Vector( self.vMaxs.x, self.vOrigin.y, self.vOrigin.z )
|
||||
end
|
||||
|
||||
elseif self.nRoomType == ROOM_TYPE_BOSS then
|
||||
|
||||
local nDivisor = 8
|
||||
if self.nDepth == 13 then
|
||||
nDivisor = 16
|
||||
end
|
||||
|
||||
if exitDirection == ROOM_EXIT_LEFT then
|
||||
return Vector( self.vMins.x, self.vMins.y + ( self.vMaxs.y - self.vMins.y ) / nDivisor, self.vOrigin.z )
|
||||
elseif exitDirection == ROOM_EXIT_RIGHT then
|
||||
return Vector( self.vMaxs.x, self.vMins.y + ( self.vMaxs.y - self.vMins.y ) / nDivisor, self.vOrigin.z )
|
||||
end
|
||||
|
||||
elseif bIsSpecialTransition == true then
|
||||
|
||||
if exitDirection == ROOM_EXIT_TOP then
|
||||
if not GameRules.Aghanim:IsMapFlipped() then
|
||||
return Vector( self.vMins.x + ( self.vMaxs.x - self.vMins.x ) * 7 / 8, self.vMaxs.y, self.vOrigin.z )
|
||||
else
|
||||
return Vector( self.vMins.x + ( self.vMaxs.x - self.vMins.x ) * 1 / 8, self.vMaxs.y, self.vOrigin.z )
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetNeighboringRoomHeightDifference( nExitDirection )
|
||||
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szExitRoomName == nil then
|
||||
return 0
|
||||
end
|
||||
|
||||
local exitRoom = GameRules.Aghanim:GetRoom( szExitRoomName )
|
||||
if exitRoom == nil then
|
||||
return 0
|
||||
end
|
||||
|
||||
local zeroHeights =
|
||||
{
|
||||
up = 0,
|
||||
left = 0,
|
||||
right = 0,
|
||||
down = 0
|
||||
}
|
||||
|
||||
local myHeights = MAP_EXIT_HEIGHTS[ self:GetMapName() ]
|
||||
local theirHeights = MAP_EXIT_HEIGHTS[ exitRoom:GetMapName() ]
|
||||
if myHeights == nil then
|
||||
myHeights = zeroHeights
|
||||
end
|
||||
if theirHeights == nil then
|
||||
theirHeights = zeroHeights
|
||||
end
|
||||
|
||||
if nExitDirection == ROOM_EXIT_LEFT then
|
||||
return myHeights.left - theirHeights.right
|
||||
end
|
||||
if nExitDirection == ROOM_EXIT_TOP then
|
||||
return myHeights.up - theirHeights.down
|
||||
end
|
||||
if nExitDirection == ROOM_EXIT_RIGHT then
|
||||
return myHeights.right - theirHeights.left
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:SetEliteDepthBonus( nEliteDepthBonus )
|
||||
self.nEliteDepthBonus = nEliteDepthBonus
|
||||
self:GetEncounter():OnEliteRankChanged( nEliteDepthBonus )
|
||||
self:SendRoomToClient()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:SetHidden( )
|
||||
self.bHidden = true
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsHidden( )
|
||||
return self.bHidden
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:AssignEncounter( szEncounterName )
|
||||
|
||||
-- NOTE: For debugging, it's possible to re-assign a new encounter to an existing room.
|
||||
-- In that case, clean up any temporary state
|
||||
self.szMapName = nil
|
||||
if self.hSpawnGroupHandle ~= nil then
|
||||
UnloadSpawnGroupByHandle( self.hSpawnGroupHandle )
|
||||
self.hSpawnGroupHandle = nil
|
||||
end
|
||||
self.bSpawnGroupReady = false
|
||||
|
||||
-- At this point, we're ready to assign the encounter
|
||||
self.szEncounterName = szEncounterName
|
||||
|
||||
--print( "AssignEncounter: " .. self:GetName() .." -> " .. szEncounterName )
|
||||
|
||||
local hEncounterClass = require( "encounters/" .. self.szEncounterName )
|
||||
if hEncounterClass == nil then
|
||||
print( "ERROR: Encounter class " .. szEncounterName .. " not found.\n" )
|
||||
return
|
||||
end
|
||||
|
||||
self.Encounter = hEncounterClass( self, self.szEncounterName )
|
||||
if self.Encounter == nil then
|
||||
print( "ERROR: Failed to create Encounter " .. szEncounterName .. "\n" )
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:FindAllEntitiesInRoomByName( szEntityName, bWarnIfNotFound )
|
||||
|
||||
local hEntityList = Entities:FindAllByName( szEntityName )
|
||||
|
||||
for i=#hEntityList, 1, -1 do
|
||||
if hEntityList[i]:GetSpawnGroupHandle() ~= self:GetSpawnGroupHandle() then
|
||||
table.remove( hEntityList, i )
|
||||
end
|
||||
end
|
||||
|
||||
if #hEntityList == 0 and bWarnIfNotFound then
|
||||
print( "Unable to find entity " .. szEntityName .. " for encounter " .. self.szEncounterName .. " map " .. self:GetMapName() )
|
||||
end
|
||||
|
||||
return hEntityList
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnEncounterLoaded()
|
||||
-- This is the level stream load finished callback.
|
||||
|
||||
-- We're only calling Find to print an error if none can be found
|
||||
self:FindAllEntitiesInRoomByName( "room_activate", true )
|
||||
|
||||
self.Encounter:OnEncounterLoaded()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsInRoomBounds( vOrigin )
|
||||
if vOrigin.x > self.vMins.x and vOrigin.x < self.vMaxs.x and vOrigin.y > self.vMins.y and vOrigin.y < self.vMaxs.y then
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsValidSpawnPoint( vOrigin )
|
||||
|
||||
local flBorder = 384
|
||||
if vOrigin.x > ( self.vMins.x + flBorder ) and vOrigin.x < ( self.vMaxs.x - flBorder ) and
|
||||
vOrigin.y > ( self.vMins.y + flBorder ) and vOrigin.y < ( self.vMaxs.y - flBorder ) then
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:ClampPointToRoomBounds( vOrigin, flBorder )
|
||||
|
||||
if flBorder == nil then
|
||||
flBorder = 4
|
||||
end
|
||||
|
||||
local vClamped = Vector( vOrigin.x, vOrigin.y, vOrigin.z )
|
||||
|
||||
if vClamped.x < ( self.vMins.x + flBorder ) then
|
||||
vClamped.x = self.vMins.x + flBorder;
|
||||
elseif vClamped.x > ( self.vMaxs.x - flBorder ) then
|
||||
vClamped.x = self.vMaxs.x - flBorder;
|
||||
end
|
||||
|
||||
if vClamped.y < ( self.vMins.y + flBorder ) then
|
||||
vClamped.y = ( self.vMins.y + flBorder )
|
||||
elseif vClamped.y > ( self.vMaxs.y - flBorder ) then
|
||||
vClamped.y = ( self.vMaxs.y - flBorder )
|
||||
end
|
||||
|
||||
return vClamped
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:LoadExitRooms()
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szExitRoomName ~= nil then
|
||||
local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName )
|
||||
-- NOTE: the hSpawnGroupHandle test is if we respawn an exit room because of development-time testing
|
||||
if ExitRoom ~= nil and ExitRoom.hSpawnGroupHandle == nil then
|
||||
local EncounterData = ENCOUNTER_DEFINITIONS[ ExitRoom.szEncounterName ]
|
||||
if EncounterData ~= nil then
|
||||
|
||||
-- Must set the map name prior to getting the neighboring room height difference
|
||||
local mapList = EncounterData.szMapNames
|
||||
if GameRules.Aghanim:IsMapFlipped() and EncounterData.szFlippedMapNames ~= nil then
|
||||
mapList = EncounterData.szFlippedMapNames
|
||||
end
|
||||
local szMapName = mapList[ self:RoomRandomInt( 1, #mapList ) ]
|
||||
ExitRoom.szMapName = szMapName
|
||||
|
||||
ExitRoom.vOrigin.z = self.vOrigin.z + self:GetNeighboringRoomHeightDifference( nExitDirection )
|
||||
print( "Spawning room " .. szExitRoomName .. " with encounter " .. ExitRoom.szEncounterName .. " on map " .. szMapName .. " at ( " .. ExitRoom.vOrigin.x .. ", " .. ExitRoom.vOrigin.y .. ", " .. ExitRoom.vOrigin.z .. " )" )
|
||||
ExitRoom.hSpawnGroupHandle = DOTA_SpawnMapAtPosition( szMapName, ExitRoom.vOrigin,
|
||||
true, Dynamic_Wrap( CMapRoom, "OnRoomReadyToSpawn" ), Dynamic_Wrap( CMapRoom, "OnSpawnRoomComplete" ), ExitRoom )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnRoomReadyToSpawn( hSpawnGroupHandle )
|
||||
if ( hSpawnGroupHandle == self.hSpawnGroupHandle ) then
|
||||
--print( "OnRoomReadyToSpawn " .. self:GetName() .. "\n" )
|
||||
self.bSpawnGroupReady = true
|
||||
else
|
||||
print( "Unexpected OnRoomReadyToSpawn " .. self:GetName() .. " " .. hSpawnGroupHandle .. "->" .. self.hSpawnGroupHandle .. "\n" )
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OpenExit( szExitDir, vSmallExitLocation )
|
||||
|
||||
-- Open a gap in the force unseen blockers
|
||||
-- Only W or E exits have the possibility of being small exits
|
||||
if szExitDir == "W" then
|
||||
|
||||
if vSmallExitLocation == nil then
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ),
|
||||
Vector( self.vMins.x + 1, self.vMaxs.y - 1, self.vMins.z ) )
|
||||
else
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( vSmallExitLocation.x + 1, vSmallExitLocation.y - 256, self.vMins.z ),
|
||||
Vector( vSmallExitLocation.x + 1, vSmallExitLocation.y + 256, self.vMins.z ) )
|
||||
end
|
||||
|
||||
elseif szExitDir == "E" then
|
||||
|
||||
if vSmallExitLocation == nil then
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( self.vMaxs.x - 1, self.vMins.y + 1, self.vMins.z ),
|
||||
Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMins.z ) )
|
||||
else
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( vSmallExitLocation.x - 1, vSmallExitLocation.y - 256, self.vMins.z ),
|
||||
Vector( vSmallExitLocation.x - 1, vSmallExitLocation.y + 256, self.vMins.z ) )
|
||||
end
|
||||
|
||||
elseif szExitDir == "N" then
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( self.vMins.x + 1, self.vMaxs.y - 1, self.vMins.z ),
|
||||
Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMins.z ) )
|
||||
elseif szExitDir == "S" then
|
||||
GameRules.Aghanim:ClearFowBlockers(
|
||||
Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ),
|
||||
Vector( self.vMaxs.x - 1, self.vMins.y + 1, self.vMins.z ) )
|
||||
end
|
||||
|
||||
-- NOTE: Do not break in the loop; necessary for double N exits in the main map
|
||||
local roomUnlockList = self:FindAllEntitiesInRoomByName( "room_unlock_" .. szExitDir, true )
|
||||
for i=1, #roomUnlockList do
|
||||
--print( "Triggering " .. self:GetName() .. " room_unlock_" .. szExitDir .. " on ent " .. roomUnlockList[i]:entindex() .. " h " .. roomUnlockList[i]:GetSpawnGroupHandle() )
|
||||
roomUnlockList[i]:Trigger( nil, nil )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:CreateVisBlockers( )
|
||||
|
||||
GameRules.Aghanim:AddFowOutlineBlocker(
|
||||
Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ),
|
||||
Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMaxs.z ) )
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:SpawnBridges( )
|
||||
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szExitRoomName ~= nil then
|
||||
|
||||
local szExitDir = "N"
|
||||
if nExitDirection == ROOM_EXIT_LEFT then
|
||||
szExitDir = "W"
|
||||
elseif nExitDirection == ROOM_EXIT_RIGHT then
|
||||
szExitDir = "E"
|
||||
end
|
||||
|
||||
-- NOTE: Do not break in the loop; necessary for double N exits in the main map
|
||||
local hBridges = self:FindAllEntitiesInRoomByName( "spawn_bridge_" .. szExitDir, true )
|
||||
for i=1, #hBridges do
|
||||
hBridges[i]:ForceSpawn( )
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnSpawnRoomComplete( hSpawnGroupHandle )
|
||||
|
||||
if ( hSpawnGroupHandle == self.hSpawnGroupHandle ) then
|
||||
|
||||
--print( "OnSpawnRoomComplete " .. self:GetName() .. "\n" )
|
||||
self:OnEncounterLoaded()
|
||||
|
||||
-- Set up vis blockers on the new room
|
||||
self:CreateVisBlockers()
|
||||
|
||||
-- Clear out the path between the two rooms
|
||||
for k,room in pairs(GameRules.Aghanim:GetRoomList()) do
|
||||
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = room:GetExit( nExitDirection )
|
||||
if szExitRoomName ~= nil and room ~= self and szExitRoomName == self:GetName() and room:IsActivated() then
|
||||
local vSmallExitLocation = nil
|
||||
if room.nRoomType == ROOM_TYPE_BOSS then
|
||||
vSmallExitLocation = room:GetExitLocation( nExitDirection )
|
||||
end
|
||||
if nExitDirection == ROOM_EXIT_LEFT then
|
||||
room:OpenExit( "W", vSmallExitLocation )
|
||||
self:OpenExit( "E", vSmallExitLocation )
|
||||
elseif nExitDirection == ROOM_EXIT_TOP then
|
||||
room:OpenExit( "N", vSmallExitLocation )
|
||||
self:OpenExit( "S", vSmallExitLocation )
|
||||
elseif nExitDirection == ROOM_EXIT_RIGHT then
|
||||
room:OpenExit( "E", vSmallExitLocation )
|
||||
self:OpenExit( "W", vSmallExitLocation )
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
self:SpawnBridges()
|
||||
|
||||
else
|
||||
print( "Unexpected OnSpawnRoomComplete " .. self:GetName() .. " " .. hSpawnGroupHandle .. "->" .. self.hSpawnGroupHandle .. "\n" )
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:AreAllExitRoomsReady()
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szExitRoomName ~= nil then
|
||||
local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName )
|
||||
if ExitRoom ~= nil then
|
||||
local EncounterData = ENCOUNTER_DEFINITIONS[ ExitRoom.szEncounterName ]
|
||||
if EncounterData ~= nil then
|
||||
if not ExitRoom:IsMapReady() then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:ComputeRoomStats( )
|
||||
|
||||
if self.Encounter == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
local roomStats =
|
||||
{
|
||||
szEncounterName = self.Encounter:GetName(),
|
||||
bIsElite = self:IsElite(),
|
||||
bIsHidden = self:IsHidden(),
|
||||
nRoomType = self:GetType(),
|
||||
szReward = self:GetRoomChoiceReward(),
|
||||
ascensionAbilities = self.Encounter:GetAscensionAbilities(),
|
||||
}
|
||||
|
||||
return roomStats
|
||||
|
||||
end
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnNextRoomSelected( szSelectedRoomName )
|
||||
|
||||
if self.szExitRoomSelected ~= nil then
|
||||
return
|
||||
end
|
||||
|
||||
self.szExitRoomSelected = szSelectedRoomName
|
||||
printf( "OnNextRoomSelected %s\n", szSelectedRoomName )
|
||||
|
||||
-- Register the room selection
|
||||
local roomSelectionStats =
|
||||
{
|
||||
depth = self:GetDepth() + 1
|
||||
}
|
||||
|
||||
for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do
|
||||
local szExitRoomName = self:GetExit( nExitDirection )
|
||||
if szExitRoomName ~= nil then
|
||||
local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName )
|
||||
if ExitRoom ~= nil then
|
||||
if szExitRoomName == szSelectedRoomName then
|
||||
ManuallyTriggerSpawnGroupCompletion( ExitRoom:GetSpawnGroupHandle() )
|
||||
|
||||
self.nPlayerChosenExitDirection = nExitDirection
|
||||
ExitRoom.nPlayerEntranceDirection = GetEntranceDirectionForExitType( nExitDirection )
|
||||
|
||||
self:SendRoomToClient()
|
||||
ExitRoom:SendRoomToClient()
|
||||
|
||||
roomSelectionStats.selectedRoom = ExitRoom:ComputeRoomStats()
|
||||
if ExitRoom.Encounter ~= nil then
|
||||
ExitRoom.Encounter:Introduce()
|
||||
end
|
||||
else
|
||||
roomSelectionStats.unselectedRoom = ExitRoom:ComputeRoomStats()
|
||||
UnloadSpawnGroupByHandle( ExitRoom:GetSpawnGroupHandle() )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
GameRules.Aghanim:RegisterEncounterStats( roomSelectionStats )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetExitRoomSelected( )
|
||||
return self.szExitRoomSelected
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:Activate()
|
||||
if self.bActivated == false then
|
||||
self.bActivated = true
|
||||
|
||||
self.nTriggerStartTouchListener = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self )
|
||||
self.nTriggerEndTouchListener = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self )
|
||||
|
||||
self:LoadExitRooms()
|
||||
|
||||
self.Encounter:Start()
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnEncounterCompleted()
|
||||
StopListeningToGameEvent( self.nTriggerStartTouchListener )
|
||||
StopListeningToGameEvent( self.nTriggerEndTouchListener )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- trigger_start_touch
|
||||
-- > trigger_name - string
|
||||
-- > activator_entindex - short
|
||||
-- > caller_entindex- short
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function CMapRoom:OnTriggerStartTouch( event )
|
||||
--printf( "map_room - OnTriggerStartTouch" )
|
||||
|
||||
local sTriggerName = nil
|
||||
if event.trigger_name ~= nil then
|
||||
sTriggerName = event.trigger_name
|
||||
end
|
||||
|
||||
local hActivator = nil
|
||||
if event.activator_entindex ~= nil then
|
||||
hActivator = EntIndexToHScript( event.activator_entindex )
|
||||
end
|
||||
|
||||
local hCaller = nil
|
||||
if event.caller_entindex ~= nil then
|
||||
hCaller = EntIndexToHScript( event.caller_entindex )
|
||||
end
|
||||
|
||||
if sTriggerName == "room_activate" and hCaller:GetSpawnGroupHandle() == self:GetSpawnGroupHandle() and hActivator ~= nil and hActivator:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hActivator:IsOwnedByAnyPlayer() and not hActivator:IsTempestDouble() then
|
||||
table.insert( self.PlayerUnitsInRoom, hActivator )
|
||||
if hActivator:IsRealHero() then
|
||||
local hCurrentRoomOfPlayer = GameRules.Aghanim:GetPlayerCurrentRoom( hActivator:GetPlayerOwnerID() )
|
||||
if hCurrentRoomOfPlayer ~= self then
|
||||
GameRules.Aghanim:SetPlayerCurrentRoom( hActivator:GetPlayerOwnerID(), self )
|
||||
end
|
||||
|
||||
end
|
||||
--print( "Player unit " .. hActivator:GetUnitName() .. " just entered room " .. self:GetMapName() .. " (" .. #self.PlayerUnitsInRoom .. " new count)" )
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- trigger_end_touch
|
||||
-- > trigger_name - string
|
||||
-- > activator_entindex - short
|
||||
-- > caller_entindex- short
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:OnTriggerEndTouch( event )
|
||||
local sTriggerName = nil
|
||||
if event.trigger_name ~= nil then
|
||||
sTriggerName = event.trigger_name
|
||||
end
|
||||
|
||||
local hActivator = nil
|
||||
if event.activator_entindex ~= nil then
|
||||
hActivator = EntIndexToHScript( event.activator_entindex )
|
||||
end
|
||||
|
||||
local hCaller = nil
|
||||
if event.caller_entindex ~= nil then
|
||||
hCaller = EntIndexToHScript( event.caller_entindex )
|
||||
end
|
||||
|
||||
if sTriggerName == "room_activate" and hCaller:GetSpawnGroupHandle() == self:GetSpawnGroupHandle() and hActivator ~= nil and hActivator:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hActivator:IsOwnedByAnyPlayer() then
|
||||
for k,hUnit in pairs ( self.PlayerUnitsInRoom ) do
|
||||
if hUnit and hUnit == hActivator then
|
||||
table.remove( self.PlayerUnitsInRoom, k )
|
||||
--print( "Player unit " .. hActivator:GetUnitName() .. " just left room " .. self:GetMapName() .. " (" .. #self.PlayerUnitsInRoom .. " new count)" )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:SetRoomChoiceReward( szReward )
|
||||
self.szRoomChoiceReward = szReward
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetRoomChoiceReward()
|
||||
return self.szRoomChoiceReward
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:SendRoomToClient()
|
||||
local netTable = {}
|
||||
if GameRules.Aghanim:GetCurrentRoom() and self:GetAct() <= GameRules.Aghanim:GetCurrentRoom():GetAct() then
|
||||
netTable[ "reward" ] = self:GetRoomChoiceReward()
|
||||
netTable[ "map_name" ] = self:GetMapName()
|
||||
netTable[ "room_type" ] = self:GetType()
|
||||
netTable[ "depth" ] = self:GetDepth()
|
||||
netTable[ "entrance_direction" ] = self:GetPlayerEntranceDirection()
|
||||
netTable[ "exit_direction" ] = self:GetPlayerChosenExitDirection()
|
||||
|
||||
netTable[ "completed" ] = 0
|
||||
if self:GetEncounter():IsComplete() then
|
||||
netTable[ "completed" ] = 1
|
||||
end
|
||||
|
||||
netTable[ "current_room" ] = 0
|
||||
if self == GameRules.Aghanim:GetCurrentRoom() then
|
||||
netTable[ "current_room" ] = 1
|
||||
end
|
||||
|
||||
netTable[ "elite" ] = self:GetEliteRank()
|
||||
else
|
||||
netTable[ "reward" ] = "REWARD_TYPE_HIDDEN"
|
||||
netTable[ "map_name" ] = "none"
|
||||
netTable[ "room_type" ] = ROOM_TYPE_INVALID
|
||||
netTable[ "entrance_direction" ] = ROOM_EXIT_INVALID
|
||||
netTable[ "exit_direction" ] = ROOM_EXIT_INVALID
|
||||
netTable[ "depth" ] = self:GetDepth()
|
||||
|
||||
if self:GetType() == ROOM_TYPE_BOSS or self:GetType() == ROOM_TYPE_BONUS then
|
||||
netTable[ "room_type" ] = self:GetType()
|
||||
end
|
||||
|
||||
netTable[ "completed" ] = 0
|
||||
netTable[ "current_room" ] = 0
|
||||
netTable[ "elite" ] = 0
|
||||
end
|
||||
|
||||
CustomNetTables:SetTableValue( "room_data", self:GetName(), netTable )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsInRoom( hUnit )
|
||||
for _,hUnitInRoom in pairs ( self.PlayerUnitsInRoom ) do
|
||||
if hUnitInRoom == hUnit then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetPlayerUnitsInRoom()
|
||||
return self.PlayerUnitsInRoom
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsActivated()
|
||||
if self.PlayerUnitsInRoom == nil or #self.PlayerUnitsInRoom == 0 then
|
||||
return false
|
||||
end
|
||||
return self.bActivated
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetName()
|
||||
return self.szRoomName
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetType()
|
||||
return self.nRoomType
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetAct()
|
||||
return self.nAct
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetDepth()
|
||||
return self.nDepth
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetEliteRank()
|
||||
return self.nEliteDepthBonus
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsElite()
|
||||
return self.nEliteDepthBonus > 0
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetOrigin()
|
||||
return self.vOrigin
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetMins()
|
||||
return self.vMins
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetMaxs()
|
||||
return self.vMaxs
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetEncounter()
|
||||
return self.Encounter
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetEncounterName()
|
||||
return self.szEncounterName
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetSpawnGroupHandle()
|
||||
return self.hSpawnGroupHandle
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:IsMapReady()
|
||||
return self.bSpawnGroupReady
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetMapName()
|
||||
return self.szMapName
|
||||
end
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetPlayerEntranceDirection()
|
||||
return self.nPlayerEntranceDirection
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:GetPlayerChosenExitDirection()
|
||||
return self.nPlayerChosenExitDirection
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:HasCrystal()
|
||||
return self.bHasCrystal
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:RoomRandomInt( nMinInt, nMaxInt )
|
||||
return self.hRandomStream:RandomInt( nMinInt, nMaxInt )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapRoom:RoomRandomFloat( flMin, flMin )
|
||||
return self.hRandomStream:RandomFloat( flMin, flMin )
|
||||
end
|
||||
Reference in New Issue
Block a user