aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShocker <none@none>2010-09-21 03:51:14 +0300
committerShocker <none@none>2010-09-21 03:51:14 +0300
commit5ffaf0d84bb5e2f73f60321c1754d879f5297f0f (patch)
treea618492389348261d9c1f3c4579cc98ee8b183d0
parent7b3d573a16eec4010ffee1e40fc93ddd0cbd46ab (diff)
Core/Commands: Implement command for adding (completing) achievements
--HG-- branch : trunk
-rw-r--r--sql/base/world_database.sql2
-rw-r--r--sql/updates/10023.world_command.sql4
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp4
-rw-r--r--src/server/game/Achievements/AchievementMgr.h2
-rw-r--r--src/server/game/Chat/Chat.cpp7
-rw-r--r--src/server/game/Chat/Chat.h3
-rw-r--r--src/server/game/Chat/Commands/Level3.cpp28
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.h2
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); }