From 50b3095312ef01dcc748011d740a8fadfaa04b6c Mon Sep 17 00:00:00 2001 From: megamage Date: Fri, 6 Mar 2009 15:21:44 -0600 Subject: Implement some death related achievements * ACHIEVEMENT_CRITERIA_TYPE_DEATH (normal and arena types counting) * ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON (instance types by man limit counting) Note: need fixed for cases when max allowed players different from recommended count. * ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM (environment damage sources by types) Fixed: * ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER - self-kill counting as death from players - same team player kill in opposition kills counter. Also cleanup in Player::EnvironmentalDamage use DBCStructure.h comment. Author: VladimirMangos --HG-- branch : trunk --- src/game/AchievementMgr.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++-- src/game/Player.cpp | 26 ++++++---- src/game/Unit.cpp | 25 +++++----- 3 files changed, 138 insertions(+), 25 deletions(-) (limited to 'src/game') diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index d4dd1faa840..b06a2f1c758 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -27,6 +27,7 @@ #include "GameEvent.h" #include "World.h" #include "SpellMgr.h" +#include "ArenaTeam.h" #include "ProgressBar.h" #include "GridNotifiersImpl.h" #include "CellImpl.h" @@ -374,6 +375,18 @@ void AchievementMgr::CheckAllAchievementCriteria() UpdateAchievementCriteria(AchievementCriteriaTypes(i)); } +static const uint32 achievIdByArenaSlot[MAX_ARENA_SLOT] = { 1057, 1107, 1108 }; +static const uint32 achievIdForDangeon[][4] = +{ + // ach_cr_id,is_dungeon,is_raid,is_heroic_dungeon + { 321, true, true, true }, + { 916, false, true, false }, + { 917, false, true, false }, + { 918, true, false, false }, + { 2219, false, false, true }, + { 0, false, false, false } +}; + /** * this function will be called whenever the user might have done a criteria relevant action */ @@ -408,7 +421,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { // std. case: increment at 1 case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: - case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if(!miscvalue1) continue; @@ -493,6 +505,79 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH: + { + // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case + if(!miscvalue1) + continue; + // skip wrong arena achievements, if not achievIdByArenaSlot then normal totla death counter + bool notfit = false; + for(int i = 0; i < MAX_ARENA_SLOT; ++i) + { + if(achievIdByArenaSlot[i] == achievement->ID) + { + BattleGround* bg = GetPlayer()->GetBattleGround(); + if(!bg || ArenaTeam::GetSlotByType(bg->GetArenaType())!=i) + notfit = true; + + break; + } + } + if(notfit) + continue; + + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; + } + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: + { + // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case + if(!miscvalue1) + continue; + + Map const* map = GetPlayer()->GetMap(); + if(!map->IsDungeon()) + continue; + + // search case + bool found = false; + for(int i = 0; achievIdForDangeon[i][0]; ++i) + { + if(achievIdForDangeon[i][0] == achievement->ID) + { + if(map->IsRaid()) + { + // if raid accepted (ignore difficulty) + if(!achievIdForDangeon[i][2]) + break; // for + } + else if(GetPlayer()->GetDifficulty()==DIFFICULTY_NORMAL) + { + // dungeon in normal mode accepted + if(!achievIdForDangeon[i][1]) + break; // for + } + else + { + // dungeon in heroic mode accepted + if(!achievIdForDangeon[i][3]) + break; // for + } + + found = true; + break; // for + } + } + if(!found) + continue; + + //FIXME: work only for instances where max==min for players + if(((InstanceMap*)map)->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit) + continue; + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; + + } case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if(!miscvalue1) @@ -501,6 +586,17 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: + // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case + if(!miscvalue1) + continue; + + // if team check required: must kill by opposition faction + if(achievement->ID==318 && miscvalue2==GetPlayer()->GetTeam()) + continue; + + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: { // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case @@ -518,6 +614,14 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, miscvalue1); break; } + case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: + // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case + if(!miscvalue1) + continue; + if(miscvalue2 != achievementCriteria->death_from.type) + continue; + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) SetCriteriaProgress(achievementCriteria, 1); @@ -680,10 +784,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: - case ACHIEVEMENT_CRITERIA_TYPE_DEATH: - case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: - case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: @@ -836,8 +937,11 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve // handle all statistic-only criteria here case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: + case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7bda4f64ed9..cf1e79e687b 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -898,6 +898,9 @@ void Player::StopMirrorTimer(MirrorTimerType Type) void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 damage) { + if(!isAlive() || isGameMaster()) + return; + WorldPacket data(SMSG_ENVIRONMENTALDAMAGELOG, (21)); data << (uint64)guid; data << (uint8)(type!=DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL); @@ -908,13 +911,18 @@ void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 da DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - if(type==DAMAGE_FALL && !isAlive()) // DealDamage not apply item durability loss at self damage + if(!isAlive()) { - DEBUG_LOG("We are fall to death, loosing 10 percents durability"); - DurabilityLossAll(0.10f,false); - // durability lost message - WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0); - GetSession()->SendPacket(&data); + if(type==DAMAGE_FALL) // DealDamage not apply item durability loss at self damage + { + DEBUG_LOG("We are fall to death, loosing 10 percents durability"); + DurabilityLossAll(0.10f,false); + // durability lost message + WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0); + GetSession()->SendPacket(&data); + } + + GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type); } } @@ -998,9 +1006,7 @@ void Player::HandleLava() uint64 guid = GetGUID(); uint32 damage = urand(600, 700); // TODO: Get more detailed information about lava damage - // if not gamemaster then deal damage - if ( !isGameMaster() ) - EnvironmentalDamage(guid, DAMAGE_LAVA, damage); + EnvironmentalDamage(guid, DAMAGE_LAVA, damage); m_breathTimer = 1*IN_MILISECONDS; } @@ -1385,6 +1391,8 @@ void Player::setDeathState(DeathState s) if(!ressSpellId) ressSpellId = GetResurrectionSpellId(); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); + GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1); + GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1); } Unit::setDeathState(s); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 60018a88a9c..da76612bec7 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -728,6 +728,7 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient()) ((Creature*)pVictim)->SetLootRecipient(this); + if (health <= damage) { DEBUG_LOG("DealDamage: victim just died"); @@ -805,12 +806,12 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa ((Creature*)this)->AI()->KilledUnit(pVictim); // achievement stuff - if ( pVictim->GetTypeId() == TYPEID_PLAYER) + if (pVictim->GetTypeId() == TYPEID_PLAYER) { - if(GetTypeId() == TYPEID_UNIT) + if (GetTypeId() == TYPEID_UNIT) ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); - else if(GetTypeId() == TYPEID_PLAYER) - ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1); + else if(GetTypeId() == TYPEID_PLAYER && pVictim != this) + ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ((Player*)this)->GetTeam()); } // 10% durability loss on death @@ -12482,14 +12483,14 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss) } } - // achievement stuff - if ( pVictim->GetTypeId() == TYPEID_PLAYER) - { - if(GetTypeId() == TYPEID_UNIT) - ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); - else if(GetTypeId() == TYPEID_PLAYER) - ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1); - } + // achievement stuff + if (pVictim->GetTypeId() == TYPEID_PLAYER) + { + if (GetTypeId() == TYPEID_UNIT) + ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); + else if(GetTypeId() == TYPEID_PLAYER && pVictim != this) + ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ((Player*)this)->GetTeam()); + } } void Unit::SetControlled(bool apply, UnitState state) -- cgit v1.2.3 From 93113cd3cc4f67bc685d39524a21e0d53d352ffb Mon Sep 17 00:00:00 2001 From: megamage Date: Fri, 6 Mar 2009 15:22:19 -0600 Subject: [7385] Fixed mail price calculation Author: VladimirMangos --HG-- branch : trunk --- src/game/Mail.cpp | 4 +--- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src/game') diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 978d8071ec5..8b5c5e5faf2 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -125,9 +125,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) return; } - uint32 cost = money + 30; - if (items_count) - cost = 30 * items_count; + uint32 cost = items_count ? 30 * items_count : 30; // price hardcoded in client uint32 reqmoney = cost + money; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 780e1fce4c3..fb8ea9d9143 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7384" + #define REVISION_NR "7385" #endif // __REVISION_NR_H__ -- cgit v1.2.3 From 6f595b30382e5104e4e4c744431284c9f4eda742 Mon Sep 17 00:00:00 2001 From: megamage Date: Fri, 6 Mar 2009 15:23:25 -0600 Subject: [7387] Check maxcount >= min count for item (not reference) record in loot templates DB tables.. Author: VladimirMangos --HG-- branch : trunk --- sql/mangos.sql | 30 ------------------------------ src/game/LootMgr.cpp | 7 +++++++ src/shared/revision_nr.h | 2 +- 3 files changed, 8 insertions(+), 31 deletions(-) (limited to 'src/game') diff --git a/sql/mangos.sql b/sql/mangos.sql index ae9773f02ae..a753455301a 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -1472,36 +1472,6 @@ CREATE TABLE `instance_template` ( LOCK TABLES `instance_template` WRITE; /*!40000 ALTER TABLE `instance_template` DISABLE KEYS */; -INSERT INTO `instance_template` VALUES -(33,0,22,30,10,10,7200,NULL,NULL,NULL,NULL,''), -(34,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''), -(36,0,15,20,10,10,7200,NULL,NULL,NULL,NULL,''), -(43,0,15,21,10,10,7200,NULL,NULL,NULL,NULL,''), -(47,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''), -(48,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''), -(70,0,35,47,10,10,7200,NULL,NULL,NULL,NULL,''), -(90,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''), -(109,0,45,55,10,10,7200,NULL,NULL,NULL,NULL,''), -(129,0,37,46,10,10,7200,NULL,NULL,NULL,NULL,''), -(189,0,34,45,10,10,7200,NULL,NULL,NULL,NULL,''), -(209,0,44,54,10,10,7200,NULL,NULL,NULL,NULL,''), -(229,0,58,0,10,10,120000,78.5083,-225.044,49.839,5.1,''), -(230,0,52,0,5,5,7200,NULL,NULL,NULL,NULL,''), -(249,0,60,0,40,40,432000,NULL,NULL,NULL,NULL,''), -(289,0,57,0,5,5,7200,NULL,NULL,NULL,NULL,''), -(309,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''), -(329,0,58,60,5,5,7200,NULL,NULL,NULL,NULL,''), -(349,0,46,55,10,10,7200,NULL,NULL,NULL,NULL,''), -(389,0,13,18,10,10,7200,NULL,NULL,NULL,NULL,''), -(409,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), -(429,0,55,60,5,5,7200,NULL,NULL,NULL,NULL,''), -(469,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), -(509,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''), -(531,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), -(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), -(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), -(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), -(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''); /*!40000 ALTER TABLE `instance_template` ENABLE KEYS */; UNLOCK TABLES; diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp index 77d8c780e1e..da5b4343d24 100644 --- a/src/game/LootMgr.cpp +++ b/src/game/LootMgr.cpp @@ -278,6 +278,13 @@ bool LootStoreItem::IsValid(LootStore const& store, uint32 entry) const store.GetName(), entry, itemid, chance); return false; } + + if( maxcount < mincountOrRef) // wrong max count + { + sLog.outErrorDb("Table '%s' entry %d item %d: max count (%u) less that min count (%i) - skipped", store.GetName(), entry, itemid, uint32(maxcount), mincountOrRef); + return false; + } + } else // mincountOrRef < 0 { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index fb8ea9d9143..160925670ff 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7385" + #define REVISION_NR "7387" #endif // __REVISION_NR_H__ -- cgit v1.2.3 From 13fc3dcd7e95288cd9482e7440df3b15a3c580cb Mon Sep 17 00:00:00 2001 From: megamage Date: Fri, 6 Mar 2009 15:25:20 -0600 Subject: [7388] Fixed battleground premature warning message. SQL files are attached, you must execute them! Author: Triply Fix for message's color will be soon. --HG-- branch : trunk --- sql/mangos.sql | 5 +++-- sql/updates/7388_01_mangos_mangos_string.sql | 3 +++ src/game/BattleGround.cpp | 28 ++++++++++++++++++++++++---- src/game/BattleGround.h | 1 + src/game/Language.h | 9 +++++++-- src/shared/revision_nr.h | 2 +- 6 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 sql/updates/7388_01_mangos_mangos_string.sql (limited to 'src/game') diff --git a/sql/mangos.sql b/sql/mangos.sql index a753455301a..cd306f1f69c 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_7382_01_mangos_creature_template` bit(1) default NULL + `required_7388_01_mangos_mangos_string` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -2812,7 +2812,6 @@ INSERT INTO `mangos_string` VALUES (723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), -(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), @@ -2833,6 +2832,8 @@ INSERT INTO `mangos_string` VALUES (744,'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (745,'Modification done.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), diff --git a/sql/updates/7388_01_mangos_mangos_string.sql b/sql/updates/7388_01_mangos_mangos_string.sql new file mode 100644 index 00000000000..07f60a7fe02 --- /dev/null +++ b/sql/updates/7388_01_mangos_mangos_string.sql @@ -0,0 +1,3 @@ +DELETE FROM mangos_string WHERE entry = 726; +INSERT INTO mangos_string VALUES (750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +INSERT INTO mangos_string VALUES (751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index 19b30bd18f2..46c6bbf76aa 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -230,7 +230,6 @@ void BattleGround::Update(uint32 diff) { m_PrematureCountDown = true; m_PrematureCountDownTimer = sBattleGroundMgr.GetPrematureFinishTime(); - SendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING); } else if(m_PrematureCountDownTimer < diff) { @@ -242,8 +241,17 @@ void BattleGround::Update(uint32 diff) { uint32 newtime = m_PrematureCountDownTimer - diff; // announce every minute - if(m_PrematureCountDownTimer != sBattleGroundMgr.GetPrematureFinishTime() && newtime / 60000 != m_PrematureCountDownTimer / 60000) - SendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING); + if( newtime > (MINUTE * IN_MILISECONDS) ) + { + if( newtime / (MINUTE * IN_MILISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILISECONDS) ) + PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILISECONDS))); + } + else + { + //announce every 15 seconds + if( newtime / (15 * IN_MILISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILISECONDS) ) + PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, (uint32)(m_PrematureCountDownTimer / IN_MILISECONDS)); + } m_PrematureCountDownTimer = newtime; } } @@ -1047,7 +1055,7 @@ void BattleGround::RemoveFromBGFreeSlotQueue() // returns the number how many players can join battleground to MaxPlayersPerTeam uint32 BattleGround::GetFreeSlotsForTeam(uint32 Team) const { - //if BG is starting ... invite anyone + //return free slot count to MaxPlayerPerTeam if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS) return (GetInvitedCount(Team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(Team) : 0; @@ -1414,6 +1422,18 @@ void BattleGround::SendMessageToAll(int32 entry) SendPacketToAll(&data); } +//copied from void ChatHandler::PSendSysMessage(int32 entry, ...) +void BattleGround::PSendMessageToAll(int32 entry, ...) +{ + const char *format = GetMangosString(entry); + va_list ap; + char str [2048]; + va_start(ap, entry); + vsnprintf(str,2048,format, ap ); + va_end(ap); + SendMessageToAll(str); +} + void BattleGround::EndNow() { RemoveFromBGFreeSlotQueue(); diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h index 767b8521cf1..8f8aec564c6 100644 --- a/src/game/BattleGround.h +++ b/src/game/BattleGround.h @@ -402,6 +402,7 @@ class BattleGround void SendMessageToAll(char const* text); void SendMessageToAll(int32 entry); + void PSendMessageToAll(int32 entry, ... ); /* Raid Group */ Group *GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE]; } diff --git a/src/game/Language.h b/src/game/Language.h index 327eef25ead..e0e6ce8e8c2 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -654,7 +654,7 @@ enum TrinityStrings LANG_ARENA_NOT_ENOUGH_PLAYERS = 723, // "Your group does not have enough players to join this match." LANG_ARENA_GOLD_WINS = 724, // "The Gold Team wins!" LANG_ARENA_GREEN_WINS = 725, // "The Green Team wins!" - LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 726, // The battleground will end soon, because there aren't enough players. Get more ppl or win already! +// = 726, not used LANG_BG_GROUP_OFFLINE_MEMBER = 727, // "Your group has an offline member. Please remove him before joining." LANG_BG_GROUP_MIXED_FACTION = 728, // "Your group has players from the opposing faction. You can't join the battleground as a group." LANG_BG_GROUP_MIXED_LEVELS = 729, // "Your group has players from different battleground brakets. You can't join as group." @@ -676,7 +676,12 @@ enum TrinityStrings LANG_DIST_ARENA_POINTS_TEAM_START = 744, LANG_DIST_ARENA_POINTS_TEAM_END = 745, LANG_DIST_ARENA_POINTS_END = 746, - // Room for batleground/arena strings 747-799 not used +// = 747, not used +// = 748, not used +// = 749, not used + LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 750, // "Not enough players. This game will close in %u mins." + LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds." + // Room for batleground/arena strings 752-799 not used // Room for BG/ARENA 750-769 not used diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 160925670ff..ee9321bdae8 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7387" + #define REVISION_NR "7389" #endif // __REVISION_NR_H__ -- cgit v1.2.3