示例#1
0
// Called every frame
void UOpenDoor::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )
{
	Super::TickComponent( DeltaTime, TickType, ThisTickFunction );

	// Poll the trigger volume every frame
	//If the actor that opens is in the volume, then open the door
	if (pressurePlate)
	{
		if (pressurePlate->IsOverlappingActor(actorThatOpens))
		{
			if (!isDoorOpen)
			{
				OpenDoor();
			}
			
			if (closeWithTime)
			{
				lastDoorOpenTime = GetWorld()->GetTimeSeconds();
			}
			
		}
		else if(isDoorOpen && !closeWithTime)
		{
			CloseDoor();
		}
	}
	//Check if it's time to close
	if (closeWithTime)
	{
		if (GetWorld()->GetTimeSeconds() - lastDoorOpenTime > doorCloseDelay)
		{
			CloseDoor();
		}
	}
}
	void Scheduler::Operator()
	{
	    Serial.print("----- Operator Command");
	     switch(opCode){
	     case 0:   Reset();
		           Serial.print(" op: System Reset ");
		           Serial.print("-----\n");
				   break;
	     case 3:   InsertDestination(floor,elevatorID);
		           Serial.print(" op:Insert Destination for Elevator "+String(elevatorID+1));
		           Serial.print("\tFloor : "+String(floor)+"-----\n");
		           break;
	     case 4:   OpenDoor(elevatorID);
		           Serial.print(" op: Open Door for Elevator "+String(elevatorID+1));
		           Serial.print("-----\n");
		           break;
	     case 5:   CloseDoor(elevatorID);
		           Serial.print(" op: Close Door for Elevator "+String(elevatorID+1));
		           Serial.print("-----\n");
		           break;
	     case 7:   Serial.print(" op: Alarm status:");
				   Alarm(elevatorID);
				   Serial.print(" for Elevator "+String(elevatorID+1));
				   Serial.print("-----\n");
				   break;
	     default : break;
	 }
	 
	}
 void OpenAllDoors()
 {
     if (m_auiEncounter[TYPE_RAGEFIRE] == DONE && 
         m_auiEncounter[TYPE_BALTHARUS] == DONE && 
         m_auiEncounter[TYPE_XERESTRASZA] == DONE)
              OpenDoor(m_uiFlameWallsGUID);
     else CloseDoor(m_uiFlameWallsGUID);
 }
	void Update(uint32 diff)
	{
		if(checkPlayer_Timer <= diff)
		{
			if(!CheckPlayersInMap())
			{
				CloseDoor(m_uiMarrowgarDoorGUID);
				CloseDoor(m_uiFestergutDoorGUID);
				CloseDoor(m_uiRotfaceDoorGUID);
				OpenDoor(m_uiPutricideDoorGUID);
				OpenDoor(m_uiPrinceCouncilDoorGUID);
				if(GetData(TYPE_LANATHEL) == DONE)
					OpenDoor(m_uiDreamWalkerDoorGUID);
				if(GetData(TYPE_DREAMWALKER) == DONE)
					OpenDoor(m_uiSindragosaDoorGUID);

				CloseDoor(m_uiDreamwalkerEventDoorGUID[0]);
				CloseDoor(m_uiDreamwalkerEventDoorGUID[1]);
				CloseDoor(m_uiDreamwalkerEventDoorGUID[2]);
				CloseDoor(m_uiDreamwalkerEventDoorGUID[3]);

				if(GetData(TYPE_DREAMWALKER) == IN_PROGRESS)
					SetData(TYPE_DREAMWALKER,FAIL);

				if(Creature* Dreamwalker = GetCreatureInMap(m_uiDreamwalkerImageGUID))
				{
					Dreamwalker->ForcedDespawn(500);
					m_uiDreamwalkerImageGUID = 0;
				}
			}

			if (GetData(TYPE_SAURFANG) == DONE)
	            OpenDoor(m_uiSaurfangDoorGUID);

			if(GetData(TYPE_PRINCE_COUNCIL) == DONE)
			{
				OpenDoor(m_uiLanathelDoorGUID_1);
				OpenDoor(m_uiLanathelDoorGUID_2);
			}

			if(GetData(TYPE_LANATHEL) == DONE)
				OpenDoor(m_uiFrostWingDoorGUID);

			if(GetData(TYPE_ROTFACE) == DONE && GetData(TYPE_FESTERGUT) == DONE || GetData(TYPE_PUTRICIDE) == DONE)
			{
				OpenDoor(m_uiBloodWingDoorGUID);
				OpenDoor(m_uiFrostWingDoorGUID);
			}

			checkPlayer_Timer = 500;
		}
		else
			checkPlayer_Timer -= diff;
	}
示例#5
0
// Called every frame
void UOpenDoor::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )
{
	Super::TickComponent( DeltaTime, TickType, ThisTickFunction );

	if (PressurePlate->IsOverlappingActor(ActorThatOpen))
	{
		OpenDoor();
		LastDoorOpenTime = GetWorld()->GetTimeSeconds();
	}

	if (GetWorld()->GetTimeSeconds() - LastDoorOpenTime > DoorCloseDelay)
	{
		CloseDoor();
	}
}
示例#6
0
// Called every frame
void UOpenDoor::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )
{
	Super::TickComponent( DeltaTime, TickType, ThisTickFunction );

	// If total mass of actors on trigger is over x kg then OpenDoor()
	if (!PressurePlate) { return; }
	if (GetMassOfActors() > TriggerMass)
	{
		ManualOpen = false;
		OpenDoor();
	}
	else if (!ManualOpen)
	{
		CloseDoor();
	};
}
 // Wipe has been detected. Perform cleanup and reset.
 void DoWipe()
 {            
     events.Reset();
         // Mawyn wins waves restart at 6 after Falric dies
         if (GetData(DATA_MARWYN_EVENT) == IN_PROGRESS)
                uiWaveCount = 6;
         //Players kill Falric waves restart at 6 after Falric dies
         if (GetData(DATA_MARWYN_EVENT) != DONE && GetData(DATA_FALRIC_EVENT) == DONE)
                uiWaveCount = 6;               
                   
     OpenDoor(uiFrontDoor);
     CloseDoor(uiArthasDoor);     
     if (Creature* falric = instance->GetCreature(uiFalric))
            falric->SetVisible(false);
     if (Creature* marwyn = instance->GetCreature(uiMarwyn))
            marwyn->SetVisible(false);
 }
// Called every frame
void UOpenDoor::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )
{
	Super::TickComponent( DeltaTime, TickType, ThisTickFunction );

	if (GetTotalMassOfActorsOnPlate() > 30.f)
	{
		OpenDoor();
		LastDoorOpenTime = GetWorld()->GetTimeSeconds();
	}
	
	if (GetWorld()->GetTimeSeconds() - LastDoorOpenTime > DoorCloseDelay)
	{
		CloseDoor();
	}

	// ...
}
	void Scheduler::Passenger()
    {
	  
	  Serial.print("----- Passenger Command ");
	     switch(opCode){
	    
	     case 0:   break;
	     case 1:   ScheduleCalls(floor,"UP");
	 	           Serial.print(" op: Hall Call Up");
	 			   Serial.print("\tFloor : "+String(floor)+"-----\n");
	 			   break;
	     case 2:   ScheduleCalls(floor,"DOWN");
	 	           Serial.print(" op: Hall Call Down");
	 			   Serial.print("\tFloor : "+String(floor)+"-----\n");
	 			   break;
	     case 3:   InsertDestination(floor,elevatorID);
	 	           Serial.print(" op:Insert Destination for Elevator "+String(elevatorID+1));
	 	           Serial.print("\tFloor : "+String(floor)+"-----\n");
	 	           break;
	     case 4:   OpenDoor(elevatorID);
	 	           Serial.print(" op: Open Door for Elevator "+String(elevatorID+1));
	 	           Serial.print("-----\n");
	 	           break;
	     case 5:   CloseDoor(elevatorID);
	 	           Serial.print(" op: Close Door for Elevator "+String(elevatorID+1));
	 	           Serial.print("-----\n");
	 	           break;
	     case 6:   CancelCalls(floor,elevatorID);
	 			   Serial.print(" op: Cancel floor for Elevator "+String(elevatorID+1));
	 			   Serial.print("\tFloor : "+String(floor)+"-----\n");
	 			   break;
	     case 7:   Serial.print(" op: Alarm status:");
	 			   Alarm(elevatorID);
	 			   Serial.print(" for Elevator "+String(elevatorID+1));
	 			   Serial.print("-----\n");
	 			   break;
	     default : break;
	 }
    }	
示例#10
0
void nobMilitary::AddPassiveSoldier(nofPassiveSoldier* soldier)
{
    RTTR_Assert(soldier->GetPlayer() == player);
    RTTR_Assert(troops.size() < unsigned(TROOPS_COUNT[nation][size]));

    troops.insert(soldier);

    // und aus den bestllten Truppen raushauen, da er ja jetzt hier ist
    ordered_troops.erase(soldier);

    // Wurde dieses Gebäude zum ersten Mal besetzt?
    if(new_built)
    {
        SendPostMessage(player, new PostMsgWithBuilding(GetEvMgr().GetCurrentGF(), _("Military building occupied"), PMC_MILITARY, *this));
        // Ist nun besetzt
        new_built = false;
        // Landgrenzen verschieben
        gwg->RecalcTerritory(*this, false, true);
        // Tür zumachen
        CloseDoor();
        // Fanfarensound abspieln, falls das Militärgebäude im Sichtbereich ist und unseres ist
        gwg->MilitaryBuildingCaptured(pos, player);
        gwg->GetNotifications().publish(BuildingNote(BuildingNote::Captured, player, pos, type_));
    }
    else
    {
        // Evtl. Soldaten befördern
        PrepareUpgrading();
    }

    if( mAutoTrain )
        RegulateTroops();

    // Goldmünzen suchen, evtl sinds ja neue Soldaten
    SearchCoins();
}
    void SetData(uint32 uiType, uint32 uiData)
    {
        switch(uiType)
        {
        case TYPE_STAGE:     m_auiEncounter[0] = uiData; break;
        case TYPE_BEASTS:    m_auiEncounter[1] = uiData; break;
        case TYPE_JARAXXUS:  m_auiEncounter[2] = uiData; break;
        case TYPE_CRUSADERS: if (uiData == FAIL && (m_auiEncounter[3] == FAIL || m_auiEncounter[3] == NOT_STARTED))
                             m_auiEncounter[3] = NOT_STARTED;
                             else  m_auiEncounter[3] = uiData;
                             if (uiData == DONE) {
                                   if (GameObject* pChest = instance->GetGameObject(m_uiCrusadersCacheGUID))
                                       if (pChest && !pChest->isSpawned())
                                             pChest->SetRespawnTime(7*DAY);
                                   };
                             break;
        case TYPE_CRUSADERS_COUNT:  if (uiData == 0) --m_auiCrusadersCount;
                                         else m_auiCrusadersCount = uiData;
                                    break;
        case TYPE_VALKIRIES: if (m_auiEncounter[4] == SPECIAL && uiData == SPECIAL) uiData = DONE;
                             m_auiEncounter[4] = uiData; break;
        case TYPE_LICH_KING: m_auiEncounter[5] = uiData; break;
        case TYPE_ANUBARAK:  m_auiEncounter[6] = uiData; 
                            if (uiData == DONE) {
                            if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC){
                                if ( m_auiEncounter[7] >= 25) m_uiTributeChest1GUID = m_uiTC10h25GUID;
                                if ( m_auiEncounter[7] >= 45) m_uiTributeChest2GUID = m_uiTC10h45GUID;
                                if ( m_auiEncounter[7] >= 49) m_uiTributeChest3GUID = m_uiTC10h50GUID;
                                m_uiTributeChest4GUID = m_uiTC10h99GUID;
                            }
                            if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC){
                                if ( m_auiEncounter[7] >= 25) m_uiTributeChest1GUID = m_uiTC25h25GUID;
                                if ( m_auiEncounter[7] >= 45) m_uiTributeChest2GUID = m_uiTC25h45GUID;
                                if ( m_auiEncounter[7] >= 49) m_uiTributeChest3GUID = m_uiTC25h50GUID;
                                m_uiTributeChest4GUID = m_uiTC25h99GUID;
                            }
                            // Attention! It is (may be) not off-like, but  spawning all Tribute Chests is real
                            // reward for clearing TOC instance
                            if (m_uiTributeChest1GUID)
                              if (GameObject* pChest1 = instance->GetGameObject(m_uiTributeChest1GUID))
                                if (pChest1 && !pChest1->isSpawned()) pChest1->SetRespawnTime(7*DAY);
                            if (m_uiTributeChest2GUID)
                              if (GameObject* pChest2 = instance->GetGameObject(m_uiTributeChest2GUID))
                                if (pChest2 && !pChest2->isSpawned()) pChest2->SetRespawnTime(7*DAY);
                            if (m_uiTributeChest3GUID)
                              if (GameObject* pChest3 = instance->GetGameObject(m_uiTributeChest3GUID))
                                if (pChest3 && !pChest3->isSpawned()) pChest3->SetRespawnTime(7*DAY);
                            if (m_uiTributeChest4GUID)
                              if (GameObject* pChest4 = instance->GetGameObject(m_uiTributeChest4GUID))
                                if (pChest4 && !pChest4->isSpawned()) pChest4->SetRespawnTime(7*DAY);
                            };
        break;
        case TYPE_COUNTER:   m_auiEncounter[7] = uiData; uiData = DONE; break;
        case TYPE_EVENT:     m_auiEncounter[8] = uiData; uiData = NOT_STARTED; break;
        case TYPE_EVENT_TIMER:      m_auiEventTimer = uiData; uiData = NOT_STARTED; break;
        case TYPE_NORTHREND_BEASTS: m_auiNorthrendBeasts = uiData; break;
        case DATA_HEALTH_FJOLA:     m_uiDataDamageFjola = uiData; uiData = NOT_STARTED; break;
        case DATA_HEALTH_EYDIS:     m_uiDataDamageEydis = uiData; uiData = NOT_STARTED; break;
        case DATA_CASTING_VALKYRS:  m_uiValkyrsCasting = uiData; uiData = NOT_STARTED; break;
        }

        if (IsEncounterInProgress()) 
        {

            CloseDoor(GetData64(GO_WEST_PORTCULLIS));
            CloseDoor(GetData64(GO_NORTH_PORTCULLIS));
            //                                    CloseDoor(GetData64(GO_SOUTH_PORTCULLIS));
        }
        else
        {

            OpenDoor(GetData64(GO_WEST_PORTCULLIS));
            OpenDoor(GetData64(GO_NORTH_PORTCULLIS));
            //                                    OpenDoor(GetData64(GO_SOUTH_PORTCULLIS));
        };

        if (uiData == FAIL && uiType != TYPE_STAGE
                           && uiType != TYPE_EVENT
                           && uiType != TYPE_COUNTER
                           && uiType != TYPE_EVENT_TIMER)
        {
            if (IsRaidWiped()) 
            {
                --m_auiEncounter[7];
                needsave = true;
            }
            uiData = NOT_STARTED;
        }

        if ((uiData == DONE && uiType != TYPE_STAGE
                           && uiType != TYPE_EVENT
                           && uiType != TYPE_EVENT_TIMER)
                           || needsave == true)
        {
            OUT_SAVE_INST_DATA;

            std::ostringstream saveStream;

            for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
                saveStream << m_auiEncounter[i] << " ";

            m_strInstData = saveStream.str();

            SaveToDB();
            OUT_SAVE_INST_DATA_COMPLETE;
            needsave = false;
        }
    }
示例#12
0
void instance_ulduar::SetData(uint32 uiType, uint32 uiData)
{
	switch(uiType)
    {
		
		case TYPE_LEVIATHAN:
		case TYPE_RAZORSCALE:
		case TYPE_MIMIRON:
		case TYPE_ALGALON:
			m_auiEncounter[uiType] = uiData;
			break;
		case TYPE_IGNIS:
			m_auiEncounter[uiType] = uiData;
			if(uiData == DONE)
			{
				if(IgnisAddTimedActivate > 1)
				{
					IgnisAddTimedActivate = 0;
					CompleteAchievementForGroup(instance->GetDifficulty() ? 2926 : 2925);
				}
			}
			break;
		case TYPE_VEZAX:
			m_auiEncounter[uiType] = uiData;
			if(uiData == DONE)
				OpenDoor(VezaxDoorGUID);
			else
				CloseDoor(VezaxDoorGUID);
			break;
		case TYPE_YOGGSARON:
			if(uiData == DONE || uiData == FAIL ||uiData == NOT_STARTED)
			{
				DespawnCreatures(YoggAdds);
				CloseDoor(YoggDoorGUID);
			}
			else
				OpenDoor(YoggDoorGUID);
			break;
		case TYPE_AURIAYA:
			m_auiEncounter[uiType] = uiData;
			if(uiData == DONE)
				OpenDoor(AuriayaDoorGUID);
			break;
		case TYPE_ASSEMBLY:
			m_auiEncounter[uiType] = uiData;
			if(uiData == DONE)
			{
				CloseDoor(IronCouncilDoorGUID);
				OpenDoor(IronCouncilArchivumGUID);
			}
			else if(uiData == IN_PROGRESS)
			{
				OpenDoor(IronCouncilDoorGUID);
				CloseDoor(IronCouncilArchivumGUID);
			}
			CompleteAchievementForGroup(instance->GetDifficulty() ? 2885 : 2860);
			break;
		case TYPE_XT002:
			m_auiEncounter[uiType] = uiData;
			if(uiData == DONE)
				CloseDoor(XTDoorGUID);
			else
				OpenDoor(XTDoorGUID);
			break;
		case TYPE_THORIM:
			m_auiEncounter[uiType] = uiData;
			if (uiData == DONE)
			{
				if (GameObject* pChest = instance->GetGameObject(m_uiThorimLootGUID))
					if (pChest && !pChest->isSpawned())
						pChest->SetRespawnTime(350000000);
			}
			else if(uiData == IN_PROGRESS)
				OpenDoor(ThorimDoorGUID);
			break;
		case TYPE_FREYA:
			m_auiEncounter[uiType] = uiData;
			for (std::vector<Creature*>::iterator itr = FreyaTrashs.begin(); itr != FreyaTrashs.end();++itr)
				if((*itr) && (*itr)->isAlive())
					(*itr)->SetRespawnDelay(7*RESPAWN_ONE_DAY);

			if(uiData == DONE)
			{
				if (GameObject* pChest = instance->GetGameObject(FreyaGiftGUID))
					if (pChest && !pChest->isSpawned())
						pChest->SetRespawnTime(350000000);
			}
			break;
		case TYPE_HODIR:
			m_auiEncounter[uiType] = uiData;
			for (std::vector<Creature*>::iterator itr = HodirTrashs.begin(); itr != HodirTrashs.end();++itr)
					if((*itr) && (*itr)->isAlive())
						(*itr)->SetRespawnDelay(7*RESPAWN_ONE_DAY);
			if(uiData == NOT_STARTED)
			{
				for(std::vector<Creature*>::const_iterator itr = HodirAdds.begin(); itr != HodirAdds.end(); ++itr)
					(*itr)->Respawn();
			}
			else if(uiData == DONE)
			{
				CloseDoor(HodirDoorGUID);
				OpenDoor(HodirExitDoor1GUID);
				OpenDoor(HodirExitDoor2GUID);
			}
			else if(uiData == IN_PROGRESS)
			{
				OpenDoor(HodirDoorGUID);
			}
			break;
		case TYPE_KOLOGARN:
			m_auiEncounter[5] = uiData;
			if (uiData == DONE)
			{
				if (GameObject* pChest = instance->GetGameObject(m_uiKologarnLootGUID))
					if (pChest && !pChest->isSpawned())
						pChest->SetRespawnTime(350000000);
				if (GameObject* pBridge = instance->GetGameObject(m_uiKologarnBridgeGUID))
					pBridge->SetGoState(GO_STATE_READY);

				for (std::vector<Creature*>::iterator itr = KologarnTrashs.begin(); itr != KologarnTrashs.end();++itr)
					if((*itr) && (*itr)->isAlive())
						(*itr)->SetRespawnDelay(7*RESPAWN_ONE_DAY);

				CloseDoor(KologarnDoorGUID);
			}
			else if(uiData == IN_PROGRESS)
				OpenDoor(KologarnDoorGUID);
			break;
		case DATA_THORIM_ORB:
		{
			Unit* target = NULL;
			if(thisMap)
			{
				Map::PlayerList const& lPlayers = thisMap->GetPlayers();
				if (!lPlayers.isEmpty())
					for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
						if (Player* pPlayer = itr->getSource())
							if(pPlayer->isAlive())
								target = pPlayer;
			}
			for (std::vector<Creature*>::iterator itr = ThorimThunderOrbs.begin(); itr != ThorimThunderOrbs.end();++itr)
				if((*itr) && (*itr)->isAlive())
					(*itr)->CastSpell(target,62470,false);
			break;
		}
		case DATA_THORIM_ADDS:
		{
			for (std::vector<Creature*>::iterator itr = ThorimAdds.begin(); itr != ThorimAdds.end();++itr)
				if((*itr))
					(*itr)->Respawn();
			break;
		}
		case DATA_YOGG_NUAGE:
		{
			for (std::vector<Creature*>::iterator itr = YoggNuage.begin(); itr != YoggNuage.end();++itr)
			{
				if(uiData == 0)
					(*itr)->SetPhaseMask(0x1,true);
				else
				{
					(*itr)->SetPhaseMask(0x2,true);
				}
			}

			DespawnCreatures(YoggAdds);
			DespawnCreatures(YoggTentacles);
			break;
		}
		case DATA_YOGG_END_PORTALS:
		{
			for (std::vector<uint64>::iterator itr = YoggEndPortals.begin(); itr != YoggEndPortals.end();++itr)
			{
				if(GameObject* go = GetGoInMap(*itr))
				{
					if(uiData == 0)
						go->SetPhaseMask(0x1,true);
					else
						go->SetPhaseMask(0x2,true);
				}
			}
			break;
		}
		case DATA_IGNIS_ADD_MONO:
		{
			if(IgnisAddTimedActivate == 0)
				IgnisHFReset_Timer = 5000;
			IgnisAddTimedActivate++;
			break;
		}
		case DATA_YOGG_TENTACLES_FROZEN:
		{
			if(uiData == 0)
				TentaclesCanAttack = false;
			else
				TentaclesCanAttack = true;
			break;
		}
		case DATA_YOGGBRAIN_DOOR:
		{
			switch(uiData)
			{
				case 0:
					CloseDoor(YoggBrainDoor1GUID);
					CloseDoor(YoggBrainDoor2GUID);
					CloseDoor(YoggBrainDoor2GUID);
					break;
				case 1:
					OpenDoor(YoggBrainDoor1GUID);
					break;
				case 2:
					OpenDoor(YoggBrainDoor2GUID);
					break;
				case 3:
					OpenDoor(YoggBrainDoor3GUID);
					break;
			}
			break;
		}
    }

    if (uiData == DONE)
    {
        OUT_SAVE_INST_DATA;

        std::ostringstream saveStream;

        for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
            saveStream << m_auiEncounter[i] << " ";

        m_strInstData = saveStream.str();

        SaveToDB();
        OUT_SAVE_INST_DATA_COMPLETE;
    }
}
            bool SetBossState(uint32 type, EncounterState state)
            {
                if (!InstanceScript::SetBossState(type, state))
                    return false;

                switch (type)
                {
                    case BOSS_BEASTS:
                        break;
                    case BOSS_JARAXXUS:
                        // Cleanup Icehowl
                        if (Creature* icehowl = instance->GetCreature(IcehowlGUID))
                            icehowl->DespawnOrUnsummon();
                        if (state == DONE)
                            EventStage = 2000;
                        break;
                    case BOSS_CRUSADERS:
                        // Cleanup Jaraxxus
                        if (Creature* jaraxxus = instance->GetCreature(JaraxxusGUID))
                            jaraxxus->DespawnOrUnsummon();
                        if (Creature* fizzlebang = instance->GetCreature(FizzlebangGUID))
                            fizzlebang->DespawnOrUnsummon();
                        switch (state)
                        {
                            case IN_PROGRESS:
                                ResilienceWillFixItTimer = 0;
                                break;
                            case SPECIAL: //Means the first blood
                                ResilienceWillFixItTimer = 60*IN_MILLISECONDS;
                                state = IN_PROGRESS;
                                break;
                            case DONE:
                                DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
                                if (ResilienceWillFixItTimer > 0)
                                    DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
                                DoRespawnGameObject(CrusadersCacheGUID, 7*DAY);
                                if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
                                    cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
                                EventStage = 3100;
                                break;
                            default:
                                break;
                        }
                        break;
                    case BOSS_VALKIRIES:
                        // Cleanup chest
                        if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
                            cache->Delete();
                        switch (state)
                        {
                            case FAIL:
                                if (GetBossState(BOSS_VALKIRIES) == NOT_STARTED)
                                    state = NOT_STARTED;
                                break;
                            case SPECIAL:
                                if (GetBossState(BOSS_VALKIRIES) == SPECIAL)
                                    state = DONE;
                                break;
                            case DONE:
                                if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE)
                                    EventStage = 4020;
                                else
                                    EventStage = 4030;
                                break;
                            default:
                                break;
                        }
                        break;
                    case BOSS_LICH_KING:
                        break;
                    case BOSS_ANUBARAK:
                        switch (state)
                        {
                            case DONE:
                            {
                                EventStage = 6000;
                                uint32 tributeChest = 0;
                                if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
                                {
                                    if (TrialCounter >= 50)
                                        tributeChest = GO_TRIBUTE_CHEST_10H_99;
                                    else
                                    {
                                        if (TrialCounter >= 45)
                                            tributeChest = GO_TRIBUTE_CHEST_10H_50;
                                        else
                                        {
                                            if (TrialCounter >= 25)
                                                tributeChest = GO_TRIBUTE_CHEST_10H_45;
                                            else
                                                tributeChest = GO_TRIBUTE_CHEST_10H_25;
                                        }
                                    }
                                }
                                else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
                                {
                                    if (TrialCounter >= 50)
                                        tributeChest = GO_TRIBUTE_CHEST_25H_99;
                                    else
                                    {
                                        if (TrialCounter >= 45)
                                            tributeChest = GO_TRIBUTE_CHEST_25H_50;
                                        else
                                        {
                                            if (TrialCounter >= 25)
                                                tributeChest = GO_TRIBUTE_CHEST_25H_45;
                                            else
                                                tributeChest = GO_TRIBUTE_CHEST_25H_25;
                                        }
                                    }
                                }

                                if (tributeChest)
                                    if (Creature* tirion =  instance->GetCreature(TirionGUID))
                                        if (GameObject* chest = tirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, WEEK))
                                            chest->SetRespawnTime(chest->GetRespawnDelay());
                                break;
                            }
                            default:
                                break;
                        }
                        break;
                    default:
                        break;
                }

                if (IsEncounterInProgress())
                {
                    CloseDoor(GetData64(GO_EAST_PORTCULLIS));
                    CloseDoor(GetData64(GO_WEB_DOOR));
                }
                else
                {
                    OpenDoor(GetData64(GO_EAST_PORTCULLIS));
                    OpenDoor(GetData64(GO_WEB_DOOR));
                }

                if (type < MAX_ENCOUNTERS)
                {
                    TC_LOG_INFO(LOG_FILTER_TSCR, "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state);
                    if (state == FAIL)
                    {
                        if (instance->IsHeroic())
                        {
                            --TrialCounter;
                            // decrease attempt counter at wipe
                            Map::PlayerList const &PlayerList = instance->GetPlayers();
                            for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
                                if (Player* player = itr->getSource())
                                    player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, TrialCounter);

                            // if theres no more attemps allowed
                            if (!TrialCounter)
                            {
                                if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT)))
                                    announcer->ToCreature()->DespawnOrUnsummon();

                                if (Creature* anubArak = instance->GetCreature(GetData64(NPC_ANUBARAK)))
                                    anubArak->DespawnOrUnsummon();
                            }
                        }
                        NeedSave = true;
                        EventStage = (type == BOSS_BEASTS ? 666 : 0);
                        state = NOT_STARTED;
                    }

                    if (state == DONE || NeedSave)
                    {
                        if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT)))
                            announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                        Save();
                    }
                }
                return true;
            }
    void instance_icecrown_spire::SetData(uint32 uiType, uint32 uiData)
    {
        if (uiType > m_auiEncounter[0] && uiData == DONE) m_auiEncounter[0] = uiType;
        switch(uiType)
        {
            case TYPE_TELEPORT:
                break;
            case TYPE_MARROWGAR:
                m_auiEncounter[1] = uiData; 
                if (uiData == DONE) {
                                     OpenDoor(m_uiIcewall1GUID);
                                     OpenDoor(m_uiIcewall2GUID);
                                    }
                break;
             case TYPE_DEATHWHISPER:
                m_auiEncounter[2] = uiData; 
                if (uiData == DONE) {
                    if (GameObject* pGO = instance->GetGameObject(m_uiDeathWhisperElevatorGUID))
                        {
                              pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                              pGO->SetGoState(GO_STATE_READY);
                        }
                }
                break;
             case TYPE_FLIGHT_WAR:
                if (uiData == DONE && m_auiEncounter[3] != DONE  ) {
                                 if (GameObject* pChest = instance->GetGameObject(m_uiGunshipArmoryAGUID))
                                     if (pChest && !pChest->isSpawned()) {
                                          pChest->SetRespawnTime(7*DAY);
                                      };

                                 if (GameObject* pChest = instance->GetGameObject(m_uiGunshipArmoryHGUID))
                                     if (pChest && !pChest->isSpawned()) {
                                          pChest->SetRespawnTime(7*DAY);
                                      };
                                };
                m_auiEncounter[3] = uiData; 
                break;
             case TYPE_SAURFANG:
                m_auiEncounter[4] = uiData; 
                if (uiData == DONE) {
                OpenDoor(m_uiSaurfangDoorGUID);
                                 if (GameObject* pChest = instance->GetGameObject(m_uiSaurfangCacheGUID))
                                     if (pChest && !pChest->isSpawned()) {
                                          pChest->SetRespawnTime(7*DAY);
                                      };
                                };
                break;
             case TYPE_FESTERGUT:
                m_auiEncounter[5] = uiData;
                if (uiData == IN_PROGRESS) CloseDoor(m_uiOrangePlagueGUID);
                                      else OpenDoor(m_uiOrangePlagueGUID);
                if (uiData == DONE)  {
                                     OpenDoor(m_uiSDoorOrangeGUID);
                                     if (m_auiEncounter[6] == DONE) OpenDoor(m_uiSDoorCollisionGUID);
                                     }
                break;
             case TYPE_ROTFACE:
                m_auiEncounter[6] = uiData;
                if (uiData == IN_PROGRESS) CloseDoor(m_uiGreenPlagueGUID);
                                      else OpenDoor(m_uiGreenPlagueGUID);
                if (uiData == DONE) {
                                     OpenDoor(m_uiSDoorGreenGUID);
                                     if (m_auiEncounter[5] == DONE) OpenDoor(m_uiSDoorCollisionGUID);
                                     }
                break;
             case TYPE_PUTRICIDE:
                m_auiEncounter[7] = uiData;
                if (uiData == IN_PROGRESS) CloseDoor(m_uiScientistDoorGUID);
                                      else OpenDoor(m_uiScientistDoorGUID);
                if (uiData == DONE) OpenDoor(m_uiBloodwingDoorGUID);
                break;
             case TYPE_BLOOD_COUNCIL:
                m_auiEncounter[8] = uiData;
                if (uiData == DONE) 
				{
                    OpenDoor(m_uiCounsilDoor1GUID);
                    OpenDoor(m_uiCounsilDoor2GUID);
                }
                break;
             case TYPE_LANATHEL:
                m_auiEncounter[9] = uiData;
                if (uiData == DONE)  OpenDoor(m_uiFrostwingDoorGUID);
                break;
             case TYPE_VALITHRIA:
                m_auiEncounter[10] = uiData;
                if (uiData == DONE) {
                OpenDoor(m_uiGreenDragonDoor2GUID);
                                 if (GameObject* pChest = instance->GetGameObject(m_uiValitriaCacheGUID))
                                     if (pChest && !pChest->isSpawned()) {
                                          pChest->SetRespawnTime(7*DAY);
                                      };
                                };
                break;
             case TYPE_SINDRAGOSA:
                m_auiEncounter[11] = uiData;
                if (uiData == DONE) {
                                     OpenDoor(m_uiSindragosaDoor1GUID);
                                     OpenDoor(m_uiSindragosaDoor2GUID);
                                    }
                break;
             case TYPE_LICH_KING:
                m_auiEncounter[12] = uiData;
                break;
             case TYPE_ICECROWN_QUESTS:
                m_auiEncounter[13] = uiData;
                break;
             case TYPE_COUNT:
                m_auiEncounter[14] = uiData;
                uiData = NOT_STARTED;
                break;
             case DATA_BLOOD_COUNCIL_HEALTH:     m_uiDataCouncilHealth = uiData; 
                                                 uiData = NOT_STARTED; 
                                                 break;
             case TYPE_EVENT:            m_auiEvent = uiData; uiData = NOT_STARTED; break;
             case TYPE_EVENT_TIMER:      m_auiEventTimer = uiData; uiData = NOT_STARTED; break;
        }

        if (uiData == DONE)
        {
            OUT_SAVE_INST_DATA;

            std::ostringstream saveStream;

            for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
                saveStream << m_auiEncounter[i] << " ";

            strSaveData = saveStream.str();

            SaveToDB();
            OUT_SAVE_INST_DATA_COMPLETE;
        }
    }
示例#15
0
void instance_ulduar::Update(uint32 diff)
{
	if(checkPlayer_Timer <= diff)
	{
		if(!CheckPlayersInMap())
		{
			CloseDoor(XTDoorGUID);
			CloseDoor(IronCouncilDoorGUID);
			if(GetData(TYPE_ASSEMBLY == DONE))
				OpenDoor(IronCouncilArchivumGUID);
			else
				CloseDoor(IronCouncilArchivumGUID);

			CloseDoor(KologarnDoorGUID);
			CloseDoor(HodirDoorGUID);

			if(!(GetData(TYPE_HODIR) == DONE))
			{
				CloseDoor(HodirExitDoor1GUID);
				CloseDoor(HodirExitDoor2GUID);
			}
			else
			{
				OpenDoor(HodirExitDoor1GUID);
				OpenDoor(HodirExitDoor2GUID);
			}

			if(!(GetData(TYPE_THORIM) == DONE))
				CloseDoor(ThorimDoorGUID);
			else
				OpenDoor(ThorimDoorGUID);

			if(!(GetData(TYPE_AURIAYA) == DONE))
				CloseDoor(AuriayaDoorGUID);
			else
				OpenDoor(AuriayaDoorGUID);

			if(!(GetData(TYPE_VEZAX) == DONE))
				CloseDoor(VezaxDoorGUID);
			else
				OpenDoor(VezaxDoorGUID);

			CloseDoor(YoggDoorGUID);
		}
		checkPlayer_Timer = 500;
	}
	else
		checkPlayer_Timer -= diff;

	if(IgnisAddTimedActivate > 0)
	{
		if(IgnisHFReset_Timer <= diff)
		{
			IgnisAddTimedActivate = 0;
		}
		else
			IgnisHFReset_Timer -= diff;
	}
}
    void SetData(uint32 uiType, uint32 uiData)
    {
        switch(uiType)
        {
            case TYPE_MARROWGAR:
                m_auiEncounter[TYPE_MARROWGAR] = uiData;
                if (uiData == DONE)
                {
                    OpenDoor(m_uiMarrowgarIce1GUID);
                    OpenDoor(m_uiMarrowgarIce2GUID);
					CloseDoor(m_uiMarrowgarDoorGUID);
                }
				else if(uiData == IN_PROGRESS)
					OpenDoor(m_uiMarrowgarDoorGUID);
                break;
            case TYPE_DEATHWHISPER:
                m_auiEncounter[TYPE_DEATHWHISPER] = uiData;
				if(uiData == DONE)
				{
					if(GameObject* go = GetGoInMap(m_uiDeathwhisperElevatorGUID))
						go->SetGoState(GO_STATE_ACTIVE);
				}
                break;
			case TYPE_BATTLE_OF_CANNONS:
				m_auiEncounter[TYPE_BATTLE_OF_CANNONS] = uiData;
				break;
            case TYPE_SAURFANG:
                m_auiEncounter[TYPE_SAURFANG] = uiData;
                if (uiData == DONE)
				{
                    OpenDoor(m_uiSaurfangDoorGUID);
					if(GameObject* pChest = instance->GetGameObject(m_uiSaurfangCacheGUID))
						if (!pChest->isSpawned())
						{
							pChest->SetRespawnTime(7*DAY);
							pChest->UpdateObjectVisibility();
						}
				}
                break;
			case TYPE_FESTERGUT:
				m_auiEncounter[TYPE_FESTERGUT] = uiData;
				if(uiData == DONE)
				{
					CloseDoor(m_uiFestergutDoorGUID);
					OpenDoor(m_uiOrangeTubeGUID);
					OpenDoor(m_uiOrangeDoorGUID);
				}
				else if(uiData == IN_PROGRESS)
					OpenDoor(m_uiFestergutDoorGUID);

				if(m_auiEncounter[TYPE_ROTFACE] == DONE && m_auiEncounter[TYPE_FESTERGUT] == DONE)
				{
					OpenDoor(m_uiBloodWingDoorGUID);
					OpenDoor(m_uiPrinceCouncilDoorGUID);
				}
				break;
			case TYPE_ROTFACE:
				m_auiEncounter[TYPE_ROTFACE] = uiData;
				if(uiData == DONE)
				{
					CloseDoor(m_uiRotfaceDoorGUID);
				}
				else if(uiData == IN_PROGRESS)
					OpenDoor(m_uiRotfaceDoorGUID);
				else if(uiData == FAIL)
					DespawnCreatures(rotfacePoolsGUIDs);

				if(m_auiEncounter[TYPE_ROTFACE] == DONE && m_auiEncounter[TYPE_FESTERGUT] == DONE)
				{
					OpenDoor(m_uiBloodWingDoorGUID);
					OpenDoor(m_uiPrinceCouncilDoorGUID);
				}
				break;
			case TYPE_PUTRICIDE:
				m_auiEncounter[TYPE_PUTRICIDE] = uiData;
				if(uiData == DONE)
				{
					OpenDoor(m_uiPutricideDoorGUID);
					OpenDoor(m_uiBloodWingDoorGUID);
					OpenDoor(m_uiPrinceCouncilDoorGUID);
					OpenDoor(m_uiPlagueSigilGUID);
				}
				else if(uiData == IN_PROGRESS)
					CloseDoor(m_uiPutricideDoorGUID);
				break;
			case TYPE_PRINCE_COUNCIL:
				m_auiEncounter[TYPE_PRINCE_COUNCIL] = uiData;
				if(uiData == DONE)
				{
					OpenDoor(m_uiPrinceCouncilDoorGUID);
					OpenDoor(m_uiLanathelDoorGUID_1);
					OpenDoor(m_uiLanathelDoorGUID_2);
					OpenDoor(m_uiBloodWingDoorGUID);
				}
				else if(uiData == IN_PROGRESS)
					CloseDoor(m_uiPrinceCouncilDoorGUID);
				else if(uiData == FAIL)
				{
					DespawnCreatures(vortexGUIDs);
					OpenDoor(m_uiPrinceCouncilDoorGUID);
				}
				break;
			case TYPE_LANATHEL:
				m_auiEncounter[TYPE_LANATHEL] = uiData;
				if(uiData == FAIL || uiData == DONE)
				{
					OpenDoor(m_uiLanathelDoorGUID_1);
					OpenDoor(m_uiLanathelDoorGUID_2);
					OpenDoor(m_uiPrinceCouncilDoorGUID);
					OpenDoor(m_uiBloodWingDoorGUID);
					OpenDoor(m_uiSaurfangDoorGUID);
				}
				if(uiData == DONE)
				{
					OpenDoor(m_uiFrostWingDoorGUID);
					OpenDoor(m_uiDreamWalkerDoorGUID);
					OpenDoor(m_uiBloodSigilGUID);
				}
				else if(uiData == IN_PROGRESS)
				{
					CloseDoor(m_uiLanathelDoorGUID_1);
					CloseDoor(m_uiLanathelDoorGUID_2);
				}
				break;
			case TYPE_DREAMWALKER:
				m_auiEncounter[TYPE_DREAMWALKER] = uiData;
				if(uiData == DONE)
				{
					OpenDoor(m_uiDreamWalkerDoorGUID);
					OpenDoor(m_uiDreamWalkerExitDoorGUID);
					OpenDoor(m_uiSindragosaDoorGUID);
					DespawnCreatures(dreamwalkerAddsGUIDs);
				}
				else if(uiData == IN_PROGRESS)
				{
					CloseDoor(m_uiDreamWalkerDoorGUID);
					OpenDoor(m_uiDreamwalkerEventDoorGUID[0]);
					OpenDoor(m_uiDreamwalkerEventDoorGUID[3]);
					switch(instance->GetDifficulty())
					{
						case RAID_DIFFICULTY_25MAN_NORMAL:
						case RAID_DIFFICULTY_25MAN_HEROIC:
							OpenDoor(m_uiDreamwalkerEventDoorGUID[1]);
							OpenDoor(m_uiDreamwalkerEventDoorGUID[2]);
							break;
					}
				}
				else
				{
					DespawnCreatures(dreamwalkerAddsGUIDs);
					CloseDoor(m_uiDreamwalkerEventDoorGUID[0]);
					CloseDoor(m_uiDreamwalkerEventDoorGUID[1]);
					CloseDoor(m_uiDreamwalkerEventDoorGUID[2]);
					CloseDoor(m_uiDreamwalkerEventDoorGUID[3]);
					if(uiData == FAIL)
					{
						m_uiDreamwalkerGuardDone = 0;
						for(std::vector<uint64>::iterator itr = dreamwalkerEventAddGUIDs.begin(); itr != dreamwalkerEventAddGUIDs.end(); ++itr)
							if(Creature* add = GetCreatureInMap(*itr))
								add->Respawn();
					}
				}
				break;
			case TYPE_SINDRAGOSA:
				m_auiEncounter[TYPE_SINDRAGOSA] = uiData;
				if(uiData == DONE)
				{
					OpenDoor(m_uiSindragosaDoorGUID);
					OpenDoor(m_uiFrostSigilGUID);
				}
				else if(uiData == IN_PROGRESS)
					CloseDoor(m_uiSindragosaDoorGUID);
				else
					OpenDoor(m_uiSindragosaDoorGUID);
				break;
			case TYPE_LICHKING:
				m_auiEncounter[TYPE_LICHKING] = uiData;
				break;
			case DATA_DW_DOOR_1:
				if(uiData == 0)
					CloseDoor(m_uiDreamwalkerEventDoorGUID[0]);
				else
					OpenDoor(m_uiDreamwalkerEventDoorGUID[0]);
				break;
			case DATA_DW_DOOR_2:
				if(uiData == 0)
					CloseDoor(m_uiDreamwalkerEventDoorGUID[1]);
				else
					OpenDoor(m_uiDreamwalkerEventDoorGUID[1]);
				break;
			case DATA_DW_DOOR_3:
				if(uiData == 0)
					CloseDoor(m_uiDreamwalkerEventDoorGUID[2]);
				else
					OpenDoor(m_uiDreamwalkerEventDoorGUID[2]);
				break;
			case DATA_DW_DOOR_4:
				if(uiData == 0)
					CloseDoor(m_uiDreamwalkerEventDoorGUID[2]);
				else
					OpenDoor(m_uiDreamwalkerEventDoorGUID[2]);
				break;
			case DATA_DREAMWALKER_GUARD:
				m_uiDreamwalkerGuardDone++;
				break;
        }

        if (uiData == DONE)
        {
            OUT_SAVE_INST_DATA;

            std::ostringstream saveStream;
            saveStream << m_auiEncounter[TYPE_MARROWGAR] << " " << m_auiEncounter[TYPE_DEATHWHISPER] << " " << m_auiEncounter[TYPE_BATTLE_OF_CANNONS] << " " << m_auiEncounter[TYPE_SAURFANG];
			saveStream << m_auiEncounter[TYPE_FESTERGUT] << " " << m_auiEncounter[TYPE_ROTFACE] << " " << m_auiEncounter[TYPE_PUTRICIDE] << " " << m_auiEncounter[TYPE_PRINCE_COUNCIL];
			saveStream << m_auiEncounter[TYPE_LANATHEL] << " " << m_auiEncounter[TYPE_DREAMWALKER] << " " << m_auiEncounter[TYPE_SINDRAGOSA] << " " << m_auiEncounter[TYPE_LICHKING];

            strInstData = saveStream.str();

            SaveToDB();
            OUT_SAVE_INST_DATA_COMPLETE;
        }
    }
    void OnObjectCreate(GameObject* pGo)
    {
        switch(pGo->GetEntry())
        {
            case GO_MARROWGAR_ICE_1:
                m_uiMarrowgarIce1GUID = pGo->GetGUID();
                if (m_auiEncounter[0] == DONE)
                    pGo->SetGoState(GO_STATE_ACTIVE);
                break;
            case GO_MARROWGAR_ICE_2:
                m_uiMarrowgarIce2GUID = pGo->GetGUID();
                if (m_auiEncounter[0] == DONE)
                    pGo->SetGoState(GO_STATE_ACTIVE);
                break;
            case GO_DEATHWHISPER_GATE:
                m_uiDeathwhisperGateGUID = pGo->GetGUID();
                break;
            case GO_DEATHWHISPER_ELEVATOR:
                m_uiDeathwhisperElevatorGUID = pGo->GetGUID();
				if (m_auiEncounter[TYPE_DEATHWHISPER] == DONE)
                    pGo->SetGoState(GO_STATE_ACTIVE);
                break;
            case GO_SAURFANG_DOOR:
                m_uiSaurfangDoorGUID = pGo->GetGUID();
                if(m_auiEncounter[TYPE_SAURFANG] == DONE)
                    pGo->SetGoState(GO_STATE_ACTIVE);
                break;
			case GO_MARROWGAR_DOOR:
				m_uiMarrowgarDoorGUID = pGo->GetGUID();
				break;
			case GO_FESTERGUT_DOOR:
				m_uiFestergutDoorGUID = pGo->GetGUID();
				CloseDoor(m_uiFestergutDoorGUID);
				break;
			case GO_ROTFACE_DOOR:
				m_uiRotfaceDoorGUID = pGo->GetGUID();
				CloseDoor(m_uiRotfaceDoorGUID);
				break;
			case GO_PUTRICIDE_DOOR:
				m_uiPutricideDoorGUID = pGo->GetGUID();
				OpenDoor(m_uiPutricideDoorGUID);
				break;
			case GO_BLOODWING_DOOR:
				m_uiBloodWingDoorGUID = pGo->GetGUID();
				if (m_auiEncounter[TYPE_PUTRICIDE] == DONE || m_auiEncounter[TYPE_ROTFACE] == DONE && m_auiEncounter[TYPE_FESTERGUT] == DONE)
					OpenDoor(m_uiBloodWingDoorGUID);
				break;
			case GO_PRINCECOUNCIL_DOOR:
				m_uiPrinceCouncilDoorGUID = pGo->GetGUID();
				OpenDoor(m_uiPrinceCouncilDoorGUID);
				break;
			case GO_LANATHEL_DOOR_1:
				m_uiLanathelDoorGUID_1 = pGo->GetGUID();
				if (m_auiEncounter[TYPE_PRINCE_COUNCIL] == DONE)
                    OpenDoor(m_uiLanathelDoorGUID_1);
				break;
			case GO_LANATHEL_DOOR_2:
				m_uiLanathelDoorGUID_2 = pGo->GetGUID();
				if (m_auiEncounter[TYPE_PRINCE_COUNCIL] == DONE)
                    OpenDoor(m_uiLanathelDoorGUID_2);
				break;
			case GO_FROSTWING_DOOR:
				m_uiFrostWingDoorGUID = pGo->GetGUID();
				if (m_auiEncounter[TYPE_LANATHEL] == DONE)
                    OpenDoor(m_uiFrostWingDoorGUID);
				break;
			case GO_DREAMWALKER_DOOR:
				m_uiDreamWalkerDoorGUID = pGo->GetGUID();
				if (m_auiEncounter[TYPE_LANATHEL] == DONE)
                    OpenDoor(m_uiDreamWalkerDoorGUID);
				break;
			case GO_DREAMWALKER_EXIT_DOOR:
				m_uiDreamWalkerExitDoorGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_DREAMWALKER] == DONE)
                    OpenDoor(m_uiDreamWalkerExitDoorGUID);
				break;
			case GO_SINDRAGOSA_DOOR:
				m_uiSindragosaDoorGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_DREAMWALKER] == DONE)
                    OpenDoor(m_uiSindragosaDoorGUID);
				break;
			case GO_PLAGUE_SIGIL:
				m_uiPlagueSigilGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_PUTRICIDE] == DONE)
                    OpenDoor(m_uiPlagueSigilGUID);
				break;
			case GO_BLOOD_SIGIL:
				m_uiBloodSigilGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_LANATHEL] == DONE)
                    OpenDoor(m_uiBloodSigilGUID);
				break;
			case GO_FROST_SIGIL:
				m_uiFrostSigilGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_SINDRAGOSA] == DONE)
                    OpenDoor(m_uiFrostSigilGUID);
				break;
			case GO_PLAGUE_ORANGE_TUBE:
				m_uiOrangeTubeGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_FESTERGUT] == DONE)
                    OpenDoor(m_uiOrangeTubeGUID);
				break;
			case GO_PLAGUE_ORANGE_DOOR:
				m_uiOrangeDoorGUID = pGo->GetGUID();
				if(m_auiEncounter[TYPE_FESTERGUT] == DONE)
                    OpenDoor(m_uiOrangeDoorGUID);
				break;
			case GO_SAURFANG_CACHE_10:
				m_uiSaurfangCacheGUID = pGo->GetGUID();
				break;
            case GO_SAURFANG_CACHE_25:
				m_uiSaurfangCacheGUID = pGo->GetGUID();
				break;
            case GO_SAURFANG_CACHE_10_H:
				m_uiSaurfangCacheGUID = pGo->GetGUID();
				break;
            case GO_SAURFANG_CACHE_25_H:
				m_uiSaurfangCacheGUID = pGo->GetGUID();
				break;
			case GO_DREAMWALKER_EVENT_DOOR_1:
				m_uiDreamwalkerEventDoorGUID[0] = pGo->GetGUID();
				break;
			case GO_DREAMWALKER_EVENT_DOOR_2:
				m_uiDreamwalkerEventDoorGUID[1] = pGo->GetGUID();
				break;
			case GO_DREAMWALKER_EVENT_DOOR_3:
				m_uiDreamwalkerEventDoorGUID[2] = pGo->GetGUID();
				break;
			case GO_DREAMWALKER_EVENT_DOOR_4:
				m_uiDreamwalkerEventDoorGUID[3] = pGo->GetGUID();
				break;
        }
    }
        void OnGameObjectCreate(GameObject* go)
        {
            // TODO: init state depending on encounters
            switch (go->GetEntry())
            {
                case GO_FROSTMOURNE:
                    Frostmourne = go->GetGUID();
                    go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
                    HandleGameObject(0, false, go);
                    break;
                case GO_FROSTMOURNE_ALTAR:
                    go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
                    HandleGameObject(0, true, go);
                    break;
                case GO_FRONT_DOOR:
                    FrontDoor = go->GetGUID();
                    go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
                    OpenDoor(FrontDoor);
                    break;
                case GO_FROSTWORN_DOOR:
                    FrostwornDoor = go->GetGUID();
                    go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);

                    if (Encounter[1] == DONE)
                        OpenDoor(FrostwornDoor);
                    else
                        CloseDoor(FrostwornDoor);
                    break;
                case GO_RUN_DOOR:
                    RunDoor = go->GetGUID();
                    break;
                case GO_ARTHAS_DOOR:
                    ArthasDoor = go->GetGUID();
                    break;
                case GO_ICE_WALL_1:
                    WallID[0] = go->GetGUID();
                    break;
                case GO_ICE_WALL_2:
                    WallID[1] = go->GetGUID();
                    break;
                case GO_ICE_WALL_3:
                    WallID[2] = go->GetGUID();
                    break;
                case GO_ICE_WALL_4:
                    WallID[3] = go->GetGUID();
                    break;
                case GO_CAVE:
                    CaveDoor = go->GetGUID();
                    break;
                case GO_CAPTAIN_CHEST_1:
                    go->SetPhaseMask(2, true);
                    if (!instance->IsHeroic() && TeamInInstance == HORDE)
                        Chest = go->GetGUID();
                    break;
                case GO_CAPTAIN_CHEST_3:
                    go->SetPhaseMask(2, true);
                    if (instance->IsHeroic() && TeamInInstance == HORDE)
                        Chest = go->GetGUID();
                    break;
                case GO_CAPTAIN_CHEST_2:
                    go->SetPhaseMask(2, true);
                    if (!instance->IsHeroic() && TeamInInstance == ALLIANCE)
                        Chest = go->GetGUID();
                    break;
                case GO_CAPTAIN_CHEST_4:
                    go->SetPhaseMask(2, true);
                    if (instance->IsHeroic() && TeamInInstance == ALLIANCE)
                        Chest = go->GetGUID();
                    break;
                case GO_SKYBREAKER:
                    go->SetPhaseMask(2, true);
                    if (TeamInInstance == ALLIANCE)
                        Gunship = go->GetGUID();
                    break;
                case GO_ORGRIM_HAMMER:
                    go->SetPhaseMask(2, true);
                    if (TeamInInstance == HORDE)
                        Gunship = go->GetGUID();
                    break;
                case GO_PORTAL:
                    go->SetPhaseMask(2, true);
                    uiPortal = go->GetGUID();
                    break;
            }
        }
        void SetData(uint32 uiType, uint32 uiData)
        {
            switch(uiType)
            {
                case TYPE_EVENT: m_auiEncounter[uiType] = uiData; uiData = NOT_STARTED; 
                    break;
                case TYPE_RAGEFIRE: m_auiEncounter[uiType] = uiData;
                    OpenAllDoors();
                    break;
                case TYPE_BALTHARUS: m_auiEncounter[uiType] = uiData;
                    OpenAllDoors();
                    break;
                case TYPE_XERESTRASZA: m_auiEncounter[uiType] = uiData;
                    if (uiData == IN_PROGRESS)
                        OpenDoor(m_uiFireFieldGUID);
                    else if (uiData == NOT_STARTED)
                    {
                        CloseDoor(m_uiFireFieldGUID);
                        OpenAllDoors();
                    }
                    else if (uiData == DONE)
                    {
                        OpenAllDoors();
                        if (m_auiEncounter[TYPE_ZARITHRIAN] == DONE)
                        {
                            m_auiEncounter[TYPE_EVENT] = 200;
                            m_auiEventTimer = 30000;
                        };
                    }
                    break;
                case TYPE_ZARITHRIAN: m_auiEncounter[uiType] = uiData;
                    if (uiData == DONE)
                    {
                        OpenDoor(m_uiFlameWallsGUID);
                        m_auiEncounter[TYPE_EVENT] = 200;
                        m_auiEventTimer = 30000;
                    }
                    else if (uiData == IN_PROGRESS)
                        CloseDoor(m_uiFlameWallsGUID);
                    else if (uiData == FAIL)
                        OpenDoor(m_uiFlameWallsGUID);
                        break;
                case TYPE_HALION: m_auiEncounter[uiType] = uiData;
                    if (uiData == IN_PROGRESS)
                    {
                        CloseDoor(m_uiFlameRingGUID);
                    }
                    else
                    {
                        OpenDoor(m_uiFlameRingGUID);
                    }
                    break;
                case TYPE_HALION_EVENT: m_auiHalionEvent = uiData; uiData = NOT_STARTED; break;
                case TYPE_EVENT_TIMER: m_auiEventTimer = uiData; uiData = NOT_STARTED; break;
                case DATA_ORB_DIRECTION: m_auiOrbDirection = uiData; uiData = NOT_STARTED; break;
                case DATA_ORB_N: m_auiOrbNState = uiData; uiData = NOT_STARTED; break;
                case DATA_ORB_S: m_auiOrbSState = uiData; uiData = NOT_STARTED; break;
                case TYPE_COUNTER:
                    if (uiData == COUNTER_OFF)
                    {
                        UpdateWorldState(false,0);
                    }
                    else 
                    {
                        UpdateWorldState(true,uiData);
                    }
                    uiData = NOT_STARTED;
                    break;
            }

            if (uiData == DONE)
            {
                OUT_SAVE_INST_DATA;
                std::ostringstream saveStream;
                for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
                    saveStream << m_auiEncounter[i] << " ";

                strSaveData = saveStream.str();
                SaveToDB();
                OUT_SAVE_INST_DATA_COMPLETE;
            }
        }
示例#20
0
/*-------------------------------------------------------------------
    Procedure   :       Close BGObject Door
    Input       :       uint8 * Data
    Output      :       nothing
-------------------------------------------------------------------*/
void EVENT_CloseDoor( uint8 * Data )
{
    CloseDoor( (uint16) *Data );
}
        void SetData(uint32 uiType, uint32 uiData)
        {
            switch(uiType)
            {
                case TYPE_JARAXXUS:
                    if (uiData == DONE) m_uiEvent = 2000;
                    break;
                case TYPE_CRUSADERS:
                    switch (uiData)
                    {
                        case IN_PROGRESS: m_uiResilienceWillFixItTimer = 0; break;
                        case SPECIAL: //Means the first blood
                            m_uiResilienceWillFixItTimer = 60*IN_MILLISECONDS;
                            uiData = IN_PROGRESS;
                            break;
                        case DONE:
                            DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
                            if (m_uiResilienceWillFixItTimer > 0)
                                DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
                            if (GameObject* pChest = instance->GetGameObject(m_uiCrusadersCacheGUID))
                                if (pChest && !pChest->isSpawned())
                                    pChest->SetRespawnTime(7*DAY);
                            m_uiEvent = 3100;
                            break;
                    }
                    break;
                case TYPE_VALKIRIES:
                    switch (uiData)
                    {
                        case FAIL:
                            if (m_auiEncounter[TYPE_VALKIRIES] == NOT_STARTED) uiData = NOT_STARTED;
                            break;
                        case SPECIAL:
                            if (m_auiEncounter[TYPE_VALKIRIES] == SPECIAL) uiData = DONE;
                            break;
                        case DONE:
                            if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE)
                                m_uiEvent = 4020;
                            else
                                m_uiEvent = 4030;
                            break;
                    }
                    break;
                case TYPE_ANUBARAK:
                    switch (uiData)
                    {
                        case DONE:
                            m_uiEvent = 6000;
                            break;
                        case SPECIAL:
                            uint32 tributeChest = 0;
                            if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
                            {
                                if (m_uiTrialCounter >= 50)
                                    tributeChest = GO_TRIBUTE_CHEST_10H_99;
                                else
                                    if (m_uiTrialCounter >= 45)
                                        tributeChest = GO_TRIBUTE_CHEST_10H_50;
                                    else
                                        if (m_uiTrialCounter >= 25)
                                            tributeChest = GO_TRIBUTE_CHEST_10H_45;
                                        else
                                            tributeChest = GO_TRIBUTE_CHEST_10H_25;
                            }
                            else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC)
                            {
                                if (m_uiTrialCounter >= 50)
                                    tributeChest = GO_TRIBUTE_CHEST_25H_99;
                                else
                                    if (m_uiTrialCounter >= 45)
                                        tributeChest = GO_TRIBUTE_CHEST_25H_50;
                                    else
                                        if (m_uiTrialCounter >= 25)
                                            tributeChest = GO_TRIBUTE_CHEST_25H_45;
                                        else
                                            tributeChest = GO_TRIBUTE_CHEST_25H_25;
                            }
                            if (tributeChest)
                                if (Creature* pTirion =  instance->GetCreature(m_uiTirionGUID))
                                    if (GameObject* pChest = pTirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, 90000000))
                                        pChest->SetRespawnTime(pChest->GetRespawnDelay());
                            break;
                    }
                    break;
                case TYPE_COUNTER:   m_uiTrialCounter = uiData; uiData = DONE; break;
                case TYPE_EVENT:     m_uiEvent = uiData; uiData = NOT_STARTED; break;
                case TYPE_EVENT_TIMER:      m_uiEventTimer = uiData; uiData = NOT_STARTED; break;
                case TYPE_NORTHREND_BEASTS:
                    m_uiNorthrendBeasts = uiData;
                    switch (uiData)
                    {
                        case GORMOK_DONE:
                            m_uiEvent = 200;
                            SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS);
                            SetData(TYPE_BEASTS, IN_PROGRESS);
                            break;
                        case SNAKES_IN_PROGRESS: m_uiNotOneButTwoJormungarsTimer = 0; break;
                        case SNAKES_SPECIAL: m_uiNotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS; break;
                        case SNAKES_DONE:
                            if (m_uiNotOneButTwoJormungarsTimer > 0)
                                DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS);
                            m_uiEvent = 300;
                            SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS);
                            SetData(TYPE_BEASTS, IN_PROGRESS);
                            break;
                        case ICEHOWL_DONE:
                            m_uiEvent = 400;
                            SetData(TYPE_NORTHREND_BEASTS, DONE);
                            SetData(TYPE_BEASTS, DONE);
                            break;
                        case FAIL:
                            SetData(TYPE_BEASTS, FAIL);
                            break;
                    }
                    break;
                case DATA_HEALTH_TWIN_SHARED:     m_uiDataDamageTwin = uiData; uiData = NOT_STARTED; break;

                //Achievements
                case DATA_SNOBOLD_COUNT:
                    if (uiData == INCREASE)
                        ++m_uiSnoboldCount;
                    else if (uiData == DECREASE)
                        --m_uiSnoboldCount;
                    break;
                case DATA_MISTRESS_OF_PAIN_COUNT:
                    if (uiData == INCREASE)
                        ++m_uiMistressOfPainCount;
                    else if (uiData == DECREASE)
                        --m_uiMistressOfPainCount;
                    break;
                case DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE:
                    m_bTributeToImmortalityElegible = false;
                    break;
            }
            if (IsEncounterInProgress())
            {
                CloseDoor(GetData64(GO_EAST_PORTCULLIS));
                CloseDoor(GetData64(GO_WEB_DOOR));
            } else {
                OpenDoor(GetData64(GO_EAST_PORTCULLIS));
                OpenDoor(GetData64(GO_WEB_DOOR));
            }

            if (uiType < MAX_ENCOUNTERS)
            {
                sLog->outBasic("[ToCr] m_auiEncounter[uiType %u] %u = uiData %u;", uiType, m_auiEncounter[uiType], uiData);
                if (uiData == FAIL)
                {
                    if (IsRaidWiped())
                    {
                        --m_uiTrialCounter;
                        m_bNeedSave = true;
                        m_uiEvent = (uiType == TYPE_BEASTS? 666 : 0);
                    }
                    uiData = NOT_STARTED;
                }
                m_auiEncounter[uiType] = uiData;

                if (uiData == DONE || m_bNeedSave == true)
                {
                    if (Unit* pAnnouncer = instance->GetCreature(GetData64(NPC_BARRENT)))
                        pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                    Save();
                }
            }
        }
示例#22
0
void instance_ulduar::SetData(uint32 uiType, uint32 uiData)
{
    switch(uiType)
    {
    case TYPE_LEVIATHAN:
        m_auiEncounter[0] = uiData;
        DoUseDoorOrButton(m_uiShieldWallGUID);
        if (uiData == DONE)
            OpenDoor(m_uiLeviathanGateGUID);
        break;
    case TYPE_IGNIS:
        m_auiEncounter[1] = uiData;
        break;
    case TYPE_RAZORSCALE:
        m_auiEncounter[2] = uiData;
        break;
    case TYPE_XT002:
        m_auiEncounter[3] = uiData;
        if (uiData == DONE || uiData == FAIL)
            OpenDoor(m_uiXT002GateGUID);
        else if (uiData == IN_PROGRESS)
            CloseDoor(m_uiXT002GateGUID);
        break;
    case TYPE_ASSEMBLY:
        m_auiEncounter[4] = uiData;
        if (uiData == DONE)
        {
            OpenDoor(m_uiIronCouncilDoorGUID);
            OpenDoor(m_uiArchivumDoorGUID);
            OpenDoor(m_uiShatteredHallsDoorGUID);
        }
        else if (uiData == IN_PROGRESS)
            CloseDoor(m_uiIronCouncilDoorGUID);
        else if (uiData == FAIL)
            OpenDoor(m_uiIronCouncilDoorGUID);
        break;
    case TYPE_KOLOGARN:
        m_auiEncounter[5] = uiData;
        if (uiData == DONE)
        {
            DoRespawnGameObject(m_uiKologarnLootGUID, 30*MINUTE);
            if (GameObject* pGo = instance->GetGameObject(m_uiKologarnBridgeGUID))
            {
                pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                pGo->SetGoState(GO_STATE_READY);
            }
        }
        break;
    case TYPE_AURIAYA:
        m_auiEncounter[6] = uiData;
        if (uiData == DONE)
        {
            if (GameObject* pGO = instance->GetGameObject(m_uiMimironTramGUID))
            {
                pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                pGO->SetGoState(GO_STATE_READY);
            }
        }
        break;

        // Keepers
    case TYPE_MIMIRON:
        m_auiEncounter[7] = uiData;
        DoUseDoorOrButton(m_uiMimironDoor1GUID);
        DoUseDoorOrButton(m_uiMimironDoor2GUID);
        DoUseDoorOrButton(m_uiMimironDoor3GUID);
        if (uiData == DONE)
        {
            if(m_auiHardBoss[3] != DONE)
                DoRespawnGameObject(m_uiMimironLootGUID, 30*MINUTE);
            // used to make the friendly keeper visible
            if(Creature* pImage = instance->GetCreature(m_uiMimironImageGUID))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        break;
    case TYPE_HODIR:
        m_auiEncounter[8] = uiData;
        if (uiData == DONE)
        {
            OpenDoor(m_uiHodirEnterDoorGUID);
            DoUseDoorOrButton(m_uiHodirWallGUID);
            DoUseDoorOrButton(m_uiHodirExitDoorGUID);
            DoRespawnGameObject(m_uiHodirLootGUID, 30*MINUTE);

            // used to make the friendly keeper visible
            if(Creature* pImage = instance->GetCreature(m_uiHodirImageGUID))
                pImage->SetVisibility(VISIBILITY_ON);

            DoOpenMadnessDoorIfCan();
        }
        else if (uiData == IN_PROGRESS)
            CloseDoor(m_uiHodirEnterDoorGUID);
        else if (uiData == FAIL)
            OpenDoor(m_uiHodirEnterDoorGUID);
        break;
    case TYPE_THORIM:
        m_auiEncounter[9] = uiData;
        DoUseDoorOrButton(m_uiArenaEnterDoorGUID);
        if (uiData == IN_PROGRESS)
            DoUseDoorOrButton(m_uiArenaExitDoorGUID);
        if (uiData == DONE)
        {
            if(m_auiHardBoss[5] != DONE)
                DoRespawnGameObject(m_uiThorimLootGUID, 30*MINUTE);
            // used to make the friendly keeper visible
            if(Creature* pImage = instance->GetCreature(m_uiThorimImageGUID))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        break;
    case TYPE_FREYA:
        m_auiEncounter[10] = uiData;
        if (uiData == DONE)
        {
            // do this in order to see how many elders were alive and spawn the correct chest
            // hard mode drop
            if(m_auiHardBoss[6] == 3)
                DoRespawnGameObject(m_uiFreyaLootHardGUID, 30*MINUTE);
            // normal mode
            else
                DoRespawnGameObject(m_uiFreyaLootGUID, 30*MINUTE);
            // used to make the friendly keeper visible
            if(Creature* pImage = instance->GetCreature(m_uiFreyaImageGUID))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        break;
    // 1 elder up +1 emblem drops
    case TYPE_FREYA_1:
        m_auiFreyaElders[1] = uiData;
        break;
    // 2 elders up +2 emblems drop
    case TYPE_FREYA_2:
        m_auiFreyaElders[2] = uiData;
        break;
    // 3 elders up is TYPE_FREYA_HARD

        // Prison
    case TYPE_VEZAX:
        m_auiEncounter[11] = uiData;
        if (uiData == DONE)
            DoUseDoorOrButton(m_uiVezaxGateGUID);
        break;
    case TYPE_YOGGSARON:
        m_auiEncounter[12] = uiData;
        DoUseDoorOrButton(m_uiYoggGateGUID);
        break;

        // Celestial Planetarium
    case TYPE_ALGALON:
        m_auiEncounter[13] = uiData;
        DoUseDoorOrButton(m_uiCelestialDoorGUID);
        DoUseDoorOrButton(m_uiUniverseFloorCelestialGUID);
        if (uiData == DONE)
            DoRespawnGameObject(m_uiAlagonLootGUID, 30*MINUTE);
        break;

        // Hard modes
    case TYPE_LEVIATHAN_HARD:
        m_auiHardBoss[0] = uiData;
        break;
    case TYPE_XT002_HARD:
        m_auiHardBoss[1] = uiData;
        break;
    case TYPE_HODIR_HARD:
        m_auiHardBoss[4] = uiData;
        if(uiData == DONE)
            DoRespawnGameObject(m_uiHodirRareLootGUID, 30*MINUTE);
        break;
    case TYPE_ASSEMBLY_HARD:
        m_auiHardBoss[2] = uiData;
        break;
    case TYPE_FREYA_HARD:
        m_auiHardBoss[6] = uiData;
        break;
    case TYPE_THORIM_HARD:
        m_auiHardBoss[5] = uiData;
        if(uiData == DONE)
            DoRespawnGameObject(m_uiThorimRareLootGUID, 30*MINUTE);
        break;
    case TYPE_MIMIRON_HARD:
        m_auiHardBoss[3] = uiData;
        if(uiData == DONE)
            DoRespawnGameObject(m_uiMimironHardLootGUID, 30*MINUTE);
        break;
    case TYPE_VEZAX_HARD:
        m_auiHardBoss[7] = uiData;
        break;
    case TYPE_YOGGSARON_HARD:
        m_auiHardBoss[8] = uiData;
        break;

        // Ulduar keepers
    case TYPE_KEEPER_HODIR:
        m_auiUlduarKeepers[0] = uiData;
        break;
    case TYPE_KEEPER_THORIM:
        m_auiUlduarKeepers[1] = uiData;
        break;
    case TYPE_KEEPER_FREYA:
        m_auiUlduarKeepers[2] = uiData;
        break;
    case TYPE_KEEPER_MIMIRON:
        m_auiUlduarKeepers[3] = uiData;
        break;

        // teleporters
    case TYPE_LEVIATHAN_TP:
        m_auiUlduarTeleporters[0] = uiData;
        break;
    case TYPE_XT002_TP:
        m_auiUlduarTeleporters[1] = uiData;
        break;
    case TYPE_MIMIRON_TP:
        m_auiUlduarTeleporters[2] = uiData;
        break;

        // mini boss
    case TYPE_RUNIC_COLOSSUS:
        m_auiMiniBoss[0] = uiData;
        if (uiData == DONE)
            OpenDoor(m_uiHallwayDoorGUID);
        else
            CloseDoor(m_uiHallwayDoorGUID);
        break;
    case TYPE_RUNE_GIANT:
        m_auiMiniBoss[1] = uiData;
        if (uiData == DONE)
            OpenDoor(m_uiThorimEnterDoorGUID);
        else
            CloseDoor(m_uiThorimEnterDoorGUID);
        break;
    case TYPE_LEVIATHAN_MK:
        m_auiMiniBoss[2] = uiData;
        break;
    case TYPE_VX001:
        m_auiMiniBoss[3] = uiData;
        if (uiData == DONE)     // just for animation :)
        {
            for(uint8 i = 0; i < 9; i++)
                DoUseDoorOrButton(m_uiMimironTelGUID[i]);
        }
        break;
    case TYPE_AERIAL_UNIT:
        m_auiMiniBoss[4] = uiData;
        break;
    case TYPE_YOGG_BRAIN:
        m_auiMiniBoss[5] = uiData;
        break;

        //phases
    case TYPE_MIMIRON_PHASE:
        m_uiMimironPhase = uiData;
        break;
    case TYPE_YOGG_PHASE:
        m_uiYoggPhase = uiData;
        break;
    case TYPE_VISION_PHASE:
        m_uiVisionPhase = uiData;
        break;

    // achievements
    case TYPE_ACHI_QUICK_SHAVE:
        m_bQuickShave = (uiData == DONE);
        break;
    case TYPE_ACHI_SHATTERED:
        m_bShattered = (uiData == DONE);
        break;
    case TYPE_ACHI_NERF_ENGI:
        m_bNerfEngi = (uiData == DONE);
        break;
    case TYPE_ACHI_NERF_GRAVITY:
        m_bNerfGravity = (uiData == DONE);
        break;
    case TYPE_ACHI_CHOOSE_MOLG:
        m_bChooseMolg = (uiData == DONE);
        break;
    case TYPE_ACHI_CHOOSE_BRUN:
        m_bChooseBrun = (uiData == DONE);
        break;
    case TYPE_ACHI_CHOOSE_STEEL:
        m_bChooseSteel = (uiData == DONE);
        break;
    case TYPE_ACHI_CANT_DO_THAT:
        m_bCantDoThat = (uiData == DONE);
        break;
    case TYPE_ACHI_OPEN_ARMS:
        m_bOpenArms = (uiData == DONE);
        break;
    case TYPE_ACHI_IF_LOOKS:
        m_bIfLooks = (uiData == DONE);
        break;
    case TYPE_ACHI_RUBBLE_ROLL:
        m_bRubbleRoll = (uiData == DONE);
        break;
    case TYPE_ACHI_CAT_LADY:
        m_bCatLady = (uiData == DONE);
        break;
    case TYPE_ACHI_NINE_LIVES:
        m_bNineLives = (uiData == DONE);
        break;
    }

    if (uiData == DONE || uiData == FAIL)
    {
        OUT_SAVE_INST_DATA;

        // save all encounters, hard bosses and keepers
        std::ostringstream saveStream;
        saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
            << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " "
            << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " "
            << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11] << " "
            << m_auiEncounter[12] << " " << m_auiEncounter[13] << " " << m_auiHardBoss[0] << " "
            << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " "
            << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " "
            << m_auiHardBoss[7] << " " << m_auiHardBoss[8] << " " << m_auiUlduarKeepers[0] << " "
            << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " "
            << m_auiUlduarTeleporters[0] << " " << m_auiUlduarTeleporters[1] << " " << m_auiUlduarTeleporters[2];

        m_strInstData = saveStream.str();

        SaveToDB();
        OUT_SAVE_INST_DATA_COMPLETE;
    }
}
示例#23
0
void instance_ulduar::SetData(uint32 uiType, uint32 uiData)
{
    switch(uiType)
    {
    case TYPE_LEVIATHAN:
        m_auiEncounter[uiType] = uiData;
        DoUseDoorOrButton(GO_SHIELD_WALL);
        if (uiData == DONE)
            OpenDoor(GO_LEVIATHAN_GATE);
        break;
    case TYPE_IGNIS:
        m_auiEncounter[uiType] = uiData;
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_SHATTERED, false);
            DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_IGNIS_ID);
        }
        // Add respawn and kill
        if (uiData == FAIL)
        {
            for (GUIDList::iterator itr = m_lIronConstructsGuids.begin(); itr != m_lIronConstructsGuids.end(); ++itr)
            {
                if (Creature *pAdd = instance->GetCreature(*itr))
                    if (!pAdd->isAlive())
                        pAdd->Respawn();
            }
        }
        if (uiData == DONE)
        {
            for (GUIDList::iterator itr = m_lIronConstructsGuids.begin(); itr != m_lIronConstructsGuids.end(); ++itr)
            {
                if (Creature *pAdd = instance->GetCreature(*itr))
                    if (pAdd->isAlive())
                        pAdd->DealDamage(pAdd, pAdd->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
            }
        }
        break;
    case TYPE_RAZORSCALE:
        m_auiEncounter[uiType] = uiData;
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_QUICK_SHAVE, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_IRON_DWARF_MEDIUM_RARE, false);
        }
        break;
    case TYPE_XT002:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE || uiData == FAIL)
            OpenDoor(GO_XT002_GATE);
        else if (uiData == IN_PROGRESS)
        {
            CloseDoor(GO_XT002_GATE);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_NERF_ENGINEERING, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_HEARTBREAKER, false);
            DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_XT_002_ID);
        }
        break;
    case TYPE_ASSEMBLY:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
        {
            OpenDoor(GO_IRON_ENTRANCE_DOOR);
            OpenDoor(GO_ARCHIVUM_DOOR);
            OpenDoor(GO_SHATTERED_DOOR);
        }
        else if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_BRUNDIR, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_MOLGEIM, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_STEELBREAKER, true);
            CloseDoor(GO_IRON_ENTRANCE_DOOR);
        }
        else if (uiData == FAIL)
        {
            if (Creature* pBrundir = GetSingleCreatureFromStorage(NPC_BRUNDIR))
            {
                if (!pBrundir->isAlive())
                    pBrundir->Respawn();
            }
            if (Creature* pMolgeim = GetSingleCreatureFromStorage(NPC_MOLGEIM))
            {
                if (!pMolgeim->isAlive())
                    pMolgeim->Respawn();
            }
            if (Creature* pSteelbreaker = GetSingleCreatureFromStorage(NPC_STEELBREAKER))
            {
                if (!pSteelbreaker->isAlive())
                    pSteelbreaker->Respawn();
            }
            OpenDoor(GO_IRON_ENTRANCE_DOOR);
        }
        break;
    case TYPE_KOLOGARN:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
        {
            if (instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_CACHE_OF_LIVING_STONE, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_CACHE_OF_LIVING_STONE_H, 30*MINUTE);
            }
            if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_KOLOGARN_BRIDGE))
            {
                pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                pGo->SetGoState(GO_STATE_READY);
            }
        }
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_DISARMED, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_OPEN_ARMS, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_RUBBLE_AND_ROLL, false);
        }
        break;
    case TYPE_AURIAYA:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
        {
            if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_MIMIRON_TRAM))
            {
                pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                pGO->SetGoState(GO_STATE_READY);
            }
        }
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_NINE_LIVES, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_CRAZY_CAT_LADY, true);
        }
        break;
    // Keepers
    case TYPE_MIMIRON:
        m_auiEncounter[uiType] = uiData;
        DoUseDoorOrButton(GO_MIMIRON_DOOR_1);
        DoUseDoorOrButton(GO_MIMIRON_DOOR_2);
        DoUseDoorOrButton(GO_MIMIRON_DOOR_3);
        if (uiData == DONE)
        {
            if (m_auiHardBoss[3] != DONE)
            {
                if (instance->IsRegularDifficulty())
                {
                    DoRespawnGameObject(GO_CACHE_OF_INOV, 30*MINUTE);
                }
                else
                {
                    DoRespawnGameObject(GO_CACHE_OF_INOV_H, 30*MINUTE);
                }
            }
            // used to make the friendly keeper visible
            if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_MIMIRON))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        if (uiData == IN_PROGRESS)
            SetSpecialAchievementCriteria(TYPE_ACHIEV_FIREFIGHTER, false);
        break;
    case TYPE_HODIR:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
        {
            OpenDoor(GO_HODIR_ENTER);
            DoUseDoorOrButton(GO_HODIR_ICE_WALL);
            DoUseDoorOrButton(GO_HODIR_EXIT);
            if(instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_CACHE_OF_WINTER, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_CACHE_OF_WINTER_H, 30*MINUTE);
            }
            // used to make the friendly keeper visible
            if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_HODIR))
                pImage->SetVisibility(VISIBILITY_ON);

            DoOpenMadnessDoorIfCan();
        }
        else if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_CHEESE_FREEZE, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_COOLEST_FRIEND, true);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_RARE_CACHE, true);
            CloseDoor(GO_HODIR_ENTER);
        }
        else if (uiData == FAIL)
            OpenDoor(GO_HODIR_ENTER);
        break;
    case TYPE_THORIM:
        m_auiEncounter[uiType] = uiData;
        DoUseDoorOrButton(GO_LIGHTNING_FIELD);
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_SIFFED, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_LOSE_YOUR_ILLUSION, false);
            DoUseDoorOrButton(GO_DARK_IRON_PORTCULIS);
        }
        if (uiData == DONE)
        {
            if(m_auiHardBoss[5] != DONE)
            {
                if (instance->IsRegularDifficulty())
                {
                    DoRespawnGameObject(GO_CACHE_OF_STORMS, 30*MINUTE);
                }
                else
                {
                    DoRespawnGameObject(GO_CACHE_OF_STORMS_H, 30*MINUTE);
                }
            }
            // used to make the friendly keeper visible
            if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_THORIM))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        break;
    case TYPE_FREYA:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
        {
            // do this in order to see how many elders were alive and spawn the correct chest
            // hard mode drop
            if(m_auiHardBoss[6] != DONE)
            {
                if (instance->IsRegularDifficulty())
                {
                    DoRespawnGameObject(GO_FREYA_GIFT, 30*MINUTE);
                }
                else
                {
                    DoRespawnGameObject(GO_FREYA_GIFT_H, 30*MINUTE);
                }
            }
            // used to make the friendly keeper visible
            if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_FREYA))
                pImage->SetVisibility(VISIBILITY_ON);
            DoOpenMadnessDoorIfCan();
        }
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_BACK_TO_NATURE, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_WOOD, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_KNOCK_WOOD, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_KNOCK_KNOCK_WOOD, false);
        }
        break;
    // Prison
    case TYPE_VEZAX:
        m_auiEncounter[uiType] = uiData;
        if (uiData == DONE)
            DoUseDoorOrButton(GO_VEZAX_GATE);
        if (uiData == IN_PROGRESS)
        {
            SetSpecialAchievementCriteria(TYPE_ACHIEV_MORNING_SARONITE, false);
        }
        break;
    case TYPE_YOGGSARON:
        m_auiEncounter[uiType] = uiData;
        DoUseDoorOrButton(GO_YOGG_GATE);
        if (uiData == IN_PROGRESS)
        {
            DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_YOGG_SARON_ID);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_THREE_LIGHTS, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_TWO_LIGHTS, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_ONE_LIGHT, false);
            SetSpecialAchievementCriteria(TYPE_ACHIEV_ALONE, false);
        }
        if (uiData == FAIL)
        {
            // respawn clouds
            for(GUIDList::iterator iter = m_lCLoudGuids.begin(); iter != m_lCLoudGuids.end(); ++iter)
                if (Creature *pTmp = instance->GetCreature(*iter))
                    pTmp->Respawn();
            // respawn Sara
            if(Creature* pSara = GetSingleCreatureFromStorage(NPC_SARA))
            {
                if (!pSara->isAlive())
                    pSara->Respawn();
                else
                    pSara->AI()->EnterEvadeMode();
            }
            if (Creature* pYoggBrain = GetSingleCreatureFromStorage(NPC_YOGG_BRAIN))
            {
                if(!pYoggBrain->isAlive())
                    pYoggBrain->Respawn();
                else
                    pYoggBrain->AI()->EnterEvadeMode();
            }
        }
        break;

    // Celestial Planetarium
    case TYPE_ALGALON:
        m_auiEncounter[uiType] = uiData;
        DoUseDoorOrButton(GO_CELESTIAL_DOOR);
        DoUseDoorOrButton(GO_UNIVERSE_FLOOR_CELESTIAL);
        if (uiData == DONE)
            DoRespawnGameObject(GO_GIFT_OF_OBSERVER, 30*MINUTE);
        break;

    // Hard modes
    case TYPE_LEVIATHAN_HARD:
        m_auiHardBoss[0] = uiData;
        break;
    case TYPE_XT002_HARD:
        m_auiHardBoss[1] = uiData;
        break;
    case TYPE_ASSEMBLY_HARD:
        m_auiHardBoss[2] = uiData;
        break;
    case TYPE_MIMIRON_HARD:
        m_auiHardBoss[3] = uiData;
        if(uiData == DONE)
        {
            if (instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_CACHE_OF_INOV_HARD, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_CACHE_OF_INOV_HARD_H, 30*MINUTE);
            }
        }
        break;
    case TYPE_HODIR_HARD:
        m_auiHardBoss[4] = uiData;
        if(uiData == DONE)
        {
            if (instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_CACHE_OF_RARE_WINTER, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_CACHE_OF_RARE_WINTER_H, 30*MINUTE);
            }
        }
        break;
    case TYPE_THORIM_HARD:
        m_auiHardBoss[5] = uiData;
        if(uiData == DONE)
        {
            if (instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_CACHE_OF_RARE_STORMS, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_CACHE_OF_RARE_STORMS_H, 30*MINUTE);
            }
        }
        break;
    case TYPE_FREYA_HARD:
        m_auiHardBoss[6] = uiData;
        if(uiData == DONE)
        {
            if (instance->IsRegularDifficulty())
            {
                DoRespawnGameObject(GO_FREYA_GIFT_HARD, 30*MINUTE);
            }
            else
            {
                DoRespawnGameObject(GO_FREYA_GIFT_HARD_H, 30*MINUTE);
            }
        }
        break;
    case TYPE_VEZAX_HARD:
        m_auiHardBoss[7] = uiData;
        break;
    case TYPE_YOGGSARON_HARD:
        m_auiHardBoss[8] = uiData;
        break;

    // Ulduar keepers
    case TYPE_KEEPER_HODIR:
        m_auiUlduarKeepers[0] = uiData;
        break;
    case TYPE_KEEPER_THORIM:
        m_auiUlduarKeepers[1] = uiData;
        break;
    case TYPE_KEEPER_FREYA:
        m_auiUlduarKeepers[2] = uiData;
        break;
    case TYPE_KEEPER_MIMIRON:
        m_auiUlduarKeepers[3] = uiData;
        break;

    // teleporters
    case TYPE_LEVIATHAN_TP:
        m_auiUlduarTeleporters[0] = uiData;
        break;
    case TYPE_XT002_TP:
        m_auiUlduarTeleporters[1] = uiData;
        break;
    case TYPE_MIMIRON_TP:
        m_auiUlduarTeleporters[2] = uiData;
        break;

    // mini boss
    case TYPE_RUNIC_COLOSSUS:
        m_auiMiniBoss[0] = uiData;
        if (uiData == DONE)
            OpenDoor(GO_RUNED_STONE_DOOR);
        else
            CloseDoor(GO_RUNED_STONE_DOOR);
        break;
    case TYPE_RUNE_GIANT:
        m_auiMiniBoss[1] = uiData;
        if (uiData == DONE)
            OpenDoor(GO_THORIM_STONE_DOOR);
        else
            CloseDoor(GO_THORIM_STONE_DOOR);
        break;
    case TYPE_LEVIATHAN_MK:
        m_auiMiniBoss[2] = uiData;
        break;
    case TYPE_VX001:
        m_auiMiniBoss[3] = uiData;
        /*if (uiData == DONE)     // just for animation :)
        {
            for(uint8 i = 0; i < 9; i++)
                DoUseDoorOrButton(m_uiMimironTelGUID[i]);
        }*/
        break;
    case TYPE_AERIAL_UNIT:
        m_auiMiniBoss[4] = uiData;
        break;
    case TYPE_YOGG_BRAIN:
        m_auiMiniBoss[5] = uiData;
        break;

    //phases
    case TYPE_MIMIRON_PHASE:
        m_uiMimironPhase = uiData;
        break;
    case TYPE_YOGG_PHASE:
        m_uiYoggPhase = uiData;
        break;
    case TYPE_VISION_PHASE:
        m_uiVisionPhase = uiData;
        break;
    }

    if (uiData == DONE || uiData == FAIL)
    {
        OUT_SAVE_INST_DATA;

        // save all encounters, hard bosses and keepers
        std::ostringstream saveStream;
        saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
                   << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " "
                   << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " "
                   << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11] << " "
                   << m_auiEncounter[12] << " " << m_auiEncounter[13] << " " << m_auiHardBoss[0] << " "
                   << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " "
                   << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " "
                   << m_auiHardBoss[7] << " " << m_auiHardBoss[8] << " " << m_auiUlduarKeepers[0] << " "
                   << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " "
                   << m_auiUlduarTeleporters[0] << " " << m_auiUlduarTeleporters[1] << " " << m_auiUlduarTeleporters[2];

        m_strInstData = saveStream.str();

        SaveToDB();
        OUT_SAVE_INST_DATA_COMPLETE;
    }
}
        void SetData(uint32 type, uint32 data)
        {
            switch (type)
            {
                case DATA_WAVE_COUNT:
                    if (GetData(DATA_MARWYN_EVENT) == DONE)
                    {
                        WaveCnt = 0;
                        DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, 0);
                        DoUpdateWorldState(WORLD_STATE_HOR, WaveCnt);
                        events.CancelEvent(EVENT_NEXT_WAVE);
                        break;
                    }
                    if (data == START_WAVES) // Start der Wellen
                    {
                        CloseDoor(FrontDoorGUID);
                        events.ScheduleEvent(EVENT_NEXT_WAVE, 0);
                        break;
                    }
                    if (data == START_NEXT_WAVE_INSTANT) // Nächste Welle sofort
                    {
                        events.RescheduleEvent(EVENT_NEXT_WAVE, 0);
                        break;
                    }
                    if (data == START_NEXT_WAVE) // Nächste Welle starten
                    {
                        events.RescheduleEvent(EVENT_NEXT_WAVE, SEKUNDEN_60);
                        break;
                    }
                    if (WaveCnt && data == START_RESET) // Wipe
                    {
                        DoWipe();
                        break;
                    }
                    break;
                case DATA_INTRO_EVENT:
                    IntroDone = data;
                    break;
                case DATA_FALRIC_EVENT:
                    Encounter[0] = data;
                    if (data == DONE)
                        events.RescheduleEvent(EVENT_NEXT_WAVE, SEKUNDEN_60);
                    break;
                case DATA_MARWYN_EVENT:
                    Encounter[1] = data;
                    if (data == DONE)
                    {
                        DoUpdateWorldState(WORLD_STATE_HOR, 0);
                        OpenDoor(FrostwornDoorGUID);
                        OpenDoor(FrontDoorGUID);
                    }
                    break;
                case DATA_FROSWORN_EVENT:
                    Encounter[2] = data;
                    if (data == DONE)
                    {
                        OpenDoor(ArthasDoorGUID);
                        SetData(DATA_PHASE, 3);
                        instance->SummonCreature(BOSS_LICH_KING, OutroSpawns[0]);
                        instance->SummonCreature(NPC_JAINA_OUTRO, OutroSpawns[1]);
                    }
                    break;
                case DATA_LICHKING_EVENT:
                    Encounter[3] = data;
                    switch(data)
                    {
                        case IN_PROGRESS:
                            OpenDoor(RunDoorGUID);
                            if (instance->IsHeroic())
                                DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                            break;
                        case FAIL:
                            for (uint8 i=0; i<4; ++i)
                                OpenDoor(WallGUID[i]);

                            CloseDoor(RunDoorGUID);

                            if (Creature * LichKing = instance->GetCreature(LichKingGUID))
                                LichKing->DespawnOrUnsummon(10000);
                            if (Creature * Leader = instance->GetCreature(LeaderGUID))
                                Leader->DespawnOrUnsummon(10000);

                            DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                            DoCastSpellOnPlayers(SPELL_SUICIDE); // Alle Spieler begehen Selbsmord!

                            SetData(DATA_PHASE, 3);
                            instance->SummonCreature(BOSS_LICH_KING, OutroSpawns[0]);
                            instance->SummonCreature(NPC_JAINA_OUTRO, OutroSpawns[1]);
                            break;
                        case DONE:
                            if (GameObject * Chest = instance->GetGameObject(ChestGUID))
                                Chest->SetPhaseMask(1, true);
                            if (GameObject * Portal = instance->GetGameObject(PortalGUID))
                                Portal->SetPhaseMask(1, true);

                            DoCompleteAchievement(ACHIEV_HALLS_OF_REFLECTION_N);

                            if (instance->IsHeroic())
                            {
                                DoCompleteAchievement(ACHIEV_HALLS_OF_REFLECTION_H);
                                DoCastSpellOnPlayers(SPELL_ACHIEV_CHECK);
                                DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                            }
                            break;
                    }
                    break;
                case DATA_SUMMONS:
                    if (data == 3)
                        Summons = 0;
                    else if (data == 1)
                        ++Summons;
                    else if (data == 0)
                        --Summons;
                    data = NOT_STARTED;
                    break;
                case DATA_ICE_WALL_1:
                    WallData[0] = data;
                    break;
                case DATA_ICE_WALL_2:
                    WallData[1] = data;
                    break;
                case DATA_ICE_WALL_3:
                    WallData[2] = data;
                    break;
                case DATA_ICE_WALL_4:
                    WallData[3] = data;
                    break;
                case DATA_PHASE:
                    PhaseData = data;
                    break;
            }

            if (data == DONE)
                SaveToDB();
        }
示例#25
0
 void SetEncounterData(uint32 type, uint32 data) 
 {
    switch (type)
     {
         //Spiderwing ------------------------------------
         case ENCOUNT_ANUBREKHAN:
             Encounters[ENCOUNT_ANUBREKHAN] = data;
             switch (data)
             {
                 case NOT_STARTED:
                     CloseDoor(go_anubrekhan_gate);
                     OpenDoor(go_anubrekhan_door);
                     Close(go_maexxna_outerweb);
                     break;
                 case IN_PROGRESS:
                     CloseDoor(go_anubrekhan_door);
                     break;
                 case DONE:
                     OpenDoor(go_anubrekhan_gate);
                     OpenDoor(go_anubrekhan_door);
                     if(Encounters[ENCOUNT_FAERLINA] == DONE)   //Impossible, but check
                         Open(go_maexxna_outerweb);
                     break;
             }
             break;
         case ENCOUNT_FAERLINA:
             Encounters[ENCOUNT_FAERLINA] = data;
             switch (data)
             {
                 case NOT_STARTED:
                     CloseDoor(go_faerlina_door);
                     Open(go_faerlina_web);
                     Close(go_maexxna_outerweb);
                     break;
                 case IN_PROGRESS:
                     Close(go_faerlina_web);
                     break;
                 case DONE:
                     OpenDoor(go_faerlina_door);
                     Open(go_faerlina_web);
                     if(Encounters[ENCOUNT_ANUBREKHAN] == DONE)
                         Open(go_maexxna_outerweb);
                     break;
             }
             break;
         case ENCOUNT_MAEXXNA:
             Encounters[ENCOUNT_MAEXXNA] = data;
             switch (data)
             {
                 case NOT_STARTED:
                     Open(go_maexxna_innerweb);
                     Disable(go_spiderwing_portal);
                     Close(go_spiderwing_eye_boss);
                     Close(go_spiderwing_eye_ramp);
                     break;
                 case IN_PROGRESS:
                     Close(go_maexxna_innerweb);
                     break;
                 case DONE:
                     Open(go_maexxna_innerweb);
                     Open(go_spiderwing_eye_boss);
                     Open(go_spiderwing_eye_ramp);
                     Enable(go_spiderwing_portal);
                     break;
             }
             break;
             //Plaguewing ------------------------------------
         case ENCOUNT_NOTH:
             Encounters[ENCOUNT_NOTH] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Open(go_noth_door);
                 Close(go_noth_exit);
                 break;
             case IN_PROGRESS:
                 Close(go_noth_door);
                 break;
             case DONE:
                 Open(go_noth_door);
                 Open(go_noth_exit);
                 break;
             }
             break;
         case ENCOUNT_HEIGAN:
             Encounters[ENCOUNT_HEIGAN] = data;
             switch(data)
             {
                 case NOT_STARTED:
                     Open(go_heigan_entry);
                     Close(go_heigan_outerdoor);
                     Close(go_heigan_exitgate);
                     break;
                 case IN_PROGRESS:
                     Close(go_heigan_entry);
                     break;
                 case DONE:
                     Open(go_heigan_entry);
                     Open(go_heigan_outerdoor);
                     Open(go_heigan_exitgate);
                     break;
             }
             break;
         case ENCOUNT_LOATHEB:
             Encounters[ENCOUNT_LOATHEB] = data;
             switch (data)
             {
             case NOT_STARTED:
                 Open(go_loatheb_door);
                 Disable(go_plaguewing_portal);
                 Close(go_plaguewing_eye_boss);
                 Close(go_plaguewing_eye_ramp);
                 break;
             case IN_PROGRESS:
                 Close(go_loatheb_door);
                 break;
             case DONE:
                 Open(go_loatheb_door);
                 Open(go_plaguewing_eye_boss);
                 Open(go_plaguewing_eye_ramp);
                 Enable(go_plaguewing_portal);
                 break;
             }
             break;
         case ENCOUNT_PATCHWERK:
             Encounters[ENCOUNT_PATCHWERK] = data;
             switch(data)
             {
             case NOT_STARTED:
                 //Close(go_grobblulus_door);
                 break;
             case IN_PROGRESS:
                 break;
             case DONE:
                 Open(go_grobblulus_door);
                 break;
             }
             break;
         case ENCOUNT_GROBBULUS:
             Encounters[ENCOUNT_GROBBULUS] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Open(go_grobblulus_door);
                 break;
             case IN_PROGRESS:
                 Close(go_grobblulus_door);
                 break;
             case DONE:
                 Open(go_grobblulus_door);
                 break;
             }
             break;
         case ENCOUNT_GLUTH:
             Encounters[ENCOUNT_GLUTH] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Close(go_gluth_door);
                 Close(go_thaddius_door);
                 break;
             case DONE:
                 Open(go_gluth_door);
                 Open(go_thaddius_door);
                 break;
             }
             break;
         case ENCOUNT_THADDIUS:
             Encounters[ENCOUNT_THADDIUS] = data;
             switch(data)
             {
             case NOT_STARTED:
                 {
                     Disable(go_naxx_portal);
                     Close(go_abom_eye_boss);
                     Close(go_abom_eye_ramp);
                     if (GetData(ENCOUNT_GLUTH) == 3)
                         Open(go_thaddius_door);
                     break;
                 }
             case IN_PROGRESS:
                 Close(go_thaddius_door);
                 break;
             case DONE:
                 Open(go_abom_eye_boss);
                 Open(go_abom_eye_ramp);
                 Enable(go_naxx_portal);
                 Open(go_thaddius_door);
                 break;
             }
             break;
         case ENCOUNT_GOTHIK:
             Encounters[ENCOUNT_GOTHIK] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Open(go_vaccuum_enter_gate);
                 Open(go_vaccuum_combat_gate);
                 Close(go_vaccuum_exit_gate);
                 break;
             case IN_PROGRESS:
                 Close(go_vaccuum_enter_gate);
                 Close(go_vaccuum_combat_gate);
                 break;
             case DONE:
                 Open(go_vaccuum_combat_gate);
                 Open(go_vaccuum_enter_gate);
                 Open(go_vaccuum_exit_gate);
                 break;
             }
             break;
         case ENCOUNT_FOURHORSEMAN:
             Encounters[ENCOUNT_FOURHORSEMAN] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Open(go_horsemans_door);
                 Close(go_horsemans_eye_boss);
                 Close(go_horsemans_eye_ramp);
                 Disable(go_horsemans_portal);
                 break;
             case IN_PROGRESS:
                 Close(go_horsemans_door);
                 break;
             case DONE:
                 Open(go_horsemans_door);
                 Open(go_horsemans_eye_boss);
                 Open(go_horsemans_eye_ramp);
                 Enable(go_horsemans_portal);
                 break;
             }
             break;
         case ENCOUNT_SAPPHIRON:
             Encounters[ENCOUNT_SAPPHIRON] = data;
             switch(data)
             {
             case NOT_STARTED:
                 Close(go_sapphiron_door);
                 Close(go_kelthuzad_door);
                 break;
             case IN_PROGRESS:
                 break;
             case DONE:
                 Open(go_sapphiron_door);
                 Open(go_kelthuzad_door);
                 break;
             }
             break;
         case ENCOUNT_KELTHUZAD:
             Encounters[ENCOUNT_KELTHUZAD] = data;
             switch(data)
             {
             case NOT_STARTED:
                 if (GetData(ENCOUNT_SAPPHIRON) == DONE)
                     Open(go_kelthuzad_door);
                 break;
             case IN_PROGRESS:
                 Close(go_kelthuzad_door);
                 break;
             case DONE:
                 Open(go_kelthuzad_door);
                 break;
             }
             break;
         }
 }
void LiftDoorBehaveFun(STRATEGYBLOCK* sbptr)
{
	LIFT_DOOR_BEHAV_BLOCK *doorbhv;
	MORPHCTRL *mctrl;
	DISPLAYBLOCK* dptr;
	MODULE *mptr;

 	GLOBALASSERT(sbptr);
	doorbhv = (LIFT_DOOR_BEHAV_BLOCK*)sbptr->SBdataptr;
	GLOBALASSERT((doorbhv->bhvr_type == I_BehaviourLiftDoor));
	mctrl = doorbhv->PDmctrl;
	GLOBALASSERT(mctrl);
	mptr = sbptr->SBmoptr;
	GLOBALASSERT(mptr);
	dptr = sbptr->SBdptr;
	
	/* update morphing.... */
	UpdateMorphing(mctrl);

 	switch(doorbhv->door_state)
	{
		case I_door_opening:
		{	
			mptr->m_flags |= m_flag_open;
			if(mctrl->ObMorphFlags & mph_flag_finished)		
			{
		        if (doorbhv->SoundHandle!=SOUND_NOACTIVEINDEX)
		        {
		          Sound_Play(SID_DOOREND,"d",&mptr->m_world);
		          Sound_Stop(doorbhv->SoundHandle);
		        }
				doorbhv->door_state = I_door_open;
			}
			break;
		}
		case I_door_closing:
		{
			if(mctrl->ObMorphFlags & mph_flag_finished)
			{
		        if (doorbhv->SoundHandle!=SOUND_NOACTIVEINDEX)
		        {
					Sound_Play(SID_DOOREND,"d",&mptr->m_world);
					Sound_Stop(doorbhv->SoundHandle);
		        }
				doorbhv->door_state = I_door_closed;
				mptr->m_flags &= ~m_flag_open;
			}
			else if(AnythingInMyModule(sbptr->SBmoptr))
			{
				if (doorbhv->SoundHandle==SOUND_NOACTIVEINDEX)
				{
					Sound_Play(SID_DOORSTART,"d",&mptr->m_world);
					Sound_Play(SID_DOORMID,"del",&mptr->m_world,&doorbhv->SoundHandle);
				}
				OpenDoor(mctrl, doorbhv->door_opening_speed);
				doorbhv->door_state = I_door_opening;
				mptr->m_flags |= m_flag_open;
			}							
			break;
		}
		case I_door_open:
		{
			mptr->m_flags |= m_flag_open;
			if(doorbhv->request_state == I_door_closed)
			{
		 	    					
				if (doorbhv->SoundHandle==SOUND_NOACTIVEINDEX)
				{
 					Sound_Play(SID_DOORSTART,"d",&mptr->m_world);
 					Sound_Play(SID_DOORMID,"del",&mptr->m_world,&doorbhv->SoundHandle);
				}
							
				CloseDoor(mctrl, doorbhv->door_closing_speed);
				doorbhv->door_state = I_door_closing;
			}
			break;
		}
		case I_door_closed:
		{
			mptr->m_flags &= ~m_flag_open;
			if(doorbhv->request_state == I_door_open)
			{
						
				if (doorbhv->SoundHandle==SOUND_NOACTIVEINDEX)
				{
					Sound_Play(SID_DOORSTART,"d",&mptr->m_world);
					Sound_Play(SID_DOORMID,"del",&mptr->m_world,&doorbhv->SoundHandle);
				}
		
				OpenDoor(mctrl, doorbhv->door_opening_speed);
				doorbhv->door_state = I_door_opening;
				mptr->m_flags |= m_flag_open;
			}
			break;
		}
		default:
			LOCALASSERT(1==0);
	}
}
示例#27
0
    void SetData(uint32 uiType, uint32 uiData)
    {
        switch(uiType)
        {
        case TYPE_LEVIATHAN:
            m_auiEncounter[0] = uiData;
            DoUseDoorOrButton(m_uiShieldWallGUID);
            if (uiData == DONE)
            {
                OpenDoor(m_uiXT002GateGUID);
                //OpenDoor(m_uiLeviathanGateGUID);
            }
            break;
        case TYPE_IGNIS:
            m_auiEncounter[1] = uiData;
            OpenXtDoor();       // remove when leviathan implemented
            break;
        case TYPE_RAZORSCALE:
            m_auiEncounter[2] = uiData;
            OpenXtDoor();       // remove when leviathan implemented
            break;
        case TYPE_XT002:
            m_auiEncounter[3] = uiData;
            if (uiData == DONE)
                OpenDoor(m_uiXT002GateGUID);
            else if (uiData == IN_PROGRESS)
                CloseDoor(m_uiXT002GateGUID);
            break;
        case TYPE_ASSEMBLY:
            m_auiEncounter[4] = uiData;
            if (uiData == DONE)
            {
                OpenDoor(m_uiIronCouncilDoorGUID);
                OpenDoor(m_uiArchivumDoorGUID);
                CheckIronCouncil();		// used for a hacky achiev, remove for revision!
            } else if (uiData == IN_PROGRESS)
                CloseDoor(m_uiIronCouncilDoorGUID);
            break;
        case TYPE_KOLOGARN:
            m_auiEncounter[5] = uiData;
            if (uiData == DONE)
            {
                DoRespawnGameObject(m_uiKologarnLootGUID, 30*MINUTE);
                if(m_auiEncounter[5] == DONE)
                if (GameObject* pGo = instance->GetGameObject(m_uiKologarnBridgeGUID))
                {
                    pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                    pGo->SetGoState(GO_STATE_READY);
                }
            }
            break;
        case TYPE_AURIAYA:
            m_auiEncounter[6] = uiData;
            if (uiData == DONE)
            {
//                CheckIronCouncil();		// used for a hacky achiev, remove for revision!
                if (GameObject* pGO = instance->GetGameObject(m_uiMimironTramGUID))
                {
                    pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
                    pGO->SetGoState(GO_STATE_READY);
                }
            }
            break;

            // Keepers
        case TYPE_MIMIRON:
            m_auiEncounter[7] = uiData;
            DoUseDoorOrButton(m_uiMimironDoor1GUID);
            DoUseDoorOrButton(m_uiMimironDoor2GUID);
            DoUseDoorOrButton(m_uiMimironDoor3GUID);
            if (uiData == DONE)
            {
                if(m_auiHardBoss[3] != DONE)
                    DoRespawnGameObject(m_uiMimironLootGUID, 30*MINUTE);
                // used to make the friendly keeper visible
                if(Creature* pImage = instance->GetCreature(m_uiMimironImageGUID))
                    pImage->SetVisibility(VISIBILITY_ON);
                OpenMadnessDoor();
                CheckKeepers();		// used for a hacky achiev, remove for revision!
            }
            break;
        case TYPE_HODIR:
            m_auiEncounter[8] = uiData;
            DoUseDoorOrButton(m_uiHodirEnterDoorGUID);
            if (uiData == DONE)
            {
                DoUseDoorOrButton(m_uiHodirWallGUID);
                DoUseDoorOrButton(m_uiHodirExitDoorGUID);
                DoRespawnGameObject(m_uiHodirLootGUID, 30*MINUTE);
                // used to make the friendly keeper visible
                if(Creature* pImage = instance->GetCreature(m_uiHodirImageGUID))
                    pImage->SetVisibility(VISIBILITY_ON);
                OpenMadnessDoor();
                CheckKeepers();		// used for a hacky achiev, remove for revision!
            }
            break;
        case TYPE_THORIM:
            m_auiEncounter[9] = uiData;   
            DoUseDoorOrButton(m_uiArenaEnterDoorGUID);
            if (uiData == IN_PROGRESS)
                DoUseDoorOrButton(m_uiArenaExitDoorGUID);
            if (uiData == DONE)
            {
                if(m_auiHardBoss[5] != DONE)
                    DoRespawnGameObject(m_uiThorimLootGUID, 30*MINUTE);
                // used to make the friendly keeper visible
                if(Creature* pImage = instance->GetCreature(m_uiThorimImageGUID))
                    pImage->SetVisibility(VISIBILITY_ON);
                OpenMadnessDoor();
                CheckKeepers();		// used for a hacky achiev, remove for revision!
            }
            break;
        case TYPE_FREYA:
            m_auiEncounter[10] = uiData;
            if (uiData == DONE)
            {
                // do this in order to see how many elders were alive and spawn the correct chest
                if(m_auiHardBoss[6] == 0)
                    DoRespawnGameObject(m_uiFreyaLootGUID, 30*MINUTE);
                else if(m_auiHardBoss[6] == 1)
                    DoRespawnGameObject(m_uiFreyaLoot1GUID, 30*MINUTE);
                else if(m_auiHardBoss[6] == 2)
                    DoRespawnGameObject(m_uiFreyaLoot2GUID, 30*MINUTE);
                else if(m_auiHardBoss[6] == 3)
                    DoRespawnGameObject(m_uiFreyaLoot3GUID, 30*MINUTE);
                // used to make the friendly keeper visible
                if(Creature* pImage = instance->GetCreature(m_uiFreyaImageGUID))
                    pImage->SetVisibility(VISIBILITY_ON);
                OpenMadnessDoor();
                CheckKeepers();		// used for a hacky achiev, remove for revision!
            }
            break;

            // Prison
        case TYPE_VEZAX:
            m_auiEncounter[11] = uiData;
            //if (uiData == DONE)
                //DoUseDoorOrButton(m_uiVezaxGateGUID);
            break;
        case TYPE_YOGGSARON:
            m_auiEncounter[12] = uiData;
            //DoUseDoorOrButton(m_uiYoggGateGUID);
            break;

            // Celestial Planetarium
        case TYPE_ALGALON:
            m_auiEncounter[13] = uiData;
            DoUseDoorOrButton(m_uiCelestialDoorGUID);
            DoUseDoorOrButton(m_uiUniverseFloorCelestialGUID);
            if (uiData == DONE)
                DoRespawnGameObject(m_uiAlagonLootGUID, 30*MINUTE);
            break;

            // Hard modes
        case TYPE_LEVIATHAN_HARD:
            m_auiHardBoss[0] = uiData;  // todo: add extra loot
            break;
        case TYPE_XT002_HARD:
            m_auiHardBoss[1] = uiData;  // hard mode loot in sql -> hacky way
            break;
        case TYPE_HODIR_HARD:
            m_auiHardBoss[4] = uiData;
            if(uiData == DONE)
                DoRespawnGameObject(m_uiHodirRareLootGUID, 30*MINUTE);
            break;
        case TYPE_ASSEMBLY_HARD:
            m_auiHardBoss[2] = uiData;  // hard mode loot in sql
            break;
        case TYPE_FREYA_HARD:
            m_auiHardBoss[6] = uiData;  // hard mode loot in the script above
            break;
        case TYPE_THORIM_HARD:
            m_auiHardBoss[5] = uiData;
            if(uiData == DONE)
                DoRespawnGameObject(m_uiThorimRareLootGUID, 30*MINUTE);
            break;
        case TYPE_MIMIRON_HARD:
            m_auiHardBoss[3] = uiData;
            if(uiData == DONE)
                DoRespawnGameObject(m_uiMimironHardLootGUID, 30*MINUTE);
            break;
        case TYPE_VEZAX_HARD:
            m_auiHardBoss[7] = uiData;  // hard mode loot in sql -> hacky way
            break;
        case TYPE_YOGGSARON_HARD:
            m_auiHardBoss[8] = uiData;  // todo: add extra loot
            break;

            // Ulduar keepers
        case TYPE_KEEPER_HODIR:
            m_auiUlduarKeepers[0] = uiData;
            break;
        case TYPE_KEEPER_THORIM:
            m_auiUlduarKeepers[1] = uiData;
            break;
        case TYPE_KEEPER_FREYA:
            m_auiUlduarKeepers[2] = uiData;
            break;
        case TYPE_KEEPER_MIMIRON:
            m_auiUlduarKeepers[3] = uiData;
            break;

            // teleporters
        case TYPE_LEVIATHAN_TP:
            m_auiUlduarTeleporters[0] = uiData;
            break;
        case TYPE_XT002_TP:
            m_auiUlduarTeleporters[1] = uiData;
            break;
        case TYPE_MIMIRON_TP:
            m_auiUlduarTeleporters[2] = uiData;
            break;

            // mini boss
        case TYPE_RUNIC_COLOSSUS:
            m_auiMiniBoss[0] = uiData;
            if (uiData == DONE)
                OpenDoor(m_uiHallwayDoorGUID);
            else
                CloseDoor(m_uiHallwayDoorGUID);
            break;
        case TYPE_RUNE_GIANT:
            m_auiMiniBoss[1] = uiData;
            if (uiData == DONE)
                OpenDoor(m_uiThorimEnterDoorGUID);
            else
                CloseDoor(m_uiThorimEnterDoorGUID);
            break;
        case TYPE_LEVIATHAN_MK:
            m_auiMiniBoss[2] = uiData;
            break;
        case TYPE_VX001:
            m_auiMiniBoss[3] = uiData;
            if (uiData == DONE)     // just for animation :)
            {
                for(uint8 i = 0; i < 9; i++)
                    DoUseDoorOrButton(m_uiMimironTelGUID[i]);
            }
            break;
        case TYPE_AERIAL_UNIT:
            m_auiMiniBoss[4] = uiData;
            break;
        case TYPE_YOGG_BRAIN:
            m_auiMiniBoss[5] = uiData;
            break;

            //phases
        case TYPE_MIMIRON_PHASE:
            m_uiMimironPhase = uiData;
            break;
        case TYPE_YOGG_PHASE:
            m_uiYoggPhase = uiData;
            break;
        case TYPE_VISION_PHASE:
            m_uiVisionPhase = uiData;
            break;
        }

        if (uiData == DONE || uiData == FAIL)
        {
            OUT_SAVE_INST_DATA;

            // save all encounters, hard bosses and keepers
            std::ostringstream saveStream;
            saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
                << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " "
                << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " "
                << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11] << " "
                << m_auiEncounter[12] << " " << m_auiEncounter[13] << " " << m_auiHardBoss[0] << " " 
                << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " "
                << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " "
                << m_auiHardBoss[7] << " " << m_auiHardBoss[8] << " " << m_auiUlduarKeepers[0] << " "
                << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " "
                << m_auiUlduarTeleporters[0] << " " << m_auiUlduarTeleporters[1] << " " << m_auiUlduarTeleporters[2];

            m_strInstData = saveStream.str();

            SaveToDB();
            OUT_SAVE_INST_DATA_COMPLETE;
        }
    }
void* LiftDoorBehaveInit(void* bhdata, STRATEGYBLOCK* sbptr)
{
	LIFT_DOOR_BEHAV_BLOCK *doorbhv;
	LIFT_DOOR_TOOLS_TEMPLATE *doortt;
	MORPHCTRL* morphctrl;	
	MORPHHEADER* morphheader;
	MORPHFRAME* morphframe;
	MODULE * my_mod;

	doorbhv = (LIFT_DOOR_BEHAV_BLOCK*)AllocateMem(sizeof(LIFT_DOOR_BEHAV_BLOCK));
	if (!doorbhv) 
	{
		memoryInitialisationFailure = 1;
		return ((void *)NULL);
	}

	doorbhv->bhvr_type = I_BehaviourLiftDoor;

	// from loaders
	
	doortt = (LIFT_DOOR_TOOLS_TEMPLATE*)bhdata;	

	// Set up a new Morph Control
	morphctrl = (MORPHCTRL*)AllocateMem(sizeof(MORPHCTRL));
	if (!morphctrl)
	{
		memoryInitialisationFailure = 1;
		return ((void *)NULL);
	}
	morphheader = (MORPHHEADER*)AllocateMem(sizeof(MORPHHEADER));
	if (!morphheader)
	{
		memoryInitialisationFailure = 1;
		return ((void *)NULL);
	}
	morphframe = (MORPHFRAME*)AllocateMem(sizeof(MORPHFRAME));
	if (!morphframe)
	{
		memoryInitialisationFailure = 1;
		return ((void *)NULL);
	}

	morphframe->mf_shape1 = doortt->shape_open;
	morphframe->mf_shape2 = doortt->shape_closed;

	morphheader->mph_numframes = 1;
	morphheader->mph_maxframes = ONE_FIXED;
	morphheader->mph_frames = morphframe;

	morphctrl->ObMorphCurrFrame = 0;
	morphctrl->ObMorphFlags = 0;
	morphctrl->ObMorphSpeed = 0;
	morphctrl->ObMorphHeader = morphheader;

	// Copy the name over
	COPY_NAME (sbptr->SBname, doortt->nameID);

	// Setup module ref
	{
		MREF mref=doortt->my_module;
		ConvertModuleNameToPointer (&mref, MainSceneArray[0]->sm_marray);
		my_mod = mref.mref_ptr;
	}
	GLOBALASSERT (my_mod);

	my_mod->m_sbptr = sbptr;
	sbptr->SBmoptr = my_mod;
	sbptr->SBmomptr = my_mod->m_mapptr;
	sbptr->SBflags.no_displayblock = 1;

	doorbhv->door_state	= doortt->state;
	doorbhv->PDmctrl = morphctrl;
	doorbhv->door_closing_speed=doortt->door_closing_speed;
	doorbhv->door_opening_speed=doortt->door_opening_speed;

	// all lift doors have a closed starting state except the
	// one where the lift is - fill in other data

	sbptr->SBmorphctrl = doorbhv->PDmctrl;

	if(doorbhv->door_state == I_door_open)
		{
			sbptr->SBmorphctrl->ObMorphCurrFrame = 0; 
			OpenDoor(sbptr->SBmorphctrl, DOOR_OPENFASTSPEED);	
		}
	else
		{
			GLOBALASSERT(doorbhv->door_state == I_door_closed);
			sbptr->SBmorphctrl->ObMorphCurrFrame = 1; 
			CloseDoor(sbptr->SBmorphctrl, DOOR_CLOSEFASTSPEED);	
		}
	doorbhv->request_state = doorbhv->door_state;

	// copy data into relevant structures

	sbptr->SBmorphctrl = doorbhv->PDmctrl;

	if(sbptr->SBmoptr)
		{
			sbptr->SBmoptr->m_flags |= m_flag_open;
		}
	if(sbptr->SBmomptr)
		{
			sbptr->SBmomptr->MapMorphHeader = sbptr->SBmorphctrl->ObMorphHeader;
		}
			
			
  	doorbhv->SoundHandle=SOUND_NOACTIVEINDEX;
			
	return((void*)doorbhv);
}
        void SetData(uint32 type, uint32 data)
        {
            if (type == DATA_WAVE_COUNT && data == SPECIAL)
            {
                CloseDoor(FrontDoor);
                events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
                return;
            }

            if (WaveCount && data == NOT_STARTED)
                DoWipe();

            switch (type)
            {
                case DATA_INTRO_EVENT:
                    IntroDone = data;
                    break;
                case DATA_FALRIC_EVENT:
                    Encounter[0] = data;
                    if (data == DONE)
                        events.ScheduleEvent(EVENT_NEXT_WAVE, 60000);
                    break;
                case DATA_MARWYN_EVENT:
                    Encounter[1] = data;
                    if (data == DONE)
                    {
                        OpenDoor(FrostwornDoor);
                        OpenDoor(FrontDoor);
                    }
                    break;
                case DATA_FROSWORN_EVENT:
                    Encounter[2] = data;
                    if (data == DONE)
                    {
                        OpenDoor(ArthasDoor);
                        SetData(DATA_PHASE, 3);
                        instance->SummonCreature(BOSS_LICH_KING, OutroSpawns[0]);
                        instance->SummonCreature(NPC_JAINA_OUTRO, OutroSpawns[1]);
                    }
                    break;
                case DATA_LICHKING_EVENT:
                    Encounter[3] = data;
                    if (data == IN_PROGRESS)
                    {
                        OpenDoor(RunDoor);

                        if (instance->IsHeroic())
                            DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                    }
                    if (data == FAIL)
                    {
                        for (uint8 i = 0; i<4; i++)
                            OpenDoor(WallID[i]);

                        CloseDoor(RunDoor);

                        if (Creature* lichKing = instance->GetCreature(LichKing))
                            lichKing->DespawnOrUnsummon(10000);
                        if (Creature* lider = instance->GetCreature(Lider))
                            lider->DespawnOrUnsummon(10000);

                        DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                        DoCastSpellOnPlayers(5); // Kill all players

                        SetData(DATA_PHASE, 3);
                        instance->SummonCreature(BOSS_LICH_KING, OutroSpawns[0]);
                        instance->SummonCreature(NPC_JAINA_OUTRO, OutroSpawns[1]);
                    }
                    if (data == DONE)
                    {
                        if (GameObject* chest = instance->GetGameObject(Chest))
                            chest->SetPhaseMask(1, true);
                        if (GameObject* portal = instance->GetGameObject(uiPortal))
                            portal->SetPhaseMask(1, true);

                        /*DoCompleteAchievement(ACHIEV_HALLS_OF_REFLECTION_N);
                        if (instance->IsHeroic())
                        {
                            DoCompleteAchievement(ACHIEV_HALLS_OF_REFLECTION_H);
                            DoCastSpellOnPlayers(SPELL_ACHIEV_CHECK);
                            DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                        }*/
                    }
                    break;
                case DATA_SUMMONS:
                    if (data == 3) Summons = 0;
                    else if (data == 1) ++Summons;
                    else if (data == 0) --Summons;
                    data = NOT_STARTED;
                    break;
                case DATA_ICE_WALL_1:
                    Wall[0] = data;
                    break;
                case DATA_ICE_WALL_2:
                    Wall[1] = data;
                    break;
                case DATA_ICE_WALL_3:
                    Wall[2] = data;
                    break;
                case DATA_ICE_WALL_4:
                    Wall[3] = data;
                    break;
                case DATA_PHASE:
                    DataPhase = data;
                    break;
            }

            if (data == DONE)
                SaveToDB();
        }
        void SetData(uint32 type, uint32 data)
        {
            if (type == DATA_WAVE_COUNT && data == SPECIAL)
            {
                  bIntroDone = true;
                  CloseDoor(uiFrontDoor);
                  CloseDoor(uiRunDoor);
                  events.ScheduleEvent(EVENT_NEXT_WAVE, 9000);
                return;
            }

            if (uiWaveCount && data == NOT_STARTED)
                  DoWipe();

            switch (type)
            {
                case DATA_FALRIC_EVENT:
                    uiEncounter[0] = data;
                    if (data == DONE)
                           events.ScheduleEvent(EVENT_NEXT_WAVE, 9000);
                    if (Creature* partner = instance->GetCreature(uiPartner2))
                           partner->SetVisible(false);
                    break;
                case DATA_MARWYN_EVENT:
                    uiEncounter[1] = data;
                    if (data == DONE)
                    {
                           OpenDoor(uiFrostswornDoor);
                           OpenDoor(uiFrontDoor);
                    }
                    break;
                case DATA_FROSTSWORN_EVENT:
                    uiEncounter[2] = data;
                    if (data == DONE)
                    {     
                           OpenDoor(uiArthasDoor);
                           SetData(DATA_PHASE, 3);
                           instance->SummonCreature(NPC_LICH_KING_BOSS, OutroSpawns[0]);
                           instance->SummonCreature(NPC_SYLVANAS_PART2, OutroSpawns[1]);
                    }
                    if (Creature* partner = instance->GetCreature(uiPartner2))                    
                           partner->SetVisible(true);
                    break;
                case DATA_LICHKING_EVENT:
                    uiEncounter[3] = data;
                    if (data == IN_PROGRESS)
                    {
                           OpenDoor(uiRunDoor);
                        if (instance->IsHeroic())
                               DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                    }
                    if (data == FAIL)
                    {
                        for(uint8 i = 0; i<4; i++)
                               OpenDoor(uiWallID[i]);

                        CloseDoor(uiRunDoor);

                        if (Creature* pLichKing = instance->GetCreature(uiLichKing))
                               pLichKing->DespawnOrUnsummon(10000);
                        if (Creature* pLider = instance->GetCreature(uiLider))
                               pLider->DespawnOrUnsummon(10000);

                        DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                        DoCastSpellOnPlayers(5); // Kill all players

                        SetData(DATA_PHASE, 3);
                        instance->SummonCreature(NPC_LICH_KING_BOSS, OutroSpawns[0]);
                        instance->SummonCreature(NPC_SYLVANAS_PART2, OutroSpawns[1]);
                    }
                    if (data == DONE)
                    {
                        if (GameObject *pChest = instance->GetGameObject(uiChest))
                               pChest->SetPhaseMask(1, true);
                        if (GameObject *pPortal = instance->GetGameObject(uiPortal))
                               pPortal->SetPhaseMask(1, true);

                        //ToDo Complete Achievement ACHIEV_HALLS_OF_REFLECTION_N
                        if (instance->IsHeroic())
                        {
                        //ToDo Complete Achievement(ACHIEV_HALLS_OF_REFLECTION_H);
                               DoCastSpellOnPlayers(SPELL_ACHIEV_CHECK);
                               DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
                        }
                    }
                    break;
                case DATA_WAVES_BEGIN:
                    uiWaveBegin = data;
                    break;
                 case DATA_SUMMONS:
                    if (data == 3) uiSummons = 0;
                    else if (data == 1) ++uiSummons;
                    else if (data == 0) --uiSummons;
                    data = NOT_STARTED;
                    break;
                case DATA_ICE_WALL_1:
                    uiWall[0] = data;
                    break;
                case DATA_ICE_WALL_2:
                    uiWall[1] = data;
                    break;
                case DATA_ICE_WALL_3:
                    uiWall[2] = data;
                    break;
                case DATA_ICE_WALL_4:
                    uiWall[3] = data;
                    break;
                case DATA_PHASE:
                    uiDataPhase = data;
                    break;
            }

            if (data == DONE)
                SaveToDB();
        }