mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[8276] Implement achievment ACHIEVEMENT_CRITERIA_TYPE_WIN_BG
* including new achievement createria data type ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE Note: Some achivement creteria for success need data in `achievement_criteria_data`
This commit is contained in:
parent
571f94b36a
commit
9002710c93
11 changed files with 146 additions and 22 deletions
|
|
@ -33,6 +33,8 @@
|
||||||
#include "CellImpl.h"
|
#include "CellImpl.h"
|
||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
#include "MapManager.h"
|
#include "MapManager.h"
|
||||||
|
#include "BattleGround.h"
|
||||||
|
#include "BattleGroundAB.h"
|
||||||
|
|
||||||
#include "Policies/SingletonImp.h"
|
#include "Policies/SingletonImp.h"
|
||||||
|
|
||||||
|
|
@ -79,6 +81,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
|
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
|
||||||
|
|
@ -231,6 +234,8 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE:
|
||||||
|
return true; // not check correctness node indexes
|
||||||
default:
|
default:
|
||||||
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType);
|
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -299,6 +304,13 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui
|
||||||
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= drunk.state;
|
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= drunk.state;
|
||||||
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
|
||||||
return IsHolidayActive(HolidayIds(holiday.id));
|
return IsHolidayActive(HolidayIds(holiday.id));
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE:
|
||||||
|
{
|
||||||
|
BattleGround* bg = source->GetBattleGround();
|
||||||
|
if(!bg)
|
||||||
|
return false;
|
||||||
|
return bg->IsTeamScoreInRange(source->GetTeam()==ALLIANCE ? HORDE : ALLIANCE,bg_loss_team_score.min_score,bg_loss_team_score.max_score);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -718,6 +730,54 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
|
|
||||||
// specialized cases
|
// specialized cases
|
||||||
|
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||||
|
{
|
||||||
|
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
||||||
|
if (!miscvalue1)
|
||||||
|
continue;
|
||||||
|
if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (achievementCriteria->win_bg.additionalRequirement1_type)
|
||||||
|
{
|
||||||
|
// those requirements couldn't be found in the dbc
|
||||||
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
|
if (!data || !data->Meets(GetPlayer(),unit))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// some hardcoded requirements
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BattleGround* bg = GetPlayer()->GetBattleGround();
|
||||||
|
if (!bg)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch(achievementCriteria->referredAchievement)
|
||||||
|
{
|
||||||
|
case 161: // AB, Overcome a 500 resource disadvantage
|
||||||
|
{
|
||||||
|
if (bg->GetTypeID() != BATTLEGROUND_AB)
|
||||||
|
continue;
|
||||||
|
if(!((BattleGroundAB*)bg)->IsTeamScores500disadvantage(GetPlayer()->GetTeam()))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 156: // AB, win while controlling all 5 flags (all nodes)
|
||||||
|
case 784: // EY, win while holding 4 bases (all nodes)
|
||||||
|
{
|
||||||
|
if(!bg->IsAllNodesConrolledByTeam(GetPlayer()->GetTeam()))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1762: // SA, win without losing any siege vehicles
|
||||||
|
case 2192: // SA, win without losing any siege vehicles
|
||||||
|
continue; // not implemented
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
{
|
{
|
||||||
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
||||||
|
|
@ -1269,7 +1329,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING:
|
||||||
break;
|
break;
|
||||||
// FIXME: not triggered in code as result, need to implement
|
// FIXME: not triggered in code as result, need to implement
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||||
|
|
@ -1338,6 +1397,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||||
|
|
||||||
switch(achievementCriteria->requiredType)
|
switch(achievementCriteria->requiredType)
|
||||||
{
|
{
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||||
|
return progress->counter >= achievementCriteria->win_bg.winCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
|
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||||
|
|
@ -1843,6 +1904,10 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||||
|
if(!criteria->win_bg.additionalRequirement1_type)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
break; // any cases
|
break; // any cases
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,10 @@ enum AchievementCriteriaDataType
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14,// team HORDE(67), ALLIANCE(469)
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14,// team HORDE(67), ALLIANCE(469)
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15,// drunken_state 0 (enum DrunkenState) of player
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15,// drunken_state 0 (enum DrunkenState) of player
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16,// holiday_id 0 event in holiday time
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16,// holiday_id 0 event in holiday time
|
||||||
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17,// min_score max_score player's team win bg and opposition team have team score in range
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 17 // maximum value in AchievementCriteriaDataType enum
|
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 18 // maximum value in AchievementCriteriaDataType enum
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
class Unit;
|
class Unit;
|
||||||
|
|
@ -141,11 +142,17 @@ struct AchievementCriteriaData
|
||||||
{
|
{
|
||||||
uint32 state;
|
uint32 state;
|
||||||
} drunk;
|
} drunk;
|
||||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY
|
// ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16 id;
|
uint32 id;
|
||||||
} holiday;
|
} holiday;
|
||||||
|
// ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32 min_score;
|
||||||
|
uint32 max_score;
|
||||||
|
} bg_loss_team_score;
|
||||||
// ...
|
// ...
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -453,7 +453,7 @@ void BattleGround::Update(uint32 diff)
|
||||||
|
|
||||||
void BattleGround::SetTeamStartLoc(uint32 TeamID, float X, float Y, float Z, float O)
|
void BattleGround::SetTeamStartLoc(uint32 TeamID, float X, float Y, float Z, float O)
|
||||||
{
|
{
|
||||||
uint8 idx = GetTeamIndexByTeamId(TeamID);
|
BattleGroundTeamId idx = GetTeamIndexByTeamId(TeamID);
|
||||||
m_TeamStartLocX[idx] = X;
|
m_TeamStartLocX[idx] = X;
|
||||||
m_TeamStartLocY[idx] = Y;
|
m_TeamStartLocY[idx] = Y;
|
||||||
m_TeamStartLocZ[idx] = Z;
|
m_TeamStartLocZ[idx] = Z;
|
||||||
|
|
@ -1767,3 +1767,9 @@ WorldSafeLocsEntry const* BattleGround::GetClosestGraveYard( Player* player )
|
||||||
{
|
{
|
||||||
return objmgr.GetClosestGraveYard( player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetTeam() );
|
return objmgr.GetClosestGraveYard( player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetTeam() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BattleGround::IsTeamScoreInRange(uint32 team, uint32 minScore, uint32 maxScore) const
|
||||||
|
{
|
||||||
|
BattleGroundTeamId team_idx = GetTeamIndexByTeamId(team);
|
||||||
|
return m_TeamScores[team_idx] >= minScore && m_TeamScores[team_idx] <= maxScore;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -291,6 +291,10 @@ class BattleGround
|
||||||
virtual void StartingEventCloseDoors() {}
|
virtual void StartingEventCloseDoors() {}
|
||||||
virtual void StartingEventOpenDoors() {}
|
virtual void StartingEventOpenDoors() {}
|
||||||
|
|
||||||
|
/* achievement req. */
|
||||||
|
virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; }
|
||||||
|
bool IsTeamScoreInRange(uint32 team, uint32 minScore, uint32 maxScore) const;
|
||||||
|
|
||||||
/* Battleground */
|
/* Battleground */
|
||||||
// Get methods:
|
// Get methods:
|
||||||
char const* GetName() const { return m_Name; }
|
char const* GetName() const { return m_Name; }
|
||||||
|
|
@ -388,7 +392,7 @@ class BattleGround
|
||||||
void SetTeamStartLoc(uint32 TeamID, float X, float Y, float Z, float O);
|
void SetTeamStartLoc(uint32 TeamID, float X, float Y, float Z, float O);
|
||||||
void GetTeamStartLoc(uint32 TeamID, float &X, float &Y, float &Z, float &O) const
|
void GetTeamStartLoc(uint32 TeamID, float &X, float &Y, float &Z, float &O) const
|
||||||
{
|
{
|
||||||
uint8 idx = GetTeamIndexByTeamId(TeamID);
|
BattleGroundTeamId idx = GetTeamIndexByTeamId(TeamID);
|
||||||
X = m_TeamStartLocX[idx];
|
X = m_TeamStartLocX[idx];
|
||||||
Y = m_TeamStartLocY[idx];
|
Y = m_TeamStartLocY[idx];
|
||||||
Z = m_TeamStartLocZ[idx];
|
Z = m_TeamStartLocZ[idx];
|
||||||
|
|
@ -431,7 +435,7 @@ class BattleGround
|
||||||
|
|
||||||
virtual void UpdatePlayerScore(Player *Source, uint32 type, uint32 value);
|
virtual void UpdatePlayerScore(Player *Source, uint32 type, uint32 value);
|
||||||
|
|
||||||
uint8 GetTeamIndexByTeamId(uint32 Team) const { return Team == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE; }
|
static BattleGroundTeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE; }
|
||||||
uint32 GetPlayersCountByTeam(uint32 Team) const { return m_PlayersCount[GetTeamIndexByTeamId(Team)]; }
|
uint32 GetPlayersCountByTeam(uint32 Team) const { return m_PlayersCount[GetTeamIndexByTeamId(Team)]; }
|
||||||
uint32 GetAlivePlayersCountByTeam(uint32 Team) const; // used in arenas to correctly handle death in spirit of redemption / last stand etc. (killer = killed) cases
|
uint32 GetAlivePlayersCountByTeam(uint32 Team) const; // used in arenas to correctly handle death in spirit of redemption / last stand etc. (killer = killed) cases
|
||||||
void UpdatePlayersCountByTeam(uint32 Team, bool remove)
|
void UpdatePlayersCountByTeam(uint32 Team, bool remove)
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,18 @@ void BattleGroundAB::Update(uint32 diff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// achievements flags
|
||||||
|
if (m_TeamScores[BG_TEAM_ALLIANCE] > m_TeamScores[BG_TEAM_HORDE])
|
||||||
|
{
|
||||||
|
if (m_TeamScores[BG_TEAM_ALLIANCE] - m_TeamScores[BG_TEAM_HORDE] >= 500)
|
||||||
|
m_TeamScores500disadvantage[BG_TEAM_HORDE] = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_TeamScores[BG_TEAM_HORDE] - m_TeamScores[BG_TEAM_ALLIANCE] >= 500)
|
||||||
|
m_TeamScores500disadvantage[BG_TEAM_ALLIANCE] = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Test win condition
|
// Test win condition
|
||||||
if (m_TeamScores[BG_TEAM_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE)
|
if (m_TeamScores[BG_TEAM_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE)
|
||||||
EndBattleGround(ALLIANCE);
|
EndBattleGround(ALLIANCE);
|
||||||
|
|
@ -413,7 +425,7 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 teamIndex = GetTeamIndexByTeamId(source->GetTeam());
|
BattleGroundTeamId teamIndex = GetTeamIndexByTeamId(source->GetTeam());
|
||||||
|
|
||||||
// Check if player really could use this banner, not cheated
|
// Check if player really could use this banner, not cheated
|
||||||
if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node]%2))
|
if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node]%2))
|
||||||
|
|
@ -459,7 +471,7 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ
|
||||||
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
||||||
|
|
||||||
// FIXME: node names not localized
|
// FIXME: node names not localized
|
||||||
if (teamIndex == 0)
|
if (teamIndex == BG_TEAM_ALLIANCE)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
||||||
|
|
@ -476,15 +488,15 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ
|
||||||
_CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true);
|
_CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true);
|
||||||
_SendNodeUpdate(node);
|
_SendNodeUpdate(node);
|
||||||
m_NodeTimers[node] = 0;
|
m_NodeTimers[node] = 0;
|
||||||
_NodeOccupied(node,(teamIndex == 0) ? ALLIANCE:HORDE);
|
_NodeOccupied(node,(teamIndex == BG_TEAM_ALLIANCE) ? ALLIANCE:HORDE);
|
||||||
|
|
||||||
// FIXME: node names not localized
|
// FIXME: node names not localized
|
||||||
if (teamIndex == 0)
|
if (teamIndex == BG_TEAM_ALLIANCE)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
||||||
}
|
}
|
||||||
sound = (teamIndex == 0) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;
|
sound = (teamIndex == BG_TEAM_ALLIANCE) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;
|
||||||
}
|
}
|
||||||
// If node is occupied, change to enemy-contested
|
// If node is occupied, change to enemy-contested
|
||||||
else
|
else
|
||||||
|
|
@ -501,19 +513,19 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ
|
||||||
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
||||||
|
|
||||||
// FIXME: node names not localized
|
// FIXME: node names not localized
|
||||||
if (teamIndex == 0)
|
if (teamIndex == BG_TEAM_ALLIANCE)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node));
|
||||||
|
|
||||||
sound = (teamIndex == 0) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;
|
sound = (teamIndex == BG_TEAM_ALLIANCE) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If node is occupied again, send "X has taken the Y" msg.
|
// If node is occupied again, send "X has taken the Y" msg.
|
||||||
if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)
|
if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)
|
||||||
{
|
{
|
||||||
// FIXME: team and node names not localized
|
// FIXME: team and node names not localized
|
||||||
if (teamIndex == 0)
|
if (teamIndex == BG_TEAM_ALLIANCE)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node));
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node));
|
||||||
|
|
@ -576,6 +588,8 @@ void BattleGroundAB::Reset()
|
||||||
bool isBGWeekend = false; //TODO FIXME - call sBattleGroundMgr.IsBGWeekend(m_TypeID); - you must also implement that call!
|
bool isBGWeekend = false; //TODO FIXME - call sBattleGroundMgr.IsBGWeekend(m_TypeID); - you must also implement that call!
|
||||||
m_HonorTics = (isBGWeekend) ? BG_AB_ABBGWeekendHonorTicks : BG_AB_NotABBGWeekendHonorTicks;
|
m_HonorTics = (isBGWeekend) ? BG_AB_ABBGWeekendHonorTicks : BG_AB_NotABBGWeekendHonorTicks;
|
||||||
m_ReputationTics = (isBGWeekend) ? BG_AB_ABBGWeekendReputationTicks : BG_AB_NotABBGWeekendReputationTicks;
|
m_ReputationTics = (isBGWeekend) ? BG_AB_ABBGWeekendReputationTicks : BG_AB_NotABBGWeekendReputationTicks;
|
||||||
|
m_TeamScores500disadvantage[BG_TEAM_ALLIANCE] = false;
|
||||||
|
m_TeamScores500disadvantage[BG_TEAM_HORDE] = false;
|
||||||
|
|
||||||
for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
|
for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
|
||||||
{
|
{
|
||||||
|
|
@ -606,7 +620,7 @@ void BattleGroundAB::EndBattleGround(uint32 winner)
|
||||||
|
|
||||||
WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player)
|
WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player)
|
||||||
{
|
{
|
||||||
uint8 teamIndex = GetTeamIndexByTeamId(player->GetTeam());
|
BattleGroundTeamId teamIndex = GetTeamIndexByTeamId(player->GetTeam());
|
||||||
|
|
||||||
// Is there any occupied node for this team?
|
// Is there any occupied node for this team?
|
||||||
std::vector<uint8> nodes;
|
std::vector<uint8> nodes;
|
||||||
|
|
@ -663,3 +677,14 @@ void BattleGroundAB::UpdatePlayerScore(Player *Source, uint32 type, uint32 value
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BattleGroundAB::IsAllNodesConrolledByTeam(uint32 team) const
|
||||||
|
{
|
||||||
|
uint32 count = 0;
|
||||||
|
for(int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
|
||||||
|
if (team == ALLIANCE && m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED ||
|
||||||
|
team == HORDE && m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)
|
||||||
|
++count;
|
||||||
|
|
||||||
|
return count == BG_AB_DYNAMIC_NODES_COUNT;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -260,6 +260,9 @@ class BattleGroundAB : public BattleGround
|
||||||
/* Nodes occupying */
|
/* Nodes occupying */
|
||||||
virtual void EventPlayerClickedOnFlag(Player *source, GameObject* target_obj);
|
virtual void EventPlayerClickedOnFlag(Player *source, GameObject* target_obj);
|
||||||
|
|
||||||
|
/* achievement req. */
|
||||||
|
bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited
|
||||||
|
bool IsTeamScores500disadvantage(uint32 team) const { return m_TeamScores500disadvantage[GetTeamIndexByTeamId(team)]; }
|
||||||
private:
|
private:
|
||||||
/* Gameobject spawning/despawning */
|
/* Gameobject spawning/despawning */
|
||||||
void _CreateBanner(uint8 node, uint8 type, uint8 teamIndex, bool delay);
|
void _CreateBanner(uint8 node, uint8 type, uint8 teamIndex, bool delay);
|
||||||
|
|
@ -289,7 +292,7 @@ class BattleGroundAB : public BattleGround
|
||||||
bool m_IsInformedNearVictory;
|
bool m_IsInformedNearVictory;
|
||||||
uint32 m_HonorTics;
|
uint32 m_HonorTics;
|
||||||
uint32 m_ReputationTics;
|
uint32 m_ReputationTics;
|
||||||
|
// need for achievements
|
||||||
|
bool m_TeamScores500disadvantage[BG_TEAMS_COUNT];
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ void BattleGroundEY::StartingEventOpenDoors()
|
||||||
|
|
||||||
void BattleGroundEY::AddPoints(uint32 Team, uint32 Points)
|
void BattleGroundEY::AddPoints(uint32 Team, uint32 Points)
|
||||||
{
|
{
|
||||||
uint8 team_index = GetTeamIndexByTeamId(Team);
|
BattleGroundTeamId team_index = GetTeamIndexByTeamId(Team);
|
||||||
m_TeamScores[team_index] += Points;
|
m_TeamScores[team_index] += Points;
|
||||||
m_HonorScoreTics[team_index] += Points;
|
m_HonorScoreTics[team_index] += Points;
|
||||||
if (m_HonorScoreTics[team_index] >= m_HonorTics )
|
if (m_HonorScoreTics[team_index] >= m_HonorTics )
|
||||||
|
|
@ -897,3 +897,13 @@ WorldSafeLocsEntry const *BattleGroundEY::GetClosestGraveYard(Player* player)
|
||||||
|
|
||||||
return nearestEntry;
|
return nearestEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BattleGroundEY::IsAllNodesConrolledByTeam(uint32 team) const
|
||||||
|
{
|
||||||
|
uint32 count = 0;
|
||||||
|
for(int i = 0; i < EY_POINTS_MAX; ++i)
|
||||||
|
if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EY_POINT_UNDER_CONTROL)
|
||||||
|
++count;
|
||||||
|
|
||||||
|
return count == EY_POINTS_MAX;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -348,6 +348,8 @@ class BattleGroundEY : public BattleGround
|
||||||
virtual void EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj);
|
virtual void EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj);
|
||||||
virtual void EventPlayerDroppedFlag(Player *Source);
|
virtual void EventPlayerDroppedFlag(Player *Source);
|
||||||
|
|
||||||
|
/* achievement req. */
|
||||||
|
bool IsAllNodesConrolledByTeam(uint32 team) const;
|
||||||
private:
|
private:
|
||||||
void EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType);
|
void EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType);
|
||||||
void EventTeamCapturedPoint(Player *Source, uint32 Point);
|
void EventTeamCapturedPoint(Player *Source, uint32 Point);
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,6 @@ class BattleGroundWS : public BattleGround
|
||||||
void AddPoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] += Points; }
|
void AddPoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] += Points; }
|
||||||
void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; }
|
void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; }
|
||||||
void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; }
|
void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde
|
uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde
|
||||||
uint64 m_DroppedFlagGUID[2];
|
uint64 m_DroppedFlagGUID[2];
|
||||||
|
|
|
||||||
|
|
@ -81,11 +81,14 @@ struct AchievementCriteriaEntry
|
||||||
} kill_creature;
|
} kill_creature;
|
||||||
|
|
||||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
|
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
|
||||||
// TODO: there are further criterias instead just winning
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint32 bgMapID; // 3
|
uint32 bgMapID; // 3
|
||||||
uint32 winCount; // 4
|
uint32 winCount; // 4
|
||||||
|
uint32 additionalRequirement1_type; // 5 additional requirement 1 type
|
||||||
|
uint32 additionalRequirement1_value; // 6 additional requirement 1 value
|
||||||
|
uint32 additionalRequirement2_type; // 7 additional requirement 2 type
|
||||||
|
uint32 additionalRequirement2_value; // 8 additional requirement 1 value
|
||||||
} win_bg;
|
} win_bg;
|
||||||
|
|
||||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
|
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8275"
|
#define REVISION_NR "8276"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue