require( "map_encounter" ) require( "aghanim_utility_functions" ) require( "spawner" ) -------------------------------------------------------------------------------- if CMapEncounter_StartingRoom == nil then CMapEncounter_StartingRoom = class( {}, {}, CMapEncounter ) end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:constructor( hRoom, szEncounterName ) CMapEncounter.constructor( self, hRoom, szEncounterName ) self:GetRoom().hSpawnGroupHandle = GetActiveSpawnGroupHandle() self.bRewardsSelected = false self.bSpokenGameStartLine = false self.bAllButtonsReady = false end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:Start() self.flStartTime = GameRules:GetGameTime() if GameRules.Aghanim:HasSetAscensionLevel() == false then -- Default the ascension level now in case we do any developer shit, and juke the system to think we haven't set it yet GameRules.Aghanim:SetAscensionLevel( 0 ) GameRules.Aghanim.bHasSetAscensionLevel = false local nMaxOption = GameRules.Aghanim:GetMaxAllowedAscensionLevel() local nOption = 0 while nOption <= nMaxOption do local hAscensionLocator = Entities:FindByName( nil, "ascension_picker_locator_" .. ( nOption + 1 ) ) if hAscensionLocator == nil then break end local vOrigin = hAscensionLocator:GetAbsOrigin() local vAngles = hAscensionLocator:GetAnglesAsVector() local pickerTable = { MapUnitName = "npc_dota_aghsfort_watch_tower_option_1", origin = tostring( vOrigin.x ) .. " " .. tostring( vOrigin.y ) .. " " .. tostring( vOrigin.z ), angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ), OptionNumber = tostring( nOption + 1 ), teamnumber = DOTA_TEAM_NEUTRALS, AscensionLevelPicker = 1, } CreateUnitFromTable( pickerTable, vOrigin ) nOption = nOption + 1 end if nOption == 0 then print( "Unable to find ascension_picker_locator_ entities!\n" ) self:OnAscensionLevelSelected( { level = 1 } ) return end end -- Use encounter name to display "select ascension level" self:Introduce() -- Players Ready self.nPlayersReady = 0 local nTriggerStartTouchEvent = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self ) table.insert( self.EventListeners, nTriggerStartTouchEvent ) local nTriggerEndTouchEvent = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self ) table.insert( self.EventListeners, nTriggerEndTouchEvent ) local nAscensionSelectedEvent = ListenToGameEvent( "aghsfort_ascension_level_selected", Dynamic_Wrap( getclass( self ), "OnAscensionLevelSelected" ), self ) table.insert( self.EventListeners, nAscensionSelectedEvent ) end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:OnAscensionLevelSelected( event ) print( "Ascension Level " .. event.level .. " selected" ) GameRules.Aghanim:SetAscensionLevel( event.level - 1 ) end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:OnThink() CMapEncounter.OnThink( self ) -- Don't speak until all players are connected if self.bSpokenGameStartLine == false then local nConnectedPlayerCount = 0 local nPlayerCount = 0 for nPlayerID = 0, AGHANIM_PLAYERS - 1 do if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS and PlayerResource:IsValidPlayerID( nPlayerID ) then nPlayerCount = nPlayerCount + 1 if PlayerResource:GetConnectionState( nPlayerID ) == DOTA_CONNECTION_STATE_CONNECTED then nConnectedPlayerCount = nConnectedPlayerCount + 1 end end end if nConnectedPlayerCount == nPlayerCount then GameRules.Aghanim:GetAnnouncer():OnGameStarted( ) self.bSpokenGameStartLine = true end end -- Update UI indicating who has picked their reward local vecRewardState = GameRules.Aghanim:DetermineRewardSelectionState() if vecRewardState ~= nil then local nNumSelected = 0 local vecPlayers = GameRules.Aghanim:GetConnectedPlayers() for i=1,#vecPlayers do if vecRewardState[ tostring( vecPlayers[i] ) ] == true then nNumSelected = nNumSelected + 1 end end self:UpdateEncounterObjective( "objective_select_aghanims_fragmants", nNumSelected, nil ) if #vecPlayers > 0 and nNumSelected == #vecPlayers then self:GetRoom().bSpawnGroupReady = true self.bRewardsSelected = true end end end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:InitializeObjectives() --CMapEncounter.InitializeObjectives( self ) self:AddEncounterObjective( "objective_stand_on_buttons", 0, 4 ) self:AddEncounterObjective( "objective_select_aghanims_fragmants", 0, 4 ) end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:OnTriggerStartTouch( event ) if self.bAllButtonsReady == true then return end -- Get the trigger that activates the room local szTriggerName = event.trigger_name local hUnit = EntIndexToHScript( event.activator_entindex ) local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) if szTriggerName == "trigger_player_1" or szTriggerName == "trigger_player_2" or szTriggerName == "trigger_player_3" or szTriggerName == "trigger_player_4" then --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) self.nPlayersReady = self.nPlayersReady + 1 self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil ) local vecPlayers = GameRules.Aghanim:GetConnectedPlayers() if #vecPlayers > 0 then if self.nPlayersReady == #vecPlayers then self.bAllButtonsReady = true self:GenerateRewards() -- We want to announce rewards during the starting room GameRules.Aghanim:GetAnnouncer():OnSelectRewards() -- Open the main gate local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "main_gate_open_relay", false ) for _, hRelay in pairs( hRelays ) do hRelay:Trigger( nil, nil ) end end end end end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:OnTriggerEndTouch( event ) if self.bAllButtonsReady == true then return end -- Get the trigger that activates the room local szTriggerName = event.trigger_name local hUnit = EntIndexToHScript( event.activator_entindex ) local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) if szTriggerName == "trigger_player_1" or szTriggerName == "trigger_player_2" or szTriggerName == "trigger_player_3" or szTriggerName == "trigger_player_4" then --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) self.nPlayersReady = self.nPlayersReady - 1 self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil ) end end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:CheckForCompletion() return GameRules.Aghanim:HasSetAscensionLevel() == true and self.bRewardsSelected == true end -------------------------------------------------------------------------------- function CMapEncounter_StartingRoom:OnComplete() CMapEncounter.OnComplete( self ) for nPlayerID=0,AGHANIM_PLAYERS-1 do local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) if hHero then hHero:SetAbilityPoints( 2 ) EmitSoundOnClient( "General.LevelUp", hHero:GetPlayerOwner() ) ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/generic_hero_status/hero_levelup.vpcf", PATTACH_ABSORIGIN_FOLLOW, nil ) ) end end end -------------------------------------------------------------------------------- return CMapEncounter_StartingRoom