eluna-scripts-ornfelt/lua/WowEmulationScriptPack/patch/choices/2016_02_29-VIP.patch
2024-09-23 07:59:23 +02:00

454 lines
20 KiB
Diff

From d0701846903fad6cf94f950dde89a3f89200398b Mon Sep 17 00:00:00 2001
From: LordPsyan <realmsofwarcraft@gmail.com>
Date: Mon, 29 Feb 2016 07:58:47 -0600
Subject: [PATCH] 2016_02_29-VIP
---
sql/TrinityCore-Patches/VIP/account_premium.sql | 22 ++++++
.../Database/Implementation/LoginDatabase.cpp | 4 +-
.../Database/Implementation/LoginDatabase.h | 3 +
src/server/game/Entities/Player/Player.cpp | 9 ++-
src/server/game/Miscellaneous/Formulas.h | 5 +-
src/server/game/Miscellaneous/Language.h | 2 +-
src/server/game/Reputation/ReputationMgr.cpp | 4 +
src/server/game/Server/WorldSession.cpp | 3 +-
src/server/game/Server/WorldSession.h | 4 +-
src/server/game/Server/WorldSocket.cpp | 14 +++-
src/server/game/World/World.cpp | 9 +++
src/server/game/World/World.h | 9 +++
src/server/scripts/Custom/cs_premium.cpp | 88 ++++++++++++++++++++++
src/server/scripts/Custom/custom_script_loader.cpp | 6 +-
src/server/worldserver/worldserver.conf.dist | 16 ++++
15 files changed, 187 insertions(+), 11 deletions(-)
create mode 100644 sql/TrinityCore-Patches/VIP/account_premium.sql
create mode 100644 src/server/scripts/Custom/cs_premium.cpp
diff --git a/sql/TrinityCore-Patches/VIP/account_premium.sql b/sql/TrinityCore-Patches/VIP/account_premium.sql
new file mode 100644
index 0000000..770380c
--- /dev/null
+++ b/sql/TrinityCore-Patches/VIP/account_premium.sql
@@ -0,0 +1,22 @@
+CREATE TABLE IF NOT EXISTS `auth`.`account_premium` (
+ `id` int(11) NOT NULL DEFAULT '0' COMMENT 'Account id',
+ `setdate` int(4) NOT NULL DEFAULT '0',
+ `unsetdate` int(4) NOT NULL DEFAULT '0',
+ `premium_type` tinyint(4) unsigned NOT NULL DEFAULT '1',
+ `active` tinyint(4) NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ KEY `active` (`active`),
+ KEY `setdate` (`setdate`),
+ KEY `unsetdate` (`unsetdate`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+INSERT INTO `auth`.`rbac_permissions` (`id`, `name`) VALUES
+(999, 'Command: vip');
+
+INSERT INTO `auth`.`rbac_linked_permissions` (`id`, `linkedId`) VALUES
+(195, 999);
+
+INSERT INTO `world`.`command` (`name`, `permission`, `help`) VALUES
+('vip bank', 999, 'Syntax: .vip bank'),
+('vip mail', 999, 'Syntax: .vip mail');
\ No newline at end of file
diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp
index 2749c08..7985d4b 100644
--- a/src/server/database/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/database/Database/Implementation/LoginDatabase.cpp
@@ -110,8 +110,10 @@ void LoginDatabaseConnection::DoPrepareStatements()
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);
// 0: string, 1: string, 2: string // Complete name: "Login_Insert_Failed_Account_Login_due_password_IP_Logging"
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);
- 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);
+ PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_PREMIUM, "UPDATE account_premium SET active = 0 WHERE unsetdate<=UNIX_TIMESTAMP() AND unsetdate<>setdate", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PREMIUM, "SELECT 1 FROM account_premium WHERE id = ? AND active = 1", CONNECTION_SYNCH);
+ 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);
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);
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);
PrepareStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION, "DELETE FROM rbac_account_permissions WHERE accountId = ? AND permissionId = ? AND (realmId = ? OR realmId = -1)", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h
index a3789fa..8aa7be5 100644
--- a/src/server/database/Database/Implementation/LoginDatabase.h
+++ b/src/server/database/Database/Implementation/LoginDatabase.h
@@ -106,6 +106,9 @@ enum LoginDatabaseStatements
LOGIN_INS_CHAR_IP_LOGGING,
LOGIN_INS_FALP_IP_LOGGING,
+ LOGIN_UPD_EXPIRED_ACCOUNT_PREMIUM,
+ LOGIN_SEL_PREMIUM,
+
LOGIN_SEL_ACCOUNT_ACCESS_BY_ID,
LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS,
LOGIN_INS_RBAC_ACCOUNT_PERMISSION,
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 7190a80..db3f63e 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6541,6 +6541,9 @@ void Player::CheckAreaExploreAndOutdoor()
XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE));
}
+ if(GetSession()->IsPremium())
+ XP *= sWorld->getRate(RATE_XP_EXPLORE_PREMIUM);
+
GiveXP(XP, NULL);
SendExplorationExperience(areaId, XP);
}
@@ -6910,7 +6913,8 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto
// 34
// 35
// 36
- // 37
+ if(GetSession()->IsPremium())
+ honor_f *= sWorld->getRate(RATE_HONOR_PREMIUM);
// 38
// 39
// 40
@@ -15040,7 +15044,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
// 49
// 50
// 51
- // 52
+ if (GetSession()->IsPremium())
+ XP *= sWorld->getRate(RATE_XP_QUEST_PREMIUM);
// 53
// 54
// 55
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 451883c..1571913 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -27,7 +27,7 @@
// Prepatch by LordPsyan
// 01
// 02
-// 03
+#include "WorldSession.h"
// 04
// 05
// 06
@@ -238,6 +238,9 @@ namespace Trinity
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)
xpMod *= 1.0f - 2.0f*creature->m_PlayerDamageReq / creature->GetMaxHealth();
+ if(player->GetSession()->IsPremium())
+ xpMod *= sWorld->getRate(RATE_XP_KILL_PREMIUM);
+
gain = uint32(gain * xpMod);
}
}
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 73a9905..d19eb4b 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1206,7 +1206,7 @@ enum TrinityStrings
// 15
// 16
// 17
- // 18
+ LANG_PREMIUM_CANT_DO = 12009,
// 19
// 20
// Visit http://www.realmsofwarcraft.com/bb for forums and information
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index fb2873f..e274d04 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -367,6 +367,10 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in
{
// int32 *= float cause one point loss?
standing = int32(floor((float)standing * sWorld->getRate(RATE_REPUTATION_GAIN) + 0.5f));
+
+ if(_player->GetSession()->IsPremium())
+ standing *= sWorld->getRate(RATE_REPUTATION_PREMIUM);
+
standing += itr->second.Standing + BaseRep;
}
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index c380c1a..324b205 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -95,7 +95,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
}
/// WorldSession constructor
-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):
+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):
m_muteTime(mute_time),
m_timeOutTime(0),
AntiDOS(this),
@@ -103,6 +103,7 @@ WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldS
_player(NULL),
m_Socket(sock),
_security(sec),
+ _ispremium(ispremium),
_accountId(id),
_accountName(std::move(name)),
m_expansion(expansion),
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 2253b6b..fb64704 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -249,7 +249,7 @@ struct PacketCounter
class WorldSession
{
public:
- 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);
+ 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);
~WorldSession();
bool PlayerLoading() const { return m_playerLoading; }
@@ -286,6 +286,7 @@ class WorldSession
void InvalidateRBACData(); // Used to force LoadPermissions at next HasPermission check
AccountTypes GetSecurity() const { return _security; }
+ bool IsPremium() const { return _ispremium; }
uint32 GetAccountId() const { return _accountId; }
Player* GetPlayer() const { return _player; }
std::string const& GetPlayerName() const;
@@ -1040,6 +1041,7 @@ class WorldSession
uint32 _accountId;
std::string _accountName;
uint8 m_expansion;
+ bool _ispremium;
typedef std::list<AddonInfo> AddonsList;
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 3602911..45df331 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -477,7 +477,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
// Check that Key and account name are the same on client and server
uint32 t = 0;
-
+ bool isPremium = false;
SHA1Hash sha;
sha.UpdateData(authSession->Account);
sha.UpdateData((uint8*)&t, 4);
@@ -541,6 +541,16 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
return;
}
+ // Check premium
+ stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PREMIUM);
+ stmt->setUInt32(0, account.Id);
+ PreparedQueryResult premresult = LoginDatabase.Query(stmt);
+
+ if (premresult)
+ {
+ isPremium = true;
+ }
+
// Check locked state for server
AccountTypes allowedAccountType = sWorld->GetPlayerSecurityLimit();
TC_LOG_DEBUG("network", "Allowed Level: %u Player Level %u", allowedAccountType, account.Security);
@@ -568,7 +578,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
_authed = true;
_worldSession = new WorldSession(account.Id, std::move(authSession->Account), shared_from_this(), account.Security,
- account.Expansion, mutetime, account.Locale, account.Recruiter, account.IsRectuiter);
+ isPremium, account.Expansion, mutetime, account.Locale, account.Recruiter, account.IsRectuiter);
_worldSession->ReadAddonsInfo(authSession->AddonInfo);
// Initialize Warden system only if it is enabled by config
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index f904f30..6c2f49a 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -472,6 +472,15 @@ void World::LoadConfigSettings(bool reload)
rate_values[RATE_XP_BG_KILL] = sConfigMgr->GetFloatDefault("Rate.XP.BattlegroundKill", 1.0f);
rate_values[RATE_XP_QUEST] = sConfigMgr->GetFloatDefault("Rate.XP.Quest", 1.0f);
rate_values[RATE_XP_EXPLORE] = sConfigMgr->GetFloatDefault("Rate.XP.Explore", 1.0f);
+
+ rate_values[RATE_XP_KILL_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Kill.Premium", 1.0f);
+ rate_values[RATE_XP_QUEST_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Quest.Premium", 1.0f);
+ rate_values[RATE_XP_EXPLORE_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.XP.Explore.Premium", 1.0f);
+ rate_values[RATE_REPUTATION_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.Reputation.Premium", 1.0f);
+ rate_values[RATE_HONOR_PREMIUM] = sConfigMgr->GetFloatDefault("Rate.Honor.Premium", 1.0f);
+ m_bool_configs[COMMAND_BANK_PREMIUM] = sConfigMgr->GetFloatDefault("Command.Bank.Premium", false);
+ m_bool_configs[COMMAND_MAIL_PREMIUM] = sConfigMgr->GetFloatDefault("Command.Mail.Premium", false);
+
rate_values[RATE_REPAIRCOST] = sConfigMgr->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 492a3bd..d6c16e3 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -98,6 +98,8 @@ enum WorldBoolConfigs
CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
CONFIG_ALLOW_TWO_SIDE_TRADE,
+ COMMAND_BANK_PREMIUM,
+ COMMAND_MAIL_PREMIUM,
CONFIG_ALL_TAXI_PATHS,
CONFIG_INSTANT_TAXI,
CONFIG_INSTANCE_IGNORE_LEVEL,
@@ -499,6 +501,13 @@ enum Rates
RATE_XP_BG_KILL,
RATE_XP_QUEST,
RATE_XP_EXPLORE,
+
+ RATE_XP_KILL_PREMIUM,
+ RATE_XP_QUEST_PREMIUM,
+ RATE_XP_EXPLORE_PREMIUM,
+ RATE_REPUTATION_PREMIUM,
+ RATE_HONOR_PREMIUM,
+
RATE_REPAIRCOST,
RATE_REPUTATION_GAIN,
RATE_REPUTATION_LOWLEVEL_KILL,
diff --git a/src/server/scripts/Custom/cs_premium.cpp b/src/server/scripts/Custom/cs_premium.cpp
new file mode 100644
index 0000000..f85ea26
--- /dev/null
+++ b/src/server/scripts/Custom/cs_premium.cpp
@@ -0,0 +1,88 @@
+#include "Language.h"
+#include "World.h"
+//#include "AuctionHouseMgr.h"
+
+class premium_commandscript : public CommandScript
+{
+public:
+ premium_commandscript() : CommandScript("premium_commandscript") { }
+
+ std::vector<ChatCommand> GetCommands() const override
+ {
+ static std::vector<ChatCommand> premiumCommandTable =
+ {
+ { "bank", SEC_PLAYER, false, &HandlePremiumBankCommand, "" },
+ { "mail", SEC_PLAYER, false, &HandlePremiumMailCommand, "" },
+ //{ "auc", SEC_PLAYER, false, &HandlePremiumAuctionCommand, "", NULL },
+ };
+
+ static std::vector<ChatCommand> commandTable =
+ {
+ { "vip", SEC_PLAYER, false, NULL, "", premiumCommandTable },
+ };
+
+ return commandTable;
+ }
+
+ static bool HandlePremiumBankCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player *player = handler->GetSession()->GetPlayer();
+ if (player->GetSession()->IsPremium() && sWorld->getBoolConfig(COMMAND_BANK_PREMIUM))
+ {
+ //Different Checks
+ if (player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
+ {
+ handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID());
+ }
+ return true;
+ }
+
+ static bool HandlePremiumMailCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+ if (player->GetSession()->IsPremium() && sWorld->getBoolConfig(COMMAND_MAIL_PREMIUM))
+ {
+ //Different Checks
+ if (player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
+ {
+ handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->GetSession()->SendShowMailBox(player->GetGUID());
+ }
+ return true;
+ }
+
+ //static bool HandlePremiumAuctionCommand(ChatHandler* handler, char const* /*args*/)
+ //{
+ //Player* player = handler->GetSession()->GetPlayer();
+ //if(player->GetSession()->IsPremium())
+ //{
+ //Different Checks
+ //if(player->IsInCombat() || player->IsInFlight() || player->GetMap()->IsBattlegroundOrArena() || player->HasStealthAura() || player->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || player->isDead())
+ //{
+ // handler->SendSysMessage(LANG_PREMIUM_CANT_DO);
+ // handler->SetSentErrorMessage(true);
+ // return false;
+ //}
+
+ //handler->GetSession()->SendAuctionHello(player->GetGUID());
+ //handler->GetSession()->SendAuctionHello(player->getFaction());
+
+ //}
+ //return true;
+ //}
+
+};
+
+void AddSC_premium_commandscript()
+{
+ new premium_commandscript();
+}
\ No newline at end of file
diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp
index 0592bb5..ec9ff67 100644
--- a/src/server/scripts/Custom/custom_script_loader.cpp
+++ b/src/server/scripts/Custom/custom_script_loader.cpp
@@ -167,7 +167,8 @@
// start149
// start150
// start151
-// start152
+// VIP
+void AddSC_premium_commandscript();
// start153
// start154
// start155
@@ -372,7 +373,8 @@ void AddCustomScripts()
// end149
// end150
// end151
-// end152
+// VIP
+ AddSC_premium_commandscript();
// end153
// end154
// end155
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 4837a24..083827b 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2680,6 +2680,22 @@ CharDelete.KeepDays = 30
#
###################################################################################################
+# Rate.XP.Kill.Premium
+# Rate.XP.Quest.Premium
+# Rate.XP.Explore.Premium
+# Rate.Honor.Premium
+# Rate.Reputation.Gain.Premium
+# XP rates Premium modifier
+# Default: 1
+
+Rate.XP.Kill.Premium = 1
+Rate.XP.Quest.Premium = 1
+Rate.XP.Explore.Premium = 1
+Rate.Honor.Premium = 1
+Rate.Reputation.Premium = 1
+Command.Bank.Premium = 1
+Command.Mail.Premium = 1
+
###################################################################################################
# CUSTOM SERVER OPTIONS
#
--
2.1.4