Ejemplo n.º 1
0
/*
* This is used to spawn creatures
*/
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::OnUpdate(uint32 const diff)
{
    if(GetEventStatus() < TD_EVENT_STATUS_RUNNING) // if wave is not running
        return;

    Events.Update(diff);

    Player* player = GetPlayer();
    if(!player)
        return;
    while (uint32 eventId = Events.ExecuteEvent())
    {
        switch (eventId)
        {

        case TD_EVENT_DATA_START_MUSIC_TIMER: // this is just some event music to make it feel alive.
            {
                Events.RescheduleEvent(TD_EVENT_DATA_START_MUSIC_TIMER, 240000); // repeat every 4 min, length of track
            }
            break;
        case TD_EVENT_DATA_START_WAVE_TIMER:
            {
                switch(CountDown)
                {
                case 0:
                    player->PlayDirectSound(TD_STARTWAVE_MUSIC,player);
                    SendMessageToPlayer(TD_SYSTEM_MSG_WAVE_STARTING_IN,3);
                    Events.RescheduleEvent(TD_EVENT_DATA_START_WAVE_TIMER, 1000);
                    ++CountDown;
                    break;

                case 1:
                    SendMessageToPlayer(TD_SYSTEM_MSG_WAVE_STARTING,2);
                    Events.RescheduleEvent(TD_EVENT_DATA_START_WAVE_TIMER, 1000);
                    ++CountDown;
                    break;

                case 2:
                    player->PlayDirectSound(TD_STARTWAVE_MUSIC,player);
                    SendMessageToPlayer(TD_SYSTEM_MSG_WAVE_STARTING,1);
                    Events.CancelEvent(TD_EVENT_DATA_START_WAVE_TIMER);
                    Events.ScheduleEvent(TD_EVENT_DATA_START_WAVE_MODE, 1000);
                    ++CountDown;
                    break;
                }
            }
            break;
        case TD_EVENT_DATA_START_WAVE_MODE:
            {
                CountDown = 0;
                SetEventStatus(TD_EVENT_STATUS_LOADING); // set wave status to running so the boss npc can start spawning
                SendMessageToPlayer(TD_SYSTEM_MSG_WAVE_STARTING_GO);
                Events.CancelEvent(TD_EVENT_DATA_START_WAVE_MODE);
                RecordLog("TowerDefense: Wave Id: [%u] is now running.", GetCurrentWaveId());
            }
            break;
        }
    }
}
Ejemplo n.º 2
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::SellGuard(uint64 guid)
{
    if(!guid)
        return;
    Player* player = GetPlayer();
    if(!player)
        return;
    Creature* creature = player->GetMap()->GetCreature(guid);
    if(!creature)
        return;
    uint32 entry = GUID_ENPART(guid);
    if (Guards.find(guid) != Guards.end())
    {
        GuardInfo* guard = Guards[guid];
        if(QueryResult queryResult = CharacterDatabase.PQuery("SELECT creatureName, creatureEntry, creatureCost FROM custom_td_base_stats WHERE creatureEntry = '%u'", entry))
        {   
            creature->CastSpell(creature, GetSpellIdByUniqueId(5),true);
            uint32 SellPrice = guard->GetSellPrice(guard->GetLevel());
            switch(GetEventMode())
            {
            case TD_EVENT_MODE_HARD:
                SellPrice = SellPrice - (SellPrice/4);
                break;
            case TD_EVENT_MODE_EXTREME:
                SellPrice = SellPrice - (SellPrice/2);
                break;
            }
            UpdateResources(TD_EVENT_INC,SellPrice);
            SendMessageToPlayer(TD_SYSTEM_MSG_SOLD_TOWER_FOR, creature->GetName(),SellPrice);
            creature->DisappearAndDie();
            Guards.erase(guid);
        }
    } 
}
Ejemplo n.º 3
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::StartEvent(Player* player, uint32 Action)
{
    if (!player || player->isInCombat() || player->GetSession()->isLogingOut() || player->GetGroup()){
        ChatHandler(player).SendSysMessage(TD_SYSTEM_MSG_CANNOT_START_DUE);
        return;
    }
    if(GetPlayer() && player->GetGUIDLow() != GetPlayer()->GetGUIDLow()){
        ChatHandler(player).SendSysMessage(TD_SYSTEM_MSG_CANNOT_START_ALREADY);
        return;
    }else{
        SetPlayer(player);
    }

    if(!player)
        return;

    player->PlayDirectSound(TD_STARTEVENT_MUSIC,player);
    SetupEventData();
    player->AddItem(34131, 1); // add the spawning item to the player
    player->SaveToDB(); // save the player to the db in case of crash
    player->TeleportTo(GetMapId(), GetPSpawnX(), GetPSpawnY(), GetPSpawnZ(), GetPSpawnO()); // teleport to starting location
    SetEventStatus(TD_EVENT_STATUS_TELEPORT);
    switch(Action)
    {
    case 1051: // Easy
        SetEventMode(TD_EVENT_MODE_EASY);
        SendMessageToPlayer(TD_SYSTEM_MSG_STARTED_EVENT_EASY); 
        // wait for user input to start wave
        break;
    case 1052: // Hard
        SetEventMode(TD_EVENT_MODE_HARD);
        SendMessageToPlayer(TD_SYSTEM_MSG_STARTED_EVENT_HARD);
        StartNextWave(30000); // start wave from the start within 30 seconds
        break;
    case 1053: // Extreme
        SetEventMode(TD_EVENT_MODE_EXTREME);
        SendMessageToPlayer(TD_SYSTEM_MSG_STARTED_EVENT_EXTREME);
        StartNextWave(1000); // start waves right away
        break;
    }
    RecordLog("TowerDefense: Player Name: [%s] has started the tower defense event. With Event Id: [%u]",player->GetName(), GetEventId());
}
Ejemplo n.º 4
0
void Arena::HandleBattlegroundEvent(Object *src, Object *dst, uint16 EventID, uint32 params1, uint32 params2)
{
	WorldPacket data;

	switch(EventID)
	{
	case BGEVENT_AB_PLAYER_DEATH:
		{
			Player *Source = ((Player*)src);
			if(!Source || src->GetTypeId() != TYPEID_PLAYER) return;

			uint64 guid = Source->GetGUID();
			std::map<uint64, BattlegroundScore>::iterator itr = m_PlayerScores.find(guid);
			if(itr == m_PlayerScores.end())
			{
				SendMessageToPlayer(Source, "INTERNAL ERROR: Could not find in internal player score map!", true);
				return;
			}
			itr->second.Deaths++;
			UpdatePVPData();
		}break;
	case BGEVENT_AB_PLAYER_KILL:
		{
			Player *Source = ((Player*)src);
			if(!Source || src->GetTypeId() != TYPEID_PLAYER) return;

			uint64 guid = Source->GetGUID();
			std::map<uint64, BattlegroundScore>::iterator itr = m_PlayerScores.find(guid);
			if(itr == m_PlayerScores.end())
			{
				SendMessageToPlayer(Source, "INTERNAL ERROR: Could not find in internal player score map!", true);
				return;
			}
			itr->second.KillingBlows++;
			UpdatePVPData();
		}break; 
   }	
}
Ejemplo n.º 5
0
        void TeleportToEvent(Player* player, Creature* creature)
        {

            QueryResult result = LoginDatabase.PQuery("SELECT x, y, z, map, reqLevel FROM rebirth_next_event WHERE active = 1");

            if (result && isActive())
            {
                Field* field = result->Fetch();
                float x = field[0].GetFloat();
                float y = field[1].GetFloat();
                float z = field[2].GetFloat();
                int map = field[3].GetInt32();
                int reqLevel = field[4].GetInt32();

                if (player->getLevel() >= reqLevel)
                    player->TeleportTo(map, x, y, z, 0.0f, 0);
                else
                    SendMessageToPlayer(player, creature,"Deine Stufe ist zu niedrig um an diesem Event teilnehmen zu koennen!");
            }

            else if (!isActive())
                SendMessageToPlayer(player, creature,"Der Event Teleport wurde noch nicht vom Eventleiter aktiviert!");
        }
Ejemplo n.º 6
0
        void RequestRebirthPoints(Player* player, Creature* creature)
        {

            QueryResult result = LoginDatabase.PQuery("SELECT rebirth_punkte FROM account WHERE id = %u", player->GetSession()->GetAccountId());

            if (result)
            {
                Field* field = result->Fetch();
                uint32 eventPunkte = field[0].GetUInt32();
                char str_info[200];
                sprintf(str_info,"Du hast %u Rebirth Punkte!", eventPunkte);
                player->PlayerTalkClass->ClearMenus();
                player->MonsterWhisper(str_info,player->GetGUID(),true);
                OnGossipHello(player, creature);
            }

            else if (!result)
                SendMessageToPlayer(player, creature,"Es ist ein Fehler aufgetreten. Bitte wende dich an einen Administrator und melde FehlerID 100!");

        }
Ejemplo n.º 7
0
        void RequestNextEvents(Player* player, Creature* creature)
        {

            QueryResult result = LoginDatabase.PQuery("SELECT FROM_UNIXTIME(date), type, reqLevel FROM rebirth_next_event WHERE date > UNIX_TIMESTAMP()");

            if (result)
            {
                do
                {
                     Field* field = result->Fetch();
                     std::string eventType = "";
                     std::string date = field[0].GetCString();
                     uint32 type = field[1].GetUInt32();
                     uint32 reqLevel = field[2].GetUInt32();

                     if (type == 0)
                         eventType = "PvP";
                     else if (type == 1)
                         eventType = "PvE";
                     else if (type == 2)
                         eventType = "Fun";
                     else
                         eventType = "Sonstiges";

                     char str_info[200];
                     sprintf(str_info,"Event Info: Datum: %s || Typ: %s || Empfohlenes Level: %u",date.c_str(),eventType.c_str(),reqLevel);
                     player->PlayerTalkClass->ClearMenus();
                     player->MonsterWhisper(str_info,player->GetGUID(),true);
                     OnGossipHello(player, creature);

                } while (result->NextRow());
            }
            else
                SendMessageToPlayer(player, creature,"Es ist zurzeit kein Event in Planung!");

        }
Ejemplo n.º 8
0
char* CNWNXMessages::OnRequest(char *gameObject, char* Request, char* Parameters){

	switch(atoi(Request)){
		
		case 1: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 1 ) ); break;
		case 2: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 2 ) ); break;
		case 3: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 3 ) ); break;
		case 4: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 4 ) ); break;
		case 5: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 5 ) ); break;
		case 6: sprintf( Parameters, "%i", SendMessageToPlayer( (CNWSObject *)gameObject, Parameters, 6 ) ); break;
		case 7: ScrambleMessage( Parameters ); break;
		case 8: GetLanguageID( Parameters ); break;
		case 9: GetLanguageLevel( Parameters ); break;
		case 10: GetLanguageName( Parameters ); break;
		case 11: GetLanguageIDInIndex( Parameters ); break;
		case 12: Parameters[0]='\"'; Parameters[1]='\0'; break;
		default:break;
	}

	return NULL;
}
Ejemplo n.º 9
0
    	bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 , uint32 uiAction)
    	{
        	pPlayer->PlayerTalkClass->ClearMenus();
       	    QueryResult resultEvent;
            QueryResult resultVote;
            

            switch (uiAction)
            {
                case REQ_REBIRTHPOINTS:
                    RequestRebirthPoints(pPlayer, pCreature);
                    break;

                case REQ_NEXT_EVENTS:
                    RequestNextEvents(pPlayer, pCreature);
                    break;

                case EVENT_TELEPORT:
                    TeleportToEvent(pPlayer, pCreature);
                    break;

                case MAIN_MENU:
                    OnGossipHello(pPlayer,pCreature);
                    break;

                case EVENT_CATEGORIES: //EventReward Menu
                    resultEvent = WorldDatabase.PQuery("SELECT id, name FROM rebirth_reward_categorie");

                    if (resultEvent)
                    {

                        do
                        {
                            Field* field = resultEvent->Fetch();
                            int catId = field[0].GetInt32();
                            std::string catName = field[1].GetCString();
                            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, catName.c_str(), GOSSIP_SENDER_MAIN, catId+100);
                        } while (resultEvent->NextRow());

                        pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, ">> Hauptmenue <<", GOSSIP_SENDER_MAIN, 5);
                        pPlayer->PlayerTalkClass->SendGossipMenu(907, pCreature->GetGUID());

                    }
                    break;
            }


                /*
                    Hier wird die Liste der Rewards erstellt
                    ToDo: Eine schönere Umsetzung finden
                */
                if (uiAction >= 100 && uiAction < 1000)
                {
                    QueryResult result = WorldDatabase.PQuery("SELECT id, name, type, param1, param2, param3, cost FROM rebirth_rewards WHERE catid = %u", uiAction-100);

                    if (result)
                    {
                        do
                        {
                           Field* field = result->Fetch();
                           int id = field[0].GetInt32();
                           std::string name = field[1].GetCString();
                           int cost = field[6].GetInt32();

                           char str_info[200];
                           sprintf(str_info,"%s (%d RP)",name.c_str(), cost);
                           sLog->outError(str_info);
                           pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, str_info, GOSSIP_SENDER_MAIN, id+1000);
                           
                        } while (result->NextRow());
                        pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, ">> Kategorien <<", GOSSIP_SENDER_MAIN, 4);
                        pPlayer->PlayerTalkClass->SendGossipMenu(907, pCreature->GetGUID());
                    }
                }


                /*
                    Ab hier werden die Belohnungen vergeben
                    ToDo: Eine schönere Umsetzung finden
                */
                if (uiAction >= 1000 && uiAction < 10000)
                {
                    QueryResult result = WorldDatabase.PQuery("SELECT type, param1, param2, param3, cost, condition_type, cond_value1, cond_value2, cond_value3, negation, script_id FROM rebirth_rewards WHERE id = %u AND catid != ''", uiAction-1000);
                    QueryResult resulta = LoginDatabase.PQuery("SELECT rebirth_punkte FROM account WHERE id = %u", pPlayer->GetSession()->GetAccountId());

                    int pRP = 0;
                    if (resulta)
                    {

                        Field* field = resulta->Fetch();
                        int pRP = field[0].GetInt32();
                    
                        if (result)
                        {

                            Field* field = result->Fetch();
                            int type = field[0].GetInt32();
                            int param1 = field[1].GetInt32();
                            int param2 = field[2].GetInt32();
                            int param3 = field[3].GetInt32();
                            int cost = field[4].GetInt32();
                            int condition = field[5].GetInt32();
                            int cond_value1 = field[6].GetInt32();
                            int cond_value2 = field[7].GetInt32();
                            int cond_value3 = field[8].GetInt32();
                            int negation = field[9].GetInt32();
                            int scriptID = field[10].GetInt32();
                            
                            switch (type)
                            {

                               case REWARD_TYPE_ITEM:
                               {
                                   if (cost <= pRP)
                                   {
                                       Item* item = pPlayer->GetItemByEntry(param1);

                                       if (pPlayer->HasItemCount(param1, 1, true))
                                       {
                                           if (item->GetTemplate()->MaxCount <= pPlayer->GetItemCount(param1, true, 0))
                                           {
                                               SendMessageToPlayer(pPlayer, pCreature, "Du hast bereits die maximale Anzahl dieses Gegenstands erreicht. Du kannst keine weiteren aufnehmen!");
                                               pPlayer->PlayerTalkClass->ClearMenus();
                                               OnGossipHello(pPlayer, pCreature);
                                               return true;
                                           }
                                       }

                                       if (CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->AddItem(param1, param2);
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                       }
                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");

                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");

                                   break;
                               }

                               case REWARD_TYPE_HONOR:
                               {
                                   if (cost <= pRP)
                                   {
                                       if (pPlayer->GetHonorPoints() + param1 <= 75000 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->ModifyHonorPoints(param1);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }
                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");

                                   break;
                               }

                               case REWARD_TYPE_TITLE:
                               {
                                   if (cost <= pRP)
                                   {
                                       CharTitlesEntry const* title;
                                       title = sCharTitlesStore.LookupEntry(param1);

                                       if (!pPlayer->HasTitle(title) && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->SetTitle(title);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }
                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");

                                   break;
                               }

                               case REWARD_TYPE_XP: 
                               {
                                   if (cost <= pRP)
                                   {
                                       if (pPlayer->getLevel() < 80 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->GiveXP(param1,pPlayer,1.0f);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }

                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
                                   break;
                               }

                               case REWARD_TYPE_SPELL:
                               {
                                   if (cost <= pRP)
                                   {
                                       if (!pPlayer->HasSpell(param1) && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->learnSpell(param1,false);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }

                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
                                   break;
                               }

                               case REWARD_TYPE_BUFF:
                               {
                                   if (cost <= pRP)
                                   {
                                       sLog->outError("CheckCondition(%d, cond_value1, cond_value2, cond_value3, negation, pPlayer)",condition);
                                       if (CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           sLog->outError("true>>");
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->AddAura(param1,pPlayer);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }

                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");
                                   break;
                               }

                               case REWARD_TYPE_ARENA:
                               {
                                   if (cost <= pRP)
                                   {
                                       if (pPlayer->GetArenaPoints() + param1 <= 4000 && CheckCondition(condition, cond_value1, cond_value2, cond_value3, negation, pPlayer))
                                       {
                                           RewardScript(pPlayer, scriptID);
                                           pPlayer->ModifyArenaPoints(param1);
                                           LoginDatabase.PExecute("UPDATE account SET rebirth_punkte = rebirth_punkte - %d WHERE id = %u", cost, pPlayer->GetSession()->GetAccountId());
                                           SendMessageToPlayer(pPlayer, pCreature, "Du hast eine Belohnung erhalten!");
                                       }
                                       else
                                           SendMessageToPlayer(pPlayer, pCreature, "Du erfuellst die Voraussetzungen nicht um diese Belohnung kaufen zu koennen!");
                                   }

                                   else
                                       SendMessageToPlayer(pPlayer, pCreature, "Du hast nicht genug Punkte um diese Belohnung zu kaufen!");

                                   break;
                               }
                            }
                        }
                    }
                }

            return true;
       }
Ejemplo n.º 10
0
void AlteracValley::HandleBattlegroundEvent(Object *src, Object *dst, uint16 EventID, uint32 params1, uint32 params2)
{
	WorldPacket data;

	switch(EventID)
	{
	case BGEVENT_AV_GENERAL_DEAD_HORDE:
		{	
			// Play sound
			WorldPacket pkt;
			pkt.Initialize(SMSG_PLAY_SOUND);
			pkt << uint32(SOUND_ALLIANCEWINS);
			SendPacketToAll(&pkt);
			
			// set battleground win
			SetBattleGroundStatus(true);
			// alliance wins
			SetBattleGameWin(true);
	
			UpdatePVPData();
		}break;	
	case BGEVENT_AV_GENERAL_DEAD_ALLIANCE:	
		{	
			// Play sound
			WorldPacket pkt;
			pkt.Initialize(SMSG_PLAY_SOUND);
			pkt << uint32(SOUND_HORDEWINS);
			SendPacketToAll(&pkt);
	
			// set battleground win
			SetBattleGroundStatus(true);
			// horde wins
			SetBattleGameWin(false);
	
			UpdatePVPData();
		}break;	
	case BGEVENT_AV_PLAYER_DEATH:
		{
			Player *Source = ((Player*)src);
			if(!Source || src->GetTypeId() != TYPEID_PLAYER) return;

			uint64 guid = Source->GetGUID();
			std::map<uint64, BattlegroundScore>::iterator itr = m_PlayerScores.find(guid);
			if(itr == m_PlayerScores.end())
			{
				SendMessageToPlayer(Source, "INTERNAL ERROR: Could not find in internal player score map!", true);
				return;
			}
			itr->second.Deaths++;
			UpdatePVPData();
		}break;
	case BGEVENT_AV_PLAYER_KILL:
		{
			Player *Source = ((Player*)src);
			if(!Source || src->GetTypeId() != TYPEID_PLAYER) return;

			uint64 guid = Source->GetGUID();
			std::map<uint64, BattlegroundScore>::iterator itr = m_PlayerScores.find(guid);
			if(itr == m_PlayerScores.end())
			{
				SendMessageToPlayer(Source, "INTERNAL ERROR: Could not find in internal player score map!", true);
				return;
			}
			itr->second.KillingBlows++;
			UpdatePVPData();
		}break;
	}	
}
Ejemplo n.º 11
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::UpdateHealth(uint32 remove)
{
    if(!remove)
        return;

    Player *player = GetPlayer();
    if(!player)
        return;

    uint32 currentHealth = GetBaseHealth();
    if(remove > currentHealth){
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_DEST); // the removal from the base health is larger than the base health. the player's event ends.
        player->PlayDirectSound(TD_ENDEVENT_MUSIC,player); // play ending music
        player->GetSession()->SendNotification("The Tower defense game has finished. You lost!");
        HandleEventComplete(TD_EVENT_COMPLETE_LOST); // Complete the event data using the lost type
        RecordLog("TowerDefense: Player Name: [%s] has lost the tower defense event. With Event Id: [%u]",player->GetName(), GetEventId()); // record a log to the server log if enabled.
        return;
    }else {
        currentHealth -= remove;  // decrement current health
        SetBaseHealth(currentHealth);
        RecordLog("TowerDefense: Updated health for Event Id: [%u] to [%u].", GetEventId(), currentHealth);
    }

    switch(currentHealth)
    {
    case 90:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_REACHED, 90);
        break;
    case 80:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_LOWERING, 80);
        break;
    case 70:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_REACHED, 70);
        break;
    case 60:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_LOWERING, 60);
        break;
    case 50:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_REACHED, 50);
        break;
    case 40:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_LOW);
        player->CastSpell(player,GetSpellIdByUniqueId(3),true);
        player->PlayDirectSound(TD_ENDEVENT_MUSIC,player);
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_REACHED, 40);
        break;
    case 25:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_VERYLOW);
        player->CastSpell(player,GetSpellIdByUniqueId(2),true);
        player->PlayDirectSound(TD_BASE_LOSING_HEALTH,_player);
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_LOWERING, 25);
        break;
    case 10:
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_REACHED, 10);
        SendMessageToPlayer(TD_SYSTEM_MSG_HEALTH_ALMOSTDEST);
        break;
    }
    return;
}
Ejemplo n.º 12
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::HandleEventComplete(TDEventCompleteType completeType)
{
    Player *player = GetPlayer();
    if(!player)
        return;
    if(!completeType)
        return;

    switch(completeType)
    {
    case TD_EVENT_COMPLETE_UNFINISHED:
        {
            if(IsAwardingFledPlayers()){
                UpdatePlayerStats(GetPlayerGUID(), TD_PLAYER_STAT_CURRENT_RESOURCES, GetResources());
                SendMailToPlayer(NULL, GetPlayerGUID(), TD_SYSTEM_MSG_MAIL_BODY_EVENT_UNFINISHED, GetResources());
                RecordLog("TowerDefense: Player: [%s] has received: [%u] resources due to an unfinished Event Id: [%u].", player->GetName(), GetResources(), GetEventId());
            }else{
                SendMailToPlayer(NULL, GetPlayerGUID(), TD_SYSTEM_MSG_MAIL_BODY_EVENT_UNFINISHED_FLED, GetResources(), GetCurrentWaveId());
                RecordLog("TowerDefense: Player: [%s] was informed that he lost all his unfinished Event Id: [%u] rewards.", player->GetName(), GetResources(), GetEventId());
            }
            UpdatePlayerStats(player->GetGUIDLow(), TD_PLAYER_STAT_EVENTS_UNFINISHED, 1);
        }break;
    case TD_EVENT_COMPLETE_QUIT:
        {
            if(player->GetSession()->isLogingOut()){
                SendMessageToPlayer(TD_SYSTEM_MSG_LOGGING_OUT);
                return;
            }
            if(GetCurrentWaveId() < GetQuitAfterWave()){
                uint32 remaining = GetQuitAfterWave() - GetCurrentWaveId();
                SendMessageToPlayer(TD_SYSTEM_MSG_MORE_WAVES, remaining);
                return;
            }
            SendMessageToPlayer(TD_SYSTEM_MSG_QUIT_EVENT, GetResources(), GetCurrentWaveId());
            UpdatePlayerStats(GetPlayerGUID(), TD_PLAYER_STAT_CURRENT_RESOURCES, GetResources());
            UpdatePlayerStats(player->GetGUIDLow(), TD_PLAYER_STAT_EVENTS_LOST, 1);
            RecordLog("TowerDefense: Player: [%s] has received: [%u] resources after leaving Event Id: [%u].", player->GetName(), GetResources(), GetEventId());
        }break;
    case TD_EVENT_COMPLETE_LOST:
        {
            player->PlayDirectSound(TD_ENDEVENT_MUSIC,_player);
            SendMessageToPlayer(TD_SYSTEM_MSG_LOST_EVENT, GetResources(), GetCurrentWaveId());
            UpdatePlayerStats(player->GetGUIDLow(), TD_PLAYER_STAT_EVENTS_LOST, 1);
            RecordLog("TowerDefense: Player: [%s] was informed that he lost all his Event Id: [%u] rewards.", player->GetName(), GetResources(), GetEventId());
        }break;
    case TD_EVENT_COMPLETE_WON:
        {
            SendMessageToPlayer(TD_SYSTEM_MSG_WON_EVENT, GetResources());
            UpdatePlayerStats(GetPlayerGUID(), TD_PLAYER_STAT_CURRENT_RESOURCES, GetResources());
            UpdatePlayerStats(player->GetGUIDLow(), TD_PLAYER_STAT_EVENTS_WON, 1);
            RecordLog("TowerDefense: Player: [%s] has won [%u] resources after completing Event Id: [%u].", player->GetName(), GetResources(), GetEventId());
        }break;
    }
    player->DestroyItemCount(GetItemEntry(),1,true); // destroy the item from the player
    player->TeleportTo(1, -3673.392090, -4384.723145, 10.026433,  3.879712); // Teleport to a Neutral Mall
    player->RemoveAllAuras(); // remove all auras set by event
    player->RemoveAllAttackers(); // remove all attackers
    SetFinished(true); // finish the event
    SaveEventData(); // save event information
    RecordLog("TowerDefense: Player: [%s] has completed Event Id: [%u] and his event data was saved and he was teleported.", player->GetName(), GetEventId());
    DeleteEventData();
}
Ejemplo n.º 13
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::UpgradeGuard(uint64 guid)
{
    if(!guid)
        return;
    Player* player = GetPlayer();
    if(!player)
        return;

    Creature* creature = player->GetMap()->GetCreature(guid);
    if(!creature)
        return;
    uint32 currentLevel = 0;
    uint32 entry = GUID_ENPART(guid);
    if (Guards.find(guid) != Guards.end())
    {
        GuardInfo* guard = Guards[guid];
        currentLevel = guard->Level;
        uint32 newLevel = currentLevel +1;
        if(QueryResult queryResult = CharacterDatabase.PQuery("SELECT creatureName, creatureEntry, creatureCost FROM custom_td_base_stats WHERE creatureEntry = '%u'", entry))
        {   
            uint32 UpgradeCost = guard->GetUpgradeCost();
            switch(GetEventMode())
            {
            case TD_EVENT_MODE_HARD:
                UpgradeCost = UpgradeCost + (UpgradeCost/4);
                break;
            case TD_EVENT_MODE_EXTREME:
                UpgradeCost = UpgradeCost + (UpgradeCost/2);
                break;
            }
            if(GetResources() < UpgradeCost){
                SendMessageToPlayer(TD_SYSTEM_MSG_MORE_RESOURCES_UPG, UpgradeCost - GetResources());
                return;
            }
            if(QueryResult queryResult = CharacterDatabase.PQuery("SELECT * FROM custom_td_base_levels WHERE creatureEntry = '%u' AND creatureLevel = '%u'", entry, newLevel))
            {
                creature->CastSpell(creature, GetSpellIdByUniqueId(4),true); // upgrade level visual
                guard->SetLevel(newLevel);
                UpdateResources(TD_EVENT_DEC,UpgradeCost); // remove resource cost from player
                creature->RemoveAllAuras(); // remove all auras to apply new ones.
                SendMessageToPlayer(TD_SYSTEM_MSG_UPGRADED_TOWER_FOR, creature->GetName(),UpgradeCost);

                Field* Fields = queryResult->Fetch();

                uint32 newDefaultSpell = Fields[4].GetUInt32();
                if(newDefaultSpell)
                    guard->SetDefSpell(newDefaultSpell);

                uint32 newAttackSpeed = Fields[9].GetUInt32();
                if (newAttackSpeed)
                    guard->SetAttSpeed(newAttackSpeed);

                float newAttackDistance = Fields[8].GetFloat();
                if(newAttackDistance)
                    guard->SetAttackDistance(newAttackDistance);

                uint32 newAura = Fields[7].GetUInt32();
                if(newAura)
                    creature->CastSpell(creature,newAura,true);

                uint32 newDisplay = Fields[6].GetUInt32();
                if(newDisplay)
                    creature->SetDisplayId(newDisplay);

                float  newScale = Fields[5].GetFloat();
                if(newScale)
                    creature->SetObjectScale(newScale);

                uint32 newDamage = Fields[10].GetUInt32();
                if (newDamage)
                    guard->SetDamage(newDamage);

                uint32 newIsAntiAir = Fields[11].GetBool();
                if (newIsAntiAir)
                    guard->SetIsAntiAir(newIsAntiAir);

                uint32 newIsAntiGround = Fields[12].GetBool();
                if (newIsAntiGround)
                    guard->SetIsAntiGround(newIsAntiGround);
            }
        }
    } 
}
Ejemplo n.º 14
0
void TowerDefenseInstanceScript::TowerDefenseMapInstanceScript::SpawnGuard(uint32 entry)
{
    if (!entry)
        return;
    Player *player = GetPlayer();
    if(!player)
        return;

    GuardInfo* guard = new GuardInfo();
    bool found = false;
    float objectX, objectY, objectZ, objectO;
    uint32 objectLowGUID, objectId;
    uint16 objectMap, objectPhase;
    uint32 objectPool;
    GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();

    std::ostringstream eventFilter;
    eventFilter << " AND (eventEntry IS NULL ";
    bool initString = true;

    for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
    {
        if (initString)
        {
            eventFilter  <<  "OR eventEntry IN (" << *itr;
            initString = false;
        }
        else
            eventFilter << ',' << *itr;
    }

    if (!initString)
        eventFilter << "))";
    else
        eventFilter << ')';

    QueryResult queryResult = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, "
        "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject "
        "LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10",
        player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(),player->GetMapId(), eventFilter.str().c_str());

    if (!queryResult)
    {  
        SendMessageToPlayer(TD_SYSTEM_MSG_NO_NEARBY_PLATFORM);  // if there were no nearby platforms to place guards.
        return;
    }
    do
    {
        Field* fields = queryResult->Fetch();
        objectLowGUID = fields[0].GetUInt32();
        objectId =      fields[1].GetUInt32();
        objectX =       fields[2].GetFloat();
        objectY =       fields[3].GetFloat();
        objectZ =       fields[4].GetFloat();
        objectO =       fields[5].GetFloat();
        objectMap =   fields[6].GetUInt16();
        objectPhase =   fields[7].GetUInt16();
        objectPool =  sPoolMgr->IsPartOfAPool<GameObject>(objectLowGUID);
        if (!objectPool || sPoolMgr->IsSpawnedObject<GameObject>(objectLowGUID))
            found = true;
    } while (queryResult->NextRow() && !found);

    if (!found)
    {
        SendMessageToPlayer(TD_SYSTEM_MSG_NEARBY_PLATFORM_NOT_EXIST); // no nearby platform found
        return;
    }

    GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId);
    if (!objectInfo)
    {
        SendMessageToPlayer(TD_SYSTEM_MSG_NEARBY_PLATFORM_NOT_EXIST); // nearby platform is not an actual object
        return;
    }
    guard->Entry = entry;
    guard->X = objectX;
    guard->Y = objectY;
    guard->Z = objectZ + 0.5; // depends on size of platform object
    guard->O = objectO;
    if(player->GetDistance(objectX,objectY,objectZ) > 3)
    {
        SendMessageToPlayer(TD_SYSTEM_MSG_NEARBY_PLATFORM_TOO_FAR);
        return;
    }else 
    {
        if(QueryResult queryResult = CharacterDatabase.PQuery("SELECT creatureEntry FROM custom_td_base_stats WHERE creatureType = 'Guard' ORDER BY Id ASC LIMIT 1"))
        {
            do
            {
                Field *Fields = queryResult->Fetch();
                uint32 creatureEntry = Fields[0].GetUInt32();

                Creature* creature = player->FindNearestCreature(creatureEntry,2,true);
                if(creature){
                    SendMessageToPlayer(TD_SYSTEM_MSG_NEARBY_GUARD_TOO_CLOSE);
                    return;
                }
            }while(queryResult->NextRow());
        }

        if(QueryResult queryResult = CharacterDatabase.PQuery("SELECT creatureName, creatureEntry, creatureCost FROM custom_td_base_stats WHERE creatureEntry = '%u'", entry))
        {
            Field *Fields = queryResult->Fetch();
            std::string creatureName = Fields[0].GetString();
            uint32 creatureEntry = Fields[1].GetUInt32();
            uint32 creatureCost = Fields[2].GetUInt32();
            if(GetResources() < creatureCost)
            {
                SendMessageToPlayer(TD_SYSTEM_MSG_MORE_RESOURCES, creatureCost - GetResources());
                return;
            }else
            {
                guard->Spawn(player);
                Guards[guard->Guid] = guard;
                guard->SetDefSpell(guard->GetSpellIdByCastType(TD_CAST_DEFAULT_CAST_TARGET)); // set default spell
                UpdateResources(TD_EVENT_DEC,creatureCost);
                SendMessageToPlayer(TD_SYSTEM_MSG_BOUGHT_GUARD, creatureName.c_str(), creatureCost);
                RecordLog("TowerDefense: Event ID: [%u] has spawned Guard Entry: [%u] for [%u] resources.", GetEventId(), guard->Entry,creatureCost);
            }  
        }
    }
}