diff options
author | Shocker <none@none> | 2010-09-21 03:51:14 +0300 |
---|---|---|
committer | Shocker <none@none> | 2010-09-21 03:51:14 +0300 |
commit | 5ffaf0d84bb5e2f73f60321c1754d879f5297f0f (patch) | |
tree | a618492389348261d9c1f3c4579cc98ee8b183d0 | |
parent | 7b3d573a16eec4010ffee1e40fc93ddd0cbd46ab (diff) |
Core/Commands: Implement command for adding (completing) achievements
--HG--
branch : trunk
-rw-r--r-- | sql/base/world_database.sql | 2 | ||||
-rw-r--r-- | sql/updates/10023.world_command.sql | 4 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Chat/Chat.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Chat/Chat.h | 3 | ||||
-rw-r--r-- | src/server/game/Chat/Commands/Level3.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
9 files changed, 50 insertions, 6 deletions
diff --git a/sql/base/world_database.sql b/sql/base/world_database.sql index a503b591cbb..018ee3894b2 100644 --- a/sql/base/world_database.sql +++ b/sql/base/world_database.sql @@ -327,6 +327,8 @@ INSERT INTO `command` VALUES ('account set addon',3,'Syntax: .account set addon [$account] #addon\r\n\r\nSet user (possible targeted) expansion addon level allowed. Addon values: 0 - normal, 1 - tbc, 2 - wotlk.'), ('account set gmlevel',4,'Syntax: .account set gmlevel [$account] #level [#realmid]\r\n\r\nSet the security level for targeted player (can''t be used at self) or for account $name to a level of #level on the realm #realmID.\r\n\r\n#level may range from 0 to 3.\r\n\r\n#reamID may be -1 for all realms.'), ('account set password',4,'Syntax: .account set password $account $password $password\r\n\r\nSet password for account.'), +('achievement',4,'Syntax: .achievement $subcommand\nType .achievement to see the list of possible subcommands or .help achievement $subcommand to see info on subcommands'), +('achievement add',4,'Syntax: .achievement add $achievement\nAdd an achievement to the targeted player.\n$achievement: can be either achievement id or achievement link'), ('additem',3,'Syntax: .additem #itemid/[#itemname]/#shift-click-item-link #itemcount\r\n\r\nAdds the specified number of items of id #itemid (or exact (!) name $itemname in brackets, or link created by shift-click at item in inventory or recipe) to your or selected character inventory. If #itemcount is omitted, only one item will be added.\r\n.'), ('additemset',3,'Syntax: .additemset #itemsetid\r\n\r\nAdd items from itemset of id #itemsetid to your or selected character inventory. Will add by one example each item from itemset.'), ('announce',1,'Syntax: .announce $MessageToBroadcast\r\n\r\nSend a global message to all players online in chat log.'), diff --git a/sql/updates/10023.world_command.sql b/sql/updates/10023.world_command.sql new file mode 100644 index 00000000000..653d400c690 --- /dev/null +++ b/sql/updates/10023.world_command.sql @@ -0,0 +1,4 @@ +DELETE FROM `command` WHERE `name` IN ('achievement add', 'achievement'); +INSERT INTO `command` (`name`,`security`,`help`) VALUES +('achievement add',4,'Syntax: .achievement add $achievement\nAdd an achievement to the targeted player.\n$achievement: can be either achievement id or achievement link'), +('achievement',4,'Syntax: .achievement $subcommand\nType .achievement to see the list of possible subcommands or .help achievement $subcommand to see info on subcommands');
\ No newline at end of file diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 5231bb6e34a..1bd69e7333c 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1900,11 +1900,11 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, } } -void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) +void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, bool ignoreGMAllowAchievementConfig) { sLog.outDetail("AchievementMgr::CompletedAchievement(%u)", achievement->ID); - if (!sWorld.getBoolConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER) + if (!sWorld.getBoolConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER && !ignoreGMAllowAchievementConfig) return; if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement)) diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index e7246a8f977..0901c5cf7dc 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -247,7 +247,7 @@ class AchievementMgr void SaveToDB(SQLTransaction& trans); void ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, bool evenIfCriteriaComplete = false); void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, Unit *unit = NULL, uint32 time = 0); - void CompletedAchievement(AchievementEntry const* entry); + void CompletedAchievement(AchievementEntry const* entry, bool ignoreGMAllowAchievementConfig = false); void CheckAllAchievementCriteria(); void SendAllAchievementData(); void SendRespondInspectAchievements(Player* player); diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 5714fbeb25f..63c20aa8a06 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -692,9 +692,16 @@ ChatCommand * ChatHandler::getCommandTable() { NULL, 0, false, NULL, "", NULL } }; + static ChatCommand achievementCommandTable[] = + { + { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAchievementAddCommand, "", NULL}, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand commandTable[] = { { "account", SEC_PLAYER, true, NULL, "", accountCommandTable }, + { "achievement", SEC_ADMINISTRATOR, false, NULL, "", achievementCommandTable}, { "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable }, { "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable }, { "go", SEC_MODERATOR, false, NULL, "", goCommandTable }, diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index f0478e3c890..75a28c1a2c0 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -568,6 +568,9 @@ class ChatHandler bool HandleChangeWeather(const char* args); bool HandleKickPlayerCommand(const char * args); + // Achievement commands + bool HandleAchievementAddCommand(const char* args); + // GM ticket command handlers bool HandleGMTicketListCommand(const char* args); bool HandleGMTicketListOnlineCommand(const char* args); diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 8235ffc8fda..1e0c515635a 100644 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -1408,6 +1408,34 @@ bool ChatHandler::HandleSetSkillCommand(const char *args) return true; } +bool ChatHandler::HandleAchievementAddCommand(const char *args) +{ + if (!*args) + return false; + + uint32 achievementId = atoi((char*)args); + if (!achievementId) + { + if (char* cId = extractKeyFromLink((char*)args, "Hachievement")) + achievementId = atoi(cId); + if (!achievementId) + return false; + } + + Player* target = getSelectedPlayer(); + if (!target) + { + SendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + + if (AchievementEntry const* pAE = GetAchievementStore()->LookupEntry(achievementId)) + target->CompletedAchievement(pAE, true); + + return true; +} + bool ChatHandler::HandleUnLearnCommand(const char *args) { if (!*args) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6413f82486d..82a78f18342 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23031,9 +23031,9 @@ void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 mis GetAchievementMgr().UpdateAchievementCriteria(type, miscvalue1, miscvalue2, unit, time); } -void Player::CompletedAchievement(AchievementEntry const* entry) +void Player::CompletedAchievement(AchievementEntry const* entry, bool ignoreGMAllowAchievementConfig) { - GetAchievementMgr().CompletedAchievement(entry); + GetAchievementMgr().CompletedAchievement(entry, ignoreGMAllowAchievementConfig); } void Player::LearnTalent(uint32 talentId, uint32 talentRank) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index dd06afea008..a49a22c79ca 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2362,7 +2362,7 @@ class Player : public Unit, public GridObject<Player> AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, Unit *unit = NULL, uint32 time = 0); - void CompletedAchievement(AchievementEntry const* entry); + void CompletedAchievement(AchievementEntry const* entry, bool ignoreGMAllowAchievementConfig = false); bool HasTitle(uint32 bitIndex); bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } |