Merge remote-tracking branch 'tc/3.3.5' into 4.3.4
Conflicts: sql/base/characters_database.sql sql/updates/world/2016_01_26_00_world.sql sql/updates/world/2016_01_31_00_world.sql sql/updates/world/2016_02_07_00_world.sql src/server/authserver/Server/AuthSession.cpp src/server/database/Database/Implementation/LoginDatabase.cpp src/server/database/Database/Implementation/LoginDatabase.h src/server/game/AI/ScriptedAI/ScriptedCreature.cpp src/server/game/AI/ScriptedAI/ScriptedCreature.h src/server/game/Achievements/AchievementMgr.cpp src/server/game/Chat/Chat.cpp src/server/game/DataStores/DBCStores.cpp src/server/game/DataStores/DBCStructure.h src/server/game/DataStores/DBCfmt.h src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Handlers/AuctionHouseHandler.cpp src/server/game/Handlers/MailHandler.cpp src/server/game/Handlers/MovementHandler.cpp src/server/game/Server/WorldSocket.cpp src/server/game/Server/WorldSocket.h src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/SpellEffects.cpp src/server/game/Spells/SpellMgr.cpp src/server/scripts/Spells/spell_druid.cpp src/server/scripts/Spells/spell_generic.cpp src/server/scripts/Spells/spell_hunter.cpp src/server/scripts/Spells/spell_rogue.cpp src/server/scripts/Spells/spell_shaman.cpp src/server/shared/Networking/AsyncAcceptor.h src/tools/map_extractor/CMakeLists.txt src/tools/map_extractor/System.cpp src/tools/map_extractor/adt.h src/tools/mmaps_generator/MapBuilder.cpp
This commit is contained in:
commit
8bc477a2de
161 files changed
+3548
-2022
No files matched your search
@@ -25,6 +25,17 @@
|
||||
#include "BattlenetAccountMgr.h"
|
||||
#include <memory>
|
||||
|
||||
class EncryptablePacket : public WorldPacket
|
||||
{
|
||||
public:
|
||||
EncryptablePacket(WorldPacket const& packet, bool encrypt) : WorldPacket(packet), _encrypt(encrypt) { }
|
||||
|
||||
bool NeedsEncryption() const { return _encrypt; }
|
||||
|
||||
private:
|
||||
bool _encrypt;
|
||||
};
|
||||
|
||||
using boost::asio::ip::tcp;
|
||||
|
||||
std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT");
|
||||
@@ -45,11 +56,8 @@ void WorldSocket::Start()
|
||||
stmt->setString(0, ip_address);
|
||||
stmt->setUInt32(1, inet_addr(ip_address.c_str()));
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(_queryLock);
|
||||
_queryCallback = io_service().wrap(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1));
|
||||
_queryFuture = LoginDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
_queryCallback = std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1);
|
||||
_queryFuture = LoginDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
|
||||
void WorldSocket::CheckIpCallback(PreparedQueryResult result)
|
||||
@@ -84,23 +92,59 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result)
|
||||
initializer.Write(header.header, header.getHeaderLength() - 2);
|
||||
initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());
|
||||
|
||||
std::unique_lock<std::mutex> dummy(_writeLock, std::defer_lock);
|
||||
QueuePacket(std::move(initializer), dummy);
|
||||
// - io_service.run thread, safe.
|
||||
QueuePacket(std::move(initializer));
|
||||
}
|
||||
|
||||
bool WorldSocket::Update()
|
||||
{
|
||||
EncryptablePacket* queued;
|
||||
MessageBuffer buffer;
|
||||
while (_bufferQueue.Dequeue(queued))
|
||||
{
|
||||
if (_worldSession && queued->size() > 0x400 && !queued->IsCompressed())
|
||||
queued->Compress(_worldSession->GetCompressionStream());
|
||||
|
||||
ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
|
||||
if (queued->NeedsEncryption())
|
||||
_authCrypt.EncryptSend(header.header, header.getHeaderLength());
|
||||
|
||||
if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
|
||||
{
|
||||
QueuePacket(std::move(buffer));
|
||||
buffer.Resize(4096);
|
||||
}
|
||||
|
||||
if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength())
|
||||
{
|
||||
buffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
buffer.Write(queued->contents(), queued->size());
|
||||
}
|
||||
else // single packet larger than 4096 bytes
|
||||
{
|
||||
MessageBuffer packetBuffer(queued->size() + header.getHeaderLength());
|
||||
packetBuffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
packetBuffer.Write(queued->contents(), queued->size());
|
||||
|
||||
QueuePacket(std::move(packetBuffer));
|
||||
}
|
||||
|
||||
delete queued;
|
||||
}
|
||||
|
||||
if (buffer.GetActiveSize() > 0)
|
||||
QueuePacket(std::move(buffer));
|
||||
|
||||
if (!BaseSocket::Update())
|
||||
return false;
|
||||
|
||||
if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(_queryLock);
|
||||
if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
||||
{
|
||||
auto callback = std::move(_queryCallback);
|
||||
_queryCallback = nullptr;
|
||||
callback(_queryFuture.get());
|
||||
}
|
||||
auto callback = _queryCallback;
|
||||
_queryCallback = nullptr;
|
||||
callback(_queryFuture.get());
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -418,32 +462,7 @@ void WorldSocket::SendPacket(WorldPacket& packet)
|
||||
if (sPacketLog->CanLogPacket())
|
||||
sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort());
|
||||
|
||||
if (_worldSession && packet.size() > 0x400 && !packet.IsCompressed())
|
||||
packet.Compress(_worldSession->GetCompressionStream());
|
||||
|
||||
ServerPktHeader header(packet.size() + 2, packet.GetOpcode());
|
||||
|
||||
std::unique_lock<std::mutex> guard(_writeLock);
|
||||
|
||||
_authCrypt.EncryptSend(header.header, header.getHeaderLength());
|
||||
|
||||
#ifndef TC_SOCKET_USE_IOCP
|
||||
if (_writeQueue.empty() && _writeBuffer.GetRemainingSpace() >= header.getHeaderLength() + packet.size())
|
||||
{
|
||||
_writeBuffer.Write(header.header, header.getHeaderLength());
|
||||
if (!packet.empty())
|
||||
_writeBuffer.Write(packet.contents(), packet.size());
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
MessageBuffer buffer(header.getHeaderLength() + packet.size());
|
||||
buffer.Write(header.header, header.getHeaderLength());
|
||||
if (!packet.empty())
|
||||
buffer.Write(packet.contents(), packet.size());
|
||||
|
||||
QueuePacket(std::move(buffer), guard);
|
||||
}
|
||||
_bufferQueue.Enqueue(new EncryptablePacket(packet, _authCrypt.IsInitialized()));
|
||||
}
|
||||
|
||||
void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
|
||||
@@ -497,11 +516,8 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
|
||||
stmt->setInt32(0, realmHandle.Index);
|
||||
stmt->setString(1, authSession->Account);
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(_queryLock);
|
||||
_queryCallback = io_service().wrap(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1));
|
||||
_queryFuture = LoginDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
_queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1);
|
||||
_queryFuture = LoginDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
|
||||
void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSession, PreparedQueryResult result)
|
||||
@@ -655,7 +671,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
|
||||
if (wardenActive)
|
||||
_worldSession->InitWarden(&account.Game.SessionKey, account.BattleNet.OS);
|
||||
|
||||
_queryCallback = io_service().wrap(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1));
|
||||
_queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1);
|
||||
_queryFuture = _worldSession->LoadPermissionsAsync();
|
||||
AsyncRead();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user