· 8 years ago · Jul 01, 2018, 11:12 PM
1From d0701846903fad6cf94f950dde89a3f89200398b Mon Sep 17 00:00:00 2001
2From: LordPsyan <realmsofwarcraft@gmail.com>
3Date: Mon, 29 Feb 2016 07:58:47 -0600
4Subject: [PATCH] 2016_02_29-VIP
5
6---
7 sql/TrinityCore-Patches/VIP/account_premium.sql | 22 ++++++
8 .../Database/Implementation/LoginDatabase.cpp | 4 +-
9 .../Database/Implementation/LoginDatabase.h | 3 +
10 src/server/game/Entities/Player/Player.cpp | 9 ++-
11 src/server/game/Miscellaneous/Formulas.h | 5 +-
12 src/server/game/Miscellaneous/Language.h | 2 +-
13 src/server/game/Reputation/ReputationMgr.cpp | 4 +
14 src/server/game/Server/WorldSession.cpp | 3 +-
15 src/server/game/Server/WorldSession.h | 4 +-
16 src/server/game/Server/WorldSocket.cpp | 14 +++-
17 src/server/game/World/World.cpp | 9 +++
18 src/server/game/World/World.h | 9 +++
19 src/server/scripts/Custom/cs_premium.cpp | 88 ++++++++++++++++++++++
20 src/server/scripts/Custom/custom_script_loader.cpp | 6 +-
21 src/server/worldserver/worldserver.conf.dist | 16 ++++
22 15 files changed, 187 insertions(+), 11 deletions(-)
23 create mode 100644 sql/TrinityCore-Patches/VIP/account_premium.sql
24 create mode 100644 src/server/scripts/Custom/cs_premium.cpp
25
26diff --git a/sql/TrinityCore-Patches/VIP/account_premium.sql b/sql/TrinityCore-Patches/VIP/account_premium.sql
27new file mode 100644
28index 0000000..770380c
29--- /dev/null
30+++ b/sql/TrinityCore-Patches/VIP/account_premium.sql
31@@ -0,0 +1,22 @@
32+CREATE TABLE IF NOT EXISTS `auth`.`account_premium` (
33+ `id` int(11) NOT NULL DEFAULT '0' COMMENT 'Account id',
34+ `setdate` int(4) NOT NULL DEFAULT '0',
35+ `unsetdate` int(4) NOT NULL DEFAULT '0',
36+ `premium_type` tinyint(4) unsigned NOT NULL DEFAULT '1',
37+ `active` tinyint(4) NOT NULL DEFAULT '1',
38+ PRIMARY KEY (`id`),
39+ KEY `active` (`active`),
40+ KEY `setdate` (`setdate`),
41+ KEY `unsetdate` (`unsetdate`)
42+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
43+
44+
45+INSERT INTO `auth`.`rbac_permissions` (`id`, `name`) VALUES
46+(999, 'Command: vip');
47+
48+INSERT INTO `auth`.`rbac_linked_permissions` (`id`, `linkedId`) VALUES
49+(195, 999);
50+
51+INSERT INTO `world`.`command` (`name`, `permission`, `help`) VALUES
52+('vip bank', 999, 'Syntax: .vip bank'),
53+('vip mail', 999, 'Syntax: .vip mail');
54\ No newline at end of file
55diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp
56index 2749c08..7985d4b 100644
57--- a/src/server/database/Database/Implementation/LoginDatabase.cpp
58+++ b/src/server/database/Database/Implementation/LoginDatabase.cpp
59@@ -110,8 +110,10 @@ void LoginDatabaseConnection::DoPrepareStatements()
60 PrepareStatement(LOGIN_INS_CHAR_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES (?, ?, ?, ?, ?, unix_timestamp(NOW()), NOW())", CONNECTION_ASYNC);
61 // 0: string, 1: string, 2: string // Complete name: "Login_Insert_Failed_Account_Login_due_password_IP_Logging"
62 PrepareStatement(LOGIN_INS_FALP_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES ((SELECT id FROM account WHERE username = ?), 0, 1, ?, ?, unix_timestamp(NOW()), NOW())", CONNECTION_ASYNC);
63- PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH);
64+ PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_PREMIUM, "UPDATE account_premium SET active = 0 WHERE unsetdate<=UNIX_TIMESTAMP() AND unsetdate<>setdate", CONNECTION_SYNCH);
65+ PrepareStatement(LOGIN_SEL_PREMIUM, "SELECT 1 FROM account_premium WHERE id = ? AND active = 1", CONNECTION_SYNCH);
66
67+ PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH);
68 PrepareStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS, "SELECT permissionId, granted FROM rbac_account_permissions WHERE accountId = ? AND (realmId = ? OR realmId = -1) ORDER BY permissionId, realmId", CONNECTION_BOTH);
69 PrepareStatement(LOGIN_INS_RBAC_ACCOUNT_PERMISSION, "INSERT INTO rbac_account_permissions (accountId, permissionId, granted, realmId) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE granted = VALUES(granted)", CONNECTION_ASYNC);
70 PrepareStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION, "DELETE FROM rbac_account_permissions WHERE accountId = ? AND permissionId = ? AND (realmId = ? OR realmId = -1)", CONNECTION_ASYNC);
71diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h
72index a3789fa..8aa7be5 100644
73--- a/src/server/database/Database/Implementation/LoginDatabase.h
74+++ b/src/server/database/Database/Implementation/LoginDatabase.h
75@@ -106,6 +106,9 @@ enum LoginDatabaseStatements
76 LOGIN_INS_CHAR_IP_LOGGING,
77 LOGIN_INS_FALP_IP_LOGGING,
78
79+ LOGIN_UPD_EXPIRED_ACCOUNT_PREMIUM,
80+ LOGIN_SEL_PREMIUM,
81+
82 LOGIN_SEL_ACCOUNT_ACCESS_BY_ID,
83 LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS,
84 LOGIN_INS_RBAC_ACCOUNT_PERMISSION,
85diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
86index 7190a80..db3f63e 100644
87--- a/src/server/game/Entities/Player/Player.cpp
88+++ b/src/server/game/Entities/Player/Player.cpp
89@@ -6541,6 +6541,9 @@ void Player::CheckAreaExploreAndOutdoor()
90 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE));
91 }
92
93+ if(GetSession()->IsPremium())
94+ XP *= sWorld->getRate(RATE_XP_EXPLORE_PREMIUM);
95+
96 GiveXP(XP, NULL);
97 SendExplorationExperience(areaId, XP);
98 }
99@@ -6910,7 +6913,8 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto
100 // 34
101 // 35
102 // 36
103- // 37
104+ if(GetSession()->IsPremium())
105+ honor_f *= sWorld->getRate(RATE_HONOR_PREMIUM);
106 // 38
107 // 39
108 // 40
109@@ -15040,7 +15044,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
110 // 49
111 // 50
112 // 51
113- // 52
114+ if (GetSession()->IsPremium())
115+ XP *= sWorld->getRate(RATE_XP_QUEST_PREMIUM);
116 // 53
117 // 54
118 // 55
119diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
120index 451883c..1571913 100644
121--- a/src/server/game/Miscellaneous/Formulas.h
122+++ b/src/server/game/Miscellaneous/Formulas.h
123@@ -27,7 +27,7 @@
124 // Prepatch by LordPsyan
125 // 01
126 // 02
127-// 03
128+#include "WorldSession.h"
129 // 04
130 // 05
131 // 06
132@@ -238,6 +238,9 @@ namespace Trinity
133 if (creature && creature->m_PlayerDamageReq) // if players dealt less than 50% of the damage and were credited anyway (due to CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ), scale XP gained appropriately (linear scaling)
134 xpMod *= 1.0f - 2.0f*creature->m_PlayerDamageReq / creature->GetMaxHealth();
135
136+ if(player->GetSession()->IsPremium())
137+ xpMod *= sWorld->getRate(RATE_XP_KILL_PREMIUM);
138+
139 gain = uint32(gain * xpMod);
140 }
141 }
142diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
143index 73a9905..d19eb4b 100644
144--- a/src/server/game/Miscellaneous/Language.h
145+++ b/src/server/game/Miscellaneous/Language.h
146@@ -1206,7 +1206,7 @@ enum TrinityStrings
147 // 15
148 // 16
149 // 17
150- // 18
151+ LANG_PREMIUM_CANT_DO = 12009,
152 // 19
153 // 20
154 // Visit http://www.realmsofwarcraft.com/bb for forums and information
155diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
156index fb2873f..e274d04 100644
157--- a/src/server/game/Reputation/ReputationMgr.cpp
158+++ b/src/server/game/Reputation/ReputationMgr.cpp
159@@ -367,6 +367,10 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in
160 {
161 // int32 *= float cause one point loss?
162 standing = int32(floor((float)standing * sWorld->getRate(RATE_REPUTATION_GAIN) + 0.5f));
163+
164+ if(_player->GetSession()->IsPremium())
165+ standing *= sWorld->getRate(RATE_REPUTATION_PREMIUM);
166+
167 standing += itr->second.Standing + BaseRep;
168 }
169
170diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
171index c380c1a..324b205 100644
172--- a/src/server/game/Server/WorldSession.cpp
173+++ b/src/server/game/Server/WorldSession.cpp
174@@ -95,7 +95,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
175 }
176
177 /// WorldSession constructor
178-WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
179+WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldSocket> sock, AccountTypes sec, bool ispremium, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
180 m_muteTime(mute_time),
181 m_timeOutTime(0),
182 AntiDOS(this),
183@@ -103,6 +103,7 @@ WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldS
184 _player(NULL),
185 m_Socket(sock),
186 _security(sec),
187+ _ispremium(ispremium),
188 _accountId(id),
189 _accountName(std::move(name)),
190 m_expansion(expansion),
191diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
192index 2253b6b..fb64704 100644
193--- a/src/server/game/Server/WorldSession.h
194+++ b/src/server/game/Server/WorldSession.h
195@@ -249,7 +249,7 @@ struct PacketCounter
196 class WorldSession
197 {
198 public:
199- WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
200+ WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldSocket> sock, AccountTypes sec, bool ispremium, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
201 ~WorldSession();
202
203 bool PlayerLoading() const { return m_playerLoading; }
204@@ -286,6 +286,7 @@ class WorldSession
205 void InvalidateRBACData(); // Used to force LoadPermissions at next HasPermission check
206
207 AccountTypes GetSecurity() const { return _security; }
208+ bool IsPremium() const { return _ispremium; }
209 uint32 GetAccountId() const { return _accountId; }
210 Player* GetPlayer() const { return _player; }
211 std::string const& GetPlayerName() const;
212@@ -1040,6 +1041,7 @@ class WorldSession
213 uint32 _accountId;
214 std::string _accountName;
215 uint8 m_expansion;
216+ bool _ispremium;
217
218 typedef std::list<AddonInfo> AddonsList;
219
220diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
221index 3602911..45df331 100644
222--- a/src/server/game/Server/WorldSocket.cpp
223+++ b/src/server/game/Server/WorldSocket.cpp
224@@ -477,7 +477,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
225
226 // Check that Key and account name are the same on client and server
227 uint32 t = 0;
228-
229+ bool isPremium = false;
230 SHA1Hash sha;
231 sha.UpdateData(authSession->Account);
232 sha.UpdateData((uint8*)&t, 4);
233@@ -541,6 +541,16 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
234 return;
235 }
236
237+ // Check premium
238+ stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PREMIUM);
239+ stmt->setUInt32(0, account.Id);
240+ PreparedQueryResult premresult = LoginDatabase.Query(stmt);
241+
242+ if (premresult)
243+ {
244+ isPremium = true;
245+ }
246+
247 // Check locked state for server
248 AccountTypes allowedAccountType = sWorld->GetPlayerSecurityLimit();
249 TC_LOG_DEBUG("network", "Allowed Level: %u Player Level %u", allowedAccountType, account.Security);
250@@ -568,7 +578,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
251
252 _authed = true;
253 _worldSession = new WorldSession(account.Id, std::move(authSession->Account), shared_from_this(), account.Security,
254- account.Expansion, mutetime, account.Locale, account.Recruiter, account.IsRectuiter);
255+ isPremium, account.Expansion, mutetime, account.Locale, account.Recruiter, account.IsRectuiter);
256 _worldSession->ReadAddonsInfo(authSession->AddonInfo);
257
258 // Initialize Warden system only if it is enabled by config
259diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
260index f904f30..6c2f49a 100644
261--- a/src/server/game/World/World.cpp
262+++ b/src/server/game/World/World.cpp
263@@ -472,6 +472,15 @@ void World::LoadConfigSettings(bool reload)
264 rate_values[RATE_XP_BG_KILL] = sConfigMgr->GetFloatDefault("Rate.XP.BattlegroundKill", 1.0f);
265 rate_values[RATE_XP_QUEST] = sConfigMgr->GetFloatDefault("Rate.XP.Quest", 1.0f);
266 rate_values[RATE_XP_EXPLORE] = sConfigMgr->GetFloatDefault("Rate.XP.Explore", 1.0f);
267+
268+ rate_values[RATE_XP_KILL_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Kill.Premium", 1.0f);
269+ rate_values[RATE_XP_QUEST_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Quest.Premium", 1.0f);
270+ rate_values[RATE_XP_EXPLORE_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Explore.Premium", 1.0f);
271+ rate_values[RATE_REPUTATION_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.Reputation.Premium", 1.0f);
272+ rate_values[RATE_HONOR_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.Honor.Premium", 1.0f);
273+ m_bool_configs[COMMAND_BANK_PREMIUM] = sConfigMgr->GetFloatDefault("Command.Bank.Premium", false);
274+ m_bool_configs[COMMAND_MAIL_PREMIUM] = sConfigMgr->GetFloatDefault("Command.Mail.Premium", false);
275+
276 rate_values[RATE_REPAIRCOST] = sConfigMgr->GetFloatDefault("Rate.RepairCost", 1.0f);
277 if (rate_values[RATE_REPAIRCOST] < 0.0f)
278 {
279diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
280index 492a3bd..d6c16e3 100644
281--- a/src/server/game/World/World.h
282+++ b/src/server/game/World/World.h
283@@ -98,6 +98,8 @@ enum WorldBoolConfigs
284 CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
285 CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
286 CONFIG_ALLOW_TWO_SIDE_TRADE,
287+ COMMAND_BANK_PREMIUM,
288+ COMMAND_MAIL_PREMIUM,
289 CONFIG_ALL_TAXI_PATHS,
290 CONFIG_INSTANT_TAXI,
291 CONFIG_INSTANCE_IGNORE_LEVEL,
292@@ -499,6 +501,13 @@ enum Rates
293 RATE_XP_BG_KILL,
294 RATE_XP_QUEST,
295 RATE_XP_EXPLORE,
296+
297+ RATE_XP_KILL_PREMIUM,
298+ RATE_XP_QUEST_PREMIUM,
299+ RATE_XP_EXPLORE_PREMIUM,
300+ RATE_REPUTATION_PREMIUM,
301+ RATE_HONOR_PREMIUM,
302+
303 RATE_REPAIRCOST,
304 RATE_REPUTATION_GAIN,
305 RATE_REPUTATION_LOWLEVEL_KILL,
306diff --git a/src/server/scripts/Custom/cs_premium.cpp b/src/server/scripts/Custom/cs_premium.cpp
307new file mode 100644
308index 0000000..f85ea26
309--- /dev/null
310+++ b/src/server/scripts/Custom/cs_premium.cpp
311@@ -0,0 +1,88 @@
312+#include "Language.h"
313+#include "World.h"
314+//#include "AuctionHouseMgr.h"
315+
316+class premium_commandscript : public CommandScript
317+{
318+public:
319+ premium_commandscript() : CommandScript("premium_commandscript") { }
320+
321+ std::vector<ChatCommand> GetCommands() const override
322+ {
323+ static std::vector<ChatCommand> premiumCommandTable =
324+ {
325+ { "bank", SEC_PLAYER, false, &HandlePremiumBankCommand, "" },
326+ { "mail", SEC_PLAYER, false, &HandlePremiumMailCommand, "" },
327+ //{ "auc", SEC_PLAYER, false, &HandlePremiumAuctionCommand, "", NULL },
328+ };
329+
330+ static std::vector<ChatCommand> commandTable =
331+ {
332+ { "vip", SEC_PLAYER, false, NULL, "", premiumCommandTable },
333+ };
334+
335+ return commandTable;
336+ }
337+
338+ static bool HandlePremiumBankCommand(ChatHandler* handler, char const* /*args*/)
339+ {
340+ Player *player = handler->GetSession()->GetPlayer();
341+ if (player->GetSession()->IsPremium() && sWorld->getBoolConfig(COMMAND_BANK_PREMIUM))
342+ {
343+ //Different Checks
344+ if (player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
345+ {
346+ handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
347+ handler->SetSentErrorMessage(true);
348+ return false;
349+ }
350+
351+ handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID());
352+ }
353+ return true;
354+ }
355+
356+ static bool HandlePremiumMailCommand(ChatHandler* handler, char const* /*args*/)
357+ {
358+ Player* player = handler->GetSession()->GetPlayer();
359+ if (player->GetSession()->IsPremium() && sWorld->getBoolConfig(COMMAND_MAIL_PREMIUM))
360+ {
361+ //Different Checks
362+ if (player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
363+ {
364+ handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
365+ handler->SetSentErrorMessage(true);
366+ return false;
367+ }
368+
369+ handler->GetSession()->SendShowMailBox(player->GetGUID());
370+ }
371+ return true;
372+ }
373+
374+ //static bool HandlePremiumAuctionCommand(ChatHandler* handler, char const* /*args*/)
375+ //{
376+ //Player* player = handler->GetSession()->GetPlayer();
377+ //if(player->GetSession()->IsPremium())
378+ //{
379+ //Different Checks
380+ //if(player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
381+ //{
382+ // handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
383+ // handler->SetSentErrorMessage(true);
384+ // return false;
385+ //}
386+
387+ //handler->GetSession()->SendAuctionHello(player->GetGUID());
388+ //handler->GetSession()->SendAuctionHello(player->getFaction());
389+
390+ //}
391+ //return true;
392+ //}
393+
394+};
395+
396+void AddSC_premium_commandscript()
397+{
398+ new premium_commandscript();
399+}
400\ No newline at end of file
401diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp
402index 0592bb5..ec9ff67 100644
403--- a/src/server/scripts/Custom/custom_script_loader.cpp
404+++ b/src/server/scripts/Custom/custom_script_loader.cpp
405@@ -167,7 +167,8 @@
406 // start149
407 // start150
408 // start151
409-// start152
410+// VIP
411+void AddSC_premium_commandscript();
412 // start153
413 // start154
414 // start155
415@@ -372,7 +373,8 @@ void AddCustomScripts()
416 // end149
417 // end150
418 // end151
419-// end152
420+// VIP
421+ AddSC_premium_commandscript();
422 // end153
423 // end154
424 // end155
425diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
426index 4837a24..083827b 100644
427--- a/src/server/worldserver/worldserver.conf.dist
428+++ b/src/server/worldserver/worldserver.conf.dist
429@@ -2680,6 +2680,22 @@ CharDelete.KeepDays = 30
430 #
431 ###################################################################################################
432
433+# Rate.XP.Kill.Premium
434+# Rate.XP.Quest.Premium
435+# Rate.XP.Explore.Premium
436+# Rate.Honor.Premium
437+# Rate.Reputation.Gain.Premium
438+# XP rates Premium modifier
439+# Default: 1
440+
441+Rate.XP.Kill.Premium = 1
442+Rate.XP.Quest.Premium = 1
443+Rate.XP.Explore.Premium = 1
444+Rate.Honor.Premium = 1
445+Rate.Reputation.Premium = 1
446+Command.Bank.Premium = 1
447+Command.Mail.Premium = 1
448+
449 ###################################################################################################
450 # CUSTOM SERVER OPTIONS
451 #
452--
4532.1.4