From ff396842eb1e196b2d1f85b8eedd4163c2acf3f9 Mon Sep 17 00:00:00 2001
From: LordPsyan <uppp@juno.com>
Date: Tue, 15 Feb 2011 11:29:52 -0500
Subject: [PATCH] 11222-VIP-Accounts
---
sql/extras/character_VIPAccount.sql | 8 ++++++++
src/server/authserver/Server/AuthSocket.cpp | 3 +++
.../AuctionHouseBot/AuctionHouseBot.cpp | 2 +-
src/server/game/Entities/Player/Player.cpp | 6 +++++-
src/server/game/Miscellaneous/Formulas.h | 4 +++-
src/server/game/Server/WorldSession.cpp | 4 ++--
src/server/game/Server/WorldSession.h | 4 +++-
src/server/game/Server/WorldSocket.cpp | 13 ++++++++++++-
src/server/game/World/World.cpp | 10 +++++++---
src/server/game/World/World.h | 3 +++
.../Database/Implementation/LoginDatabase.cpp | 1 +
.../shared/Database/Implementation/LoginDatabase.h | 1 +
src/server/worldserver/worldserver.conf.dist | 8 ++++++++
13 files changed, 57 insertions(+), 10 deletions(-)
create mode 100644 sql/extras/character_VIPAccount.sql
diff --git a/sql/extras/character_VIPAccount.sql b/sql/extras/character_VIPAccount.sql
new file mode 100644
index 0000000..df317ed
--- /dev/null
+++ b/sql/extras/character_VIPAccount.sql
@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS `account_premium` (
+ `id` int(11) NOT NULL default '0' COMMENT 'Account id',
+ `setdate` bigint(40) NOT NULL default '0',
+ `unsetdate` bigint(40) NOT NULL default '0',
+ `premium_type` tinyint(4) unsigned NOT NULL default '1',
+ `active` tinyint(4) NOT NULL default '1',
+ PRIMARY KEY (`id`,`setdate`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Premium Accounts';
\ No newline at end of file
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index 0b7a49f..21a4fe5 100755
--- a/src/server/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
@@ -349,6 +349,9 @@ bool AuthSocket::_HandleLogonChallenge()
// Verify that this IP is not in the ip_banned table
LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_SET_EXPIREDIPBANS));
+ LoginDatabase.Execute(
+ LoginDatabase.GetPreparedStatement(LOGIN_SET_ACCOUNT_PREMIUM)
+ );
const std::string& ip_address = socket().get_remote_address();
PreparedStatement *stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_IPBANNED);
stmt->setString(0, ip_address);
diff --git a/src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.cpp b/src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.cpp
index 536ec4b..6d6196b 100644
--- a/src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.cpp
@@ -713,7 +713,7 @@ void AuctionHouseBot::Update()
if ((!AHBSeller) && (!AHBBuyer))
return;
- WorldSession _session(AHBplayerAccount, NULL, SEC_PLAYER, true, 0, LOCALE_enUS, 0);
+ WorldSession _session(AHBplayerAccount, NULL, SEC_PLAYER, false, true, 0, LOCALE_enUS);
Player _AHBplayer(&_session);
_AHBplayer.Initialize(AHBplayerGUID);
sObjectAccessor->AddObject(&_AHBplayer);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ea221d8..9e995a2 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6608,7 +6608,8 @@ void Player::CheckAreaExploreAndOutdoor()
{
XP = uint32(sObjectMgr->GetBaseXP(p->area_level)*sWorld->getRate(RATE_XP_EXPLORE));
}
-
+ if(GetSession()->IsPremium())
+ XP *= sWorld->getRate(RATE_XP_EXPLORE_PREMIUM);
GiveXP(XP, NULL);
SendExplorationExperience(area,XP);
}
@@ -14676,6 +14677,9 @@ void Player::RewardQuest(Quest const *pQuest, uint32 reward, Object* questGiver,
for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
AddPctN(XP, (*i)->GetAmount());
+ if (GetSession()->IsPremium())
+ XP *= sWorld->getRate(RATE_XP_QUEST_PREMIUM);
+
int32 moneyRew = 0;
if (getLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
GiveXP(XP, NULL);
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 0cd45b9..65b8600 100755
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -178,7 +178,9 @@ namespace Trinity
gain *= 2;
}
- gain = uint32(gain * sWorld->getRate(RATE_XP_KILL));
+ float premium_rate = pl->GetSession()->IsPremium() ? sWorld->getRate(RATE_XP_KILL_PREMIUM) : 1.0f;
+
+ return uint32(gain*sWorld->getRate(RATE_XP_KILL)*premium_rate);
}
sScriptMgr->OnGainCalculation(gain, pl, u);
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 7a0e3a6..9cf7633 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -85,9 +85,9 @@ bool WorldSessionFilter::Process(WorldPacket *packet)
}
/// WorldSession constructor
-WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter):
+WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, bool ispremium, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter):
m_muteTime(mute_time), m_timeOutTime(0), _player(NULL), m_Socket(sock),
-_security(sec), _accountId(id), m_expansion(expansion), _logoutTime(0),
+_security(sec), _ispremium(ispremium), _accountId(id), m_expansion(expansion), _logoutTime(0),
m_inQueue(false), m_playerLoading(false), m_playerLogout(false),
m_playerRecentlyLogout(false), m_playerSave(false),
m_sessionDbcLocale(sWorld->GetAvailableDbcLocale(locale)),
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 926b0ac..c21678f 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -180,7 +180,7 @@ class WorldSession
{
friend class CharacterHandler;
public:
- WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter);
+ WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, bool ispremium, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter);
~WorldSession();
bool PlayerLoading() const { return m_playerLoading; }
@@ -208,6 +208,7 @@ class WorldSession
void SendClientCacheVersion(uint32 version);
AccountTypes GetSecurity() const { return _security; }
+ bool IsPremium() const { return _ispremium; }
uint32 GetAccountId() const { return _accountId; }
Player* GetPlayer() const { return _player; }
char const* GetPlayerName() const;
@@ -893,6 +894,7 @@ class WorldSession
AccountTypes _security;
uint32 _accountId;
uint8 m_expansion;
+ bool _ispremium;
time_t _logoutTime;
bool m_inQueue; // session wait in auth.queue
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 084eade..3e02c59 100755
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -773,6 +773,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
//uint8 expansion = 0;
LocaleConstant locale;
std::string account;
+ bool isPremium = false;
SHA1Hash sha1;
BigNumber v, s, g, N;
WorldPacket packet, SendAddonPacked;
@@ -928,6 +929,16 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
return -1;
}
+ QueryResult premresult =
+ LoginDatabase.PQuery ("SELECT 1 "
+ "FROM account_premium "
+ "WHERE id = '%u' "
+ "AND active = 1",
+ id);
+ if (premresult) // if account premium
+ {
+ isPremium = true;
+ }
// Check locked state for server
AccountTypes allowedAccountType = sWorld->GetPlayerSecurityLimit();
sLog->outDebug("Allowed Level: %u Player Level %u", allowedAccountType, AccountTypes(security));
@@ -983,7 +994,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
safe_account.c_str());
// NOTE ATM the socket is single-threaded, have this in mind ...
- ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale, recruiter), -1);
+ ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), isPremium, expansion, mutetime, locale, recruiter), -1);
m_Crypt.Init(&K);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 2c4458a..7d47798 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -454,9 +454,13 @@ void World::LoadConfigSettings(bool reload)
rate_values[RATE_DROP_ITEM_REFERENCED] = sConfig->GetFloatDefault("Rate.Drop.Item.Referenced", 1.0f);
rate_values[RATE_DROP_ITEM_REFERENCED_AMOUNT] = sConfig->GetFloatDefault("Rate.Drop.Item.ReferencedAmount", 1.0f);
rate_values[RATE_DROP_MONEY] = sConfig->GetFloatDefault("Rate.Drop.Money", 1.0f);
- rate_values[RATE_XP_KILL] = sConfig->GetFloatDefault("Rate.XP.Kill", 1.0f);
- rate_values[RATE_XP_QUEST] = sConfig->GetFloatDefault("Rate.XP.Quest", 1.0f);
- rate_values[RATE_XP_EXPLORE] = sConfig->GetFloatDefault("Rate.XP.Explore", 1.0f);
+ rate_values[RATE_XP_KILL] = sConfig->GetFloatDefault("Rate.XP.Kill", 1.0f);
+ rate_values[RATE_XP_KILL_PREMIUM] = sConfig->GetFloatDefault("Rate.XP.Kill.Premium", 1.0f);
+ rate_values[RATE_XP_QUEST] = sConfig->GetFloatDefault("Rate.XP.Quest", 1.0f);
+ rate_values[RATE_XP_QUEST_PREMIUM] = sConfig->GetFloatDefault("Rate.XP.Quest.Premium", 1.0f);
+ rate_values[RATE_XP_EXPLORE] = sConfig->GetFloatDefault("Rate.XP.Explore", 1.0f);
+ rate_values[RATE_XP_EXPLORE_PREMIUM] = sConfig->GetFloatDefault("Rate.XP.Explore.Premium", 1.0f);
+
rate_values[RATE_REPAIRCOST] = sConfig->GetFloatDefault("Rate.RepairCost", 1.0f);
if (rate_values[RATE_REPAIRCOST] < 0.0f)
{
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 7e052ed..726ad30 100755
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -336,8 +336,11 @@ enum Rates
RATE_DROP_ITEM_REFERENCED_AMOUNT,
RATE_DROP_MONEY,
RATE_XP_KILL,
+ RATE_XP_KILL_PREMIUM,
RATE_XP_QUEST,
+ RATE_XP_QUEST_PREMIUM,
RATE_XP_EXPLORE,
+ RATE_XP_EXPLORE_PREMIUM,
RATE_REPAIRCOST,
RATE_REPUTATION_GAIN,
RATE_REPUTATION_LOWLEVEL_KILL,
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 6f34700..c012a2a 100755
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -47,6 +47,7 @@ bool LoginDatabaseConnection::Open()
PREPARE_STATEMENT(LOGIN_SET_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(LOGIN_SET_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC)
PREPARE_STATEMENT(LOGIN_SET_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(LOGIN_SET_ACCOUNT_PREMIUM, "UPDATE account_premium SET active = 0 WHERE unsetdate<=UNIX_TIMESTAMP() AND unsetdate<>setdate", CONNECTION_ASYNC)
/* ############## END OF LOADING PREPARED STATEMENTS ############## */
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h
index d512607..3182c02 100755
--- a/src/server/shared/Database/Implementation/LoginDatabase.h
+++ b/src/server/shared/Database/Implementation/LoginDatabase.h
@@ -62,6 +62,7 @@ enum LoginDatabaseStatements
LOGIN_SET_IP_NOT_BANNED,
LOGIN_SET_ACCOUNT_BANNED,
LOGIN_SET_ACCOUNT_NOT_BANNED,
+ LOGIN_SET_ACCOUNT_PREMIUM,
MAX_LOGINDATABASE_STATEMENTS,
};
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 5a19589..a73cbef 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2021,10 +2021,18 @@ Rate.Drop.Item.ReferencedAmount = 1
# Default: 1 - (Rate.XP.Kill)
# 1 - (Rate.XP.Quest)
# 1 - ( Rate.XP.Explore)
+# Rate.XP.Kill.Premium
+# Rate.XP.Quest.Premium
+# Rate.XP.Explore.Premium
+# XP rates Premium modifier
+# Default: 1
Rate.XP.Kill = 1
Rate.XP.Quest = 1
Rate.XP.Explore = 1
+Rate.XP.Kill.Premium = 1
+Rate.XP.Quest.Premium = 1
+Rate.XP.Explore.Premium = 1
#
# Rate.RepairCost
--
1.7.2.3