/* * 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; } } }
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); } } }
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()); }
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; } }
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!"); }
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!"); }
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!"); }
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; }
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; }
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; } }
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; }
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(); }
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); } } } }
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); } } } }