mirror of
https://github.com/mangosfour/server.git
synced 2025-12-19 13:37:01 +00:00
[10323] Implement achivement view commands.
This is fist part for achievement related command set. Edition commands will added in some later commits when ready. Two command added: * .lookup achievment $partname - show fit achievements (id, shiftlink, complete date for selected player). shiftlink included similar data as generated by client for achievement shift-link (complete state, complete date, marked completed criteria). * .character achievements [$playername] - show completed achievements for selected player
This commit is contained in:
parent
0cc1fbe697
commit
373f607a44
14 changed files with 174 additions and 11 deletions
|
|
@ -1470,7 +1470,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
static const uint32 achievIdByClass[MAX_CLASSES] = { 0, 459, 465 , 462, 458, 464, 461, 467, 460, 463, 0, 466 };
|
||||
static const uint32 achievIdByRace[MAX_RACES] = { 0, 1408, 1410, 1407, 1409, 1413, 1411, 1404, 1412, 0, 1405, 1406 };
|
||||
|
||||
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement)
|
||||
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) const
|
||||
{
|
||||
// counter can never complete
|
||||
if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
|
||||
|
|
|
|||
|
|
@ -253,9 +253,17 @@ class AchievementMgr
|
|||
void SendAllAchievementData();
|
||||
void SendRespondInspectAchievements(Player* player);
|
||||
|
||||
Player* GetPlayer() { return m_player;}
|
||||
Player* GetPlayer() const { return m_player;}
|
||||
|
||||
bool HasAchievement(uint32 achievement_id) const { return m_completedAchievements.find(achievement_id) != m_completedAchievements.end(); }
|
||||
CompletedAchievementData const* GetCompleteData(uint32 achievement_id) const
|
||||
{
|
||||
CompletedAchievementMap::const_iterator itr = m_completedAchievements.find(achievement_id);
|
||||
return itr != m_completedAchievements.end() ? &itr->second : NULL;
|
||||
}
|
||||
|
||||
bool HasAchievement(uint32 achievement_id) const { return GetCompleteData(achievement_id) != NULL; }
|
||||
CompletedAchievementMap const& GetCompletedAchievements() const { return m_completedAchievements; }
|
||||
bool IsCompletedCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement) const;
|
||||
|
||||
private:
|
||||
enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST };
|
||||
|
|
@ -264,7 +272,6 @@ class AchievementMgr
|
|||
void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, ProgressType ptype = PROGRESS_SET);
|
||||
void CompletedCriteriaFor(AchievementEntry const* achievement);
|
||||
void CompletedAchievement(AchievementEntry const* entry);
|
||||
bool IsCompletedCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement);
|
||||
bool IsCompletedAchievement(AchievementEntry const* entry);
|
||||
void CompleteAchievementsWithRefs(AchievementEntry const* entry);
|
||||
void BuildAllDataPacket(WorldPacket *data);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
#include "GameEventMgr.h"
|
||||
|
||||
// Supported shift-links (client generated and server side)
|
||||
// |color|Hachievement:achievement_id:player_guid:0:0:0:0:0:0:0:0|h[name]|h|r
|
||||
// |color|Hachievement:achievement_id:player_guid_hex:completed_0_1:mm:dd:yy_from_2000:criteriaMask1:criteriaMask2:criteriaMask3:criteriaMask4|h[name]|h|r
|
||||
// - client, item icon shift click, not used in server currently
|
||||
// |color|Harea:area_id|h[name]|h|r
|
||||
// |color|Hareatrigger:id|h[name]|h|r
|
||||
|
|
@ -141,6 +141,7 @@ ChatCommand * ChatHandler::getCommandTable()
|
|||
|
||||
static ChatCommand characterCommandTable[] =
|
||||
{
|
||||
{ "achievements", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterAchievementsCommand,"",NULL },
|
||||
{ "customize", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterCustomizeCommand, "", NULL },
|
||||
{ "deleted", SEC_GAMEMASTER, true, NULL, "", characterDeletedCommandTable},
|
||||
{ "erase", SEC_CONSOLE, true, &ChatHandler::HandleCharacterEraseCommand, "", NULL },
|
||||
|
|
@ -317,6 +318,7 @@ ChatCommand * ChatHandler::getCommandTable()
|
|||
static ChatCommand lookupCommandTable[] =
|
||||
{
|
||||
{ "account", SEC_GAMEMASTER, true, NULL, "", lookupAccountCommandTable },
|
||||
{ "achievement", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupAchievementCommand, "", NULL },
|
||||
{ "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL },
|
||||
{ "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
|
||||
{ "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL },
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include "SharedDefines.h"
|
||||
|
||||
struct AchievementEntry;
|
||||
struct AreaTrigger;
|
||||
struct FactionEntry;
|
||||
struct FactionState;
|
||||
|
|
@ -144,6 +145,7 @@ class ChatHandler
|
|||
bool HandleCastSelfCommand(char* args);
|
||||
bool HandleCastTargetCommand(char* args);
|
||||
|
||||
bool HandleCharacterAchievementsCommand(char* args);
|
||||
bool HandleCharacterCustomizeCommand(char* args);
|
||||
bool HandleCharacterDeletedDeleteCommand(char* args);
|
||||
bool HandleCharacterDeletedListCommand(char* args);
|
||||
|
|
@ -255,6 +257,7 @@ class ChatHandler
|
|||
bool HandleLookupAccountEmailCommand(char* args);
|
||||
bool HandleLookupAccountIpCommand(char* args);
|
||||
bool HandleLookupAccountNameCommand(char* args);
|
||||
bool HandleLookupAchievementCommand(char* args);
|
||||
bool HandleLookupAreaCommand(char* args);
|
||||
bool HandleLookupCreatureCommand(char* args);
|
||||
bool HandleLookupEventCommand(char* args);
|
||||
|
|
@ -575,6 +578,7 @@ class ChatHandler
|
|||
|
||||
// Utility methods for commands
|
||||
bool ShowAccountListHelper(QueryResult* result, uint32* limit = NULL, bool title = true, bool error = true);
|
||||
void ShowAchievementListHelper(AchievementEntry const * achEntry, LocaleConstant loc, time_t const* date = NULL, Player* target = NULL);
|
||||
void ShowFactionListHelper(FactionEntry const * factionEntry, LocaleConstant loc, FactionState const* repState = NULL, Player * target = NULL );
|
||||
void ShowItemListHelper(uint32 itemId, int loc_idx, Player* target = NULL);
|
||||
void ShowQuestListHelper(uint32 questId, int32 loc_idx, Player* target = NULL);
|
||||
|
|
|
|||
|
|
@ -497,7 +497,7 @@ struct AchievementCriteriaEntry
|
|||
// for timed spells it is spell id for
|
||||
// timed kills it is creature id
|
||||
uint32 timeLimit; // 29 time limit in seconds
|
||||
//uint32 showOrder; // 30 show order
|
||||
uint32 showOrder; // 30 show order, also used in achievement shift-links as index in state bitmask
|
||||
};
|
||||
|
||||
struct AreaTableEntry
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
#define MANGOS_DBCSFRM_H
|
||||
|
||||
const char Achievementfmt[]="niixssssssssssssssssxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxxxxxxxxii";
|
||||
const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
|
||||
const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixii";
|
||||
const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
|
||||
const char AreaGroupEntryfmt[]="niiiiiii";
|
||||
const char AreaTriggerEntryfmt[]="niffffffff";
|
||||
|
|
|
|||
|
|
@ -360,7 +360,8 @@ enum MangosStrings
|
|||
LANG_TRIGGER_REQ_QUEST_NORMAL = 369,
|
||||
LANG_TRIGGER_REQ_KEYS_HEROIC = 370,
|
||||
LANG_TRIGGER_REQ_QUEST_HEROIC = 371,
|
||||
// Room for more level 2 372-399 not used
|
||||
LANG_COMMAND_ACHIEVEMENT_NOTFOUND = 372,
|
||||
// Room for more level 2 373-399 not used
|
||||
|
||||
// level 3 chat
|
||||
LANG_SCRIPTS_RELOADED = 400,
|
||||
|
|
|
|||
|
|
@ -1170,6 +1170,136 @@ bool ChatHandler::HandleGUIDCommand(char* /*args*/)
|
|||
return true;
|
||||
}
|
||||
|
||||
void ChatHandler::ShowAchievementListHelper(AchievementEntry const * achEntry, LocaleConstant loc, time_t const* date /*= NULL*/, Player* target /*= NULL */ )
|
||||
{
|
||||
std::string name = achEntry->name[loc];
|
||||
|
||||
ObjectGuid guid = target ? target->GetObjectGuid() : ObjectGuid();
|
||||
|
||||
// |color|Hachievement:achievement_id:player_guid_hex:completed_0_1:mm:dd:yy_from_2000:criteriaMask:0:0:0|h[name]|h|r
|
||||
std::ostringstream ss;
|
||||
if (m_session)
|
||||
{
|
||||
ss << achEntry->ID << " - |cffffffff|Hachievement:" << achEntry->ID << ":" << std::hex << guid.GetRawValue() << std::dec;
|
||||
if (date)
|
||||
{
|
||||
// complete date
|
||||
tm* aTm = localtime(date);
|
||||
ss << ":1:" << aTm->tm_mon+1 << ":" << aTm->tm_mday << ":" << (aTm->tm_year+1900-2000) << ":";
|
||||
|
||||
// complete criteria mask (all bits set)
|
||||
ss << uint32(-1) << ":" << uint32(-1) << ":" << uint32(-1) << ":" << uint32(-1) << ":";
|
||||
}
|
||||
else
|
||||
{
|
||||
// complete date
|
||||
ss << ":0:0:0:-1:";
|
||||
|
||||
// complete criteria mask
|
||||
if (target)
|
||||
{
|
||||
uint32 criteriaMask[4] = {0, 0, 0, 0};
|
||||
|
||||
if (AchievementMgr const* mgr = target ? &target->GetAchievementMgr() : NULL)
|
||||
if (AchievementCriteriaEntryList const* criteriaList = sAchievementMgr.GetAchievementCriteriaByAchievement(achEntry->ID))
|
||||
for (AchievementCriteriaEntryList::const_iterator itr = criteriaList->begin(); itr != criteriaList->end(); ++itr)
|
||||
if (mgr->IsCompletedCriteria(*itr, achEntry))
|
||||
criteriaMask[((*itr)->showOrder - 1) / 32] |= (1 << (((*itr)->showOrder - 1) % 32));
|
||||
|
||||
for (int i = 0; i < 4; ++i)
|
||||
ss << criteriaMask[i] << ":";
|
||||
}
|
||||
else
|
||||
ss << "0:0:0:0:";
|
||||
}
|
||||
|
||||
ss << "|h[" << name << " " << localeNames[loc] << "]|h|r";
|
||||
}
|
||||
else
|
||||
ss << achEntry->ID << " - " << name << " " << localeNames[loc];
|
||||
|
||||
if (target && date)
|
||||
ss << " [" << TimeToTimestampStr(*date) << "]";
|
||||
|
||||
SendSysMessage(ss.str().c_str());
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleLookupAchievementCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
// Can be NULL at console call
|
||||
Player *target = getSelectedPlayer();
|
||||
|
||||
std::string namepart = args;
|
||||
std::wstring wnamepart;
|
||||
|
||||
if (!Utf8toWStr(namepart, wnamepart))
|
||||
return false;
|
||||
|
||||
// converting string that we try to find to lower case
|
||||
wstrToLower(wnamepart);
|
||||
|
||||
uint32 counter = 0; // Counter for figure out that we found smth.
|
||||
|
||||
for (uint32 id = 0; id < sAchievementStore.GetNumRows(); ++id)
|
||||
{
|
||||
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(id);
|
||||
if (!achEntry)
|
||||
continue;
|
||||
|
||||
int loc = GetSessionDbcLocale();
|
||||
std::string name = achEntry->name[loc];
|
||||
if (name.empty())
|
||||
continue;
|
||||
|
||||
if (!Utf8FitTo(name, wnamepart))
|
||||
{
|
||||
loc = 0;
|
||||
for(; loc < MAX_LOCALE; ++loc)
|
||||
{
|
||||
if (loc == GetSessionDbcLocale())
|
||||
continue;
|
||||
|
||||
name = achEntry->name[loc];
|
||||
if (name.empty())
|
||||
continue;
|
||||
|
||||
if (Utf8FitTo(name, wnamepart))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (loc < MAX_LOCALE)
|
||||
{
|
||||
CompletedAchievementData const* completed = target ? target->GetAchievementMgr().GetCompleteData(id) : NULL;
|
||||
ShowAchievementListHelper(achEntry, LocaleConstant(loc), completed ? &completed->date : NULL, target);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
|
||||
if (counter == 0) // if counter == 0 then we found nth
|
||||
SendSysMessage(LANG_COMMAND_ACHIEVEMENT_NOTFOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleCharacterAchievementsCommand(char* args)
|
||||
{
|
||||
Player* target;
|
||||
if (!extractPlayerTarget(args, &target))
|
||||
return false;
|
||||
|
||||
LocaleConstant loc = GetSessionDbcLocale();
|
||||
|
||||
CompletedAchievementMap const& complitedList = target->GetAchievementMgr().GetCompletedAchievements();
|
||||
for(CompletedAchievementMap::const_iterator itr = complitedList.begin(); itr != complitedList.end(); ++itr)
|
||||
{
|
||||
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(itr->first);
|
||||
ShowAchievementListHelper(achEntry, loc, &itr->second.date, target);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void ChatHandler::ShowFactionListHelper( FactionEntry const * factionEntry, LocaleConstant loc, FactionState const* repState /*= NULL*/, Player * target /*= NULL */ )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "10322"
|
||||
#define REVISION_NR "10323"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#ifndef __REVISION_SQL_H__
|
||||
#define __REVISION_SQL_H__
|
||||
#define REVISION_DB_CHARACTERS "required_10312_02_characters_pet_aura"
|
||||
#define REVISION_DB_MANGOS "required_10314_02_mangos_command"
|
||||
#define REVISION_DB_MANGOS "required_10323_02_mangos_command"
|
||||
#define REVISION_DB_REALMD "required_10008_01_realmd_realmd_db_version"
|
||||
#endif // __REVISION_SQL_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue