aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2012-02-23 13:06:35 +0100
committerSpp <spp@jorge.gr>2012-02-23 13:06:35 +0100
commit5cff9e071640bc47688b71bb264edd8267ba77c3 (patch)
treec599d12dfb7870d7c34a07490a930b3102c3d8ac /src/server/game/Server
parentf0ca875a216eaab3d213feae8ba75c07795c9304 (diff)
parent9219625243bc9f63e5a152e6cda1043cfaade201 (diff)
Merge branch 'master' into 4.x
Conflicts: sql/base/auth_database.sql src/server/authserver/Server/AuthSocket.cpp src/server/game/AI/CoreAI/CombatAI.cpp src/server/game/AuctionHouse/AuctionHouseMgr.cpp src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp src/server/game/DataStores/DBCStructure.h src/server/game/DataStores/DBCfmt.h src/server/game/Entities/Unit/Unit.cpp src/server/game/Entities/Vehicle/Vehicle.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Globals/ObjectMgr.h src/server/game/Handlers/AuctionHouseHandler.cpp src/server/game/Miscellaneous/SharedDefines.h src/server/game/Movement/MotionMaster.cpp src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp src/server/game/Quests/QuestDef.cpp src/server/game/Server/Protocol/Opcodes.cpp src/server/game/Server/WorldSocket.cpp src/server/game/Spells/Spell.cpp src/server/game/Spells/SpellEffects.cpp src/server/game/Spells/SpellInfo.cpp src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp src/server/scripts/Spells/spell_quest.cpp src/server/shared/Logging/Log.h src/server/worldserver/worldserver.conf.dist src/tools/vmap3_extractor/model.h src/tools/vmap4_extractor/CMakeLists.txt src/tools/vmap4_extractor/dbcfile.cpp src/tools/vmap4_extractor/dbcfile.h src/tools/vmap4_extractor/loadlib/loadlib.h
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp3
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp38
-rwxr-xr-xsrc/server/game/Server/WorldSession.h10
-rwxr-xr-xsrc/server/game/Server/WorldSocket.cpp20
4 files changed, 59 insertions, 12 deletions
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 4ed8f90b10e..707dd65e2ad 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -27,7 +27,6 @@ OpcodeHandler* opcodeTable[NUM_OPCODE_HANDLERS] = { };
/// Correspondence between opcodes and their names
void InitOpcodes()
{
-
#define DEFINE_OPCODE_HANDLER(opcode, status, processing, handler) \
if (opcode == 0) \
sLog->outError("Opcode %s got value 0", #opcode); \
@@ -803,7 +802,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(CMSG_GM_UNTEACH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(CMSG_WARDEN_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode );
+ //DEFINE_OPCODE_HANDLER(CMSG_WARDEN_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode );
//DEFINE_OPCODE_HANDLER(SMSG_GROUP_JOINED_BATTLEGROUND, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(MSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlegroundPlayerPositionsOpcode);
//DEFINE_OPCODE_HANDLER(CMSG_PET_STOP_ATTACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack );
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 978f33c88aa..e93c0eb8102 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -42,6 +42,8 @@
#include "zlib.h"
#include "ScriptMgr.h"
#include "Transport.h"
+#include "WardenWin.h"
+#include "WardenMac.h"
bool MapSessionFilter::Process(WorldPacket* packet)
{
@@ -98,6 +100,8 @@ m_sessionDbLocaleIndex(locale),
m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter),
isRecruiter(isARecruiter), timeLastWhoCommand(0)
{
+ _warden = NULL;
+
if (sock)
{
m_Address = sock->GetRemoteAddress();
@@ -124,6 +128,9 @@ WorldSession::~WorldSession()
m_Socket = NULL;
}
+ if (_warden)
+ delete _warden;
+
///- empty incoming packet queue
WorldPacket* packet = NULL;
while (_recvQueue.next(packet))
@@ -144,6 +151,12 @@ char const* WorldSession::GetPlayerName() const
return GetPlayer() ? GetPlayer()->GetName() : "<none>";
}
+/// Get player guid if available. Use for logging purposes only
+uint32 WorldSession::GetGuidLow() const
+{
+ return GetPlayer() ? GetPlayer()->GetGUIDLow() : 0;
+}
+
/// Send a packet to the client
void WorldSession::SendPacket(WorldPacket const* packet)
{
@@ -349,6 +362,9 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
delete packet;
}
+ if (m_Socket && !m_Socket->IsClosed() && _warden)
+ _warden->Update();
+
ProcessQueryCallbacks();
//check if we are safe to proceed with logout
@@ -360,6 +376,9 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (ShouldLogOut(currTime) && !m_playerLoading)
LogoutPlayer(true);
+ if (m_Socket && GetPlayer() && _warden)
+ _warden->Update();
+
///- Cleanup socket pointer if need
if (m_Socket && m_Socket->IsClosed())
{
@@ -520,8 +539,8 @@ void WorldSession::LogoutPlayer(bool Save)
// calls to GetMap in this case may cause crashes
_player->CleanupsBeforeDelete();
sLog->outChar("Account: %d (IP: %s) Logout Character:[%s] (GUID: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow());
- Map* _map = _player->GetMap();
- _map->RemovePlayerFromMap(_player, true);
+ if (Map* _map = _player->FindMap())
+ _map->RemovePlayerFromMap(_player, true);
SetPlayer(NULL); // deleted in Remove call
///- Send the 'logout complete' packet to the client
@@ -997,3 +1016,18 @@ void WorldSession::ProcessQueryCallbacks()
_stableSwapCallback.FreeResult();
}
}
+
+void WorldSession::InitWarden(BigNumber* k, std::string os)
+{
+ if (os == "Win")
+ {
+ _warden = new WardenWin();
+ _warden->Init(this, k);
+ }
+ else if (os == "OSX")
+ {
+ // Disabled as it is causing the client to crash
+ // _warden = new WardenMac();
+ // _warden->Init(this, k);
+ }
+}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index ec2587f8b29..21cc3991b9f 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -29,6 +29,7 @@
#include "DatabaseEnv.h"
#include "World.h"
#include "WorldPacket.h"
+#include "Cryptography/BigNumber.h"
struct ItemTemplate;
struct AuctionEntry;
@@ -46,6 +47,7 @@ class WorldPacket;
class WorldSocket;
class LoginQueryHolder;
class SpellCastTargets;
+class Warden;
struct AreaTableEntry;
struct LfgJoinResultData;
struct LfgLockStatus;
@@ -252,11 +254,14 @@ class WorldSession
uint32 GetAccountId() const { return _accountId; }
Player* GetPlayer() const { return _player; }
char const* GetPlayerName() const;
+ uint32 GetGuidLow() const;
void SetSecurity(AccountTypes security) { _security = security; }
std::string const& GetRemoteAddress() { return m_Address; }
void SetPlayer(Player* player);
uint8 Expansion() const { return m_expansion; }
+ void InitWarden(BigNumber* k, std::string os);
+
/// Session in auth.queue currently
void SetInQueue(bool state) { m_inQueue = state; }
@@ -501,6 +506,7 @@ class WorldSession
void HandleSetActionButtonOpcode(WorldPacket& recvPacket);
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
+ void HandleMeetingStoneInfo(WorldPacket& recPacket);
void HandleGameobjectReportUse(WorldPacket& recvPacket);
void HandleNameQueryOpcode(WorldPacket& recvPacket);
@@ -585,6 +591,7 @@ class WorldSession
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiExpressOpcode(WorldPacket& recvPacket);
void HandleMoveSplineDoneOpcode(WorldPacket& recvPacket);
+ void SendActivateTaxiReply(ActivateTaxiReply reply);
void HandleTabardVendorActivateOpcode(WorldPacket& recvPacket);
void HandleBankerActivateOpcode(WorldPacket& recvPacket);
@@ -950,6 +957,9 @@ class WorldSession
typedef std::list<AddonInfo> AddonsList;
+ // Warden
+ Warden* _warden; // Remains NULL if Warden system is not enabled by config
+
time_t _logoutTime;
bool m_inQueue; // session wait in auth.queue
bool m_playerLoading; // code processed in LoginPlayer
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 881464ce40a..22689e40c2b 100755
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -869,7 +869,8 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
"expansion, " //6
"mutetime, " //7
"locale, " //8
- "recruiter " //9
+ "recruiter, " //9
+ "os "
"FROM account "
"WHERE username = '%s'",
safe_account.c_str());
@@ -926,10 +927,10 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
id = fields[0].GetUInt32();
/*
if (security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB
- security = SEC_ADMINISTRATOR;
- */
+ security = SEC_ADMINISTRATOR;
+ */
- K.SetHexStr (fields[1].GetCString());
+ k.SetHexStr (fields[1].GetCString());
int64 mutetime = fields[7].GetInt64();
//! Negative mutetime indicates amount of seconds to be muted effective on next login - which is now.
@@ -950,6 +951,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
locale = LOCALE_enUS;
uint32 recruiter = fields[9].GetUInt32();
+ std::string os = fields[10].GetString();
// Checks gmlevel per Realm
result = LoginDatabase.PQuery ("SELECT "
@@ -1000,8 +1002,6 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
}
// Check that Key and account name are the same on client and server
- SHA1Hash sha;
-
uint32 t = 0;
uint32 seed = m_Seed;
@@ -1009,7 +1009,7 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
sha.UpdateData ((uint8 *) & t, 4);
sha.UpdateData ((uint8 *) & clientSeed, 4);
sha.UpdateData ((uint8 *) & seed, 4);
- sha.UpdateBigNumbers (&K, NULL);
+ sha.UpdateBigNumbers (&k, NULL);
sha.Finalize();
std::string address = GetRemoteAddress();
@@ -1037,13 +1037,17 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
// 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, isRecruiter), -1);
- m_Crypt.Init(&K);
+ m_Crypt.Init(&k);
m_Session->LoadGlobalAccountData();
m_Session->LoadTutorialsData();
packetAddon.rpos(0);
m_Session->ReadAddonsInfo(packetAddon);
+ // Initialize Warden system only if it is enabled by config
+ if (sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED))
+ m_Session->InitWarden(&k, os);
+
// Sleep this Network thread for
uint32 sleepTime = sWorld->getIntConfig(CONFIG_SESSION_ADD_DELAY);
ACE_OS::sleep (ACE_Time_Value (0, sleepTime));