From 95ebe4f31cba6b4772cfd19f99da45039719807b Mon Sep 17 00:00:00 2001 From: Naios Date: Wed, 11 Mar 2015 10:06:24 +0100 Subject: Core/Log: Add type safe formatting * improves safety and log speed through: - variadic templates - perfect forwarding * fixes a newline in db logs * improve performance of Appender::write by using std::ostringstream && std::move --- src/server/game/CMakeLists.txt | 1 + src/server/game/Chat/Chat.cpp | 32 ------------------------------- src/server/game/Chat/Chat.h | 22 ++++++++++++++++++--- src/server/game/Globals/ObjectMgr.cpp | 2 ++ src/server/game/Server/WorldSocketMgr.cpp | 2 ++ 5 files changed, 24 insertions(+), 35 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 18c710c2a20..ab54efab1fd 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -110,6 +110,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/dep/SFMT + ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zlib ${CMAKE_SOURCE_DIR}/dep/zmqpp ${CMAKE_SOURCE_DIR}/src/server/collision diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index d4559b0acef..837ff0be60f 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -106,17 +106,6 @@ ChatCommand* ChatHandler::getCommandTable() return commandTableCache; } -std::string ChatHandler::PGetParseString(uint32 entry, ...) const -{ - const char *format = GetTrinityString(entry); - char str[1024]; - va_list ap; - va_start(ap, entry); - vsnprintf(str, 1024, format, ap); - va_end(ap); - return std::string(str); -} - char const* ChatHandler::GetTrinityString(uint32 entry) const { return m_session->GetTrinityString(entry); @@ -260,27 +249,6 @@ void ChatHandler::SendSysMessage(uint32 entry) SendSysMessage(GetTrinityString(entry)); } -void ChatHandler::PSendSysMessage(uint32 entry, ...) -{ - const char *format = GetTrinityString(entry); - va_list ap; - char str [2048]; - va_start(ap, entry); - vsnprintf(str, 2048, format, ap); - va_end(ap); - SendSysMessage(str); -} - -void ChatHandler::PSendSysMessage(const char *format, ...) -{ - va_list ap; - char str [2048]; - va_start(ap, format); - vsnprintf(str, 2048, format, ap); - va_end(ap); - SendSysMessage(str); -} - bool ChatHandler::ExecuteCommandInTable(ChatCommand* table, const char* text, std::string const& fullcmd) { char const* oldtext = text; diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 93b22739ccb..000d93683c5 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -20,6 +20,7 @@ #define TRINITYCORE_CHAT_H #include "SharedDefines.h" +#include "StringFormat.h" #include "WorldSession.h" #include "RBAC.h" #include "Packets/ChatPackets.h" @@ -61,9 +62,24 @@ class ChatHandler virtual void SendSysMessage(char const* str); void SendSysMessage(uint32 entry); - void PSendSysMessage(char const* format, ...) ATTR_PRINTF(2, 3); - void PSendSysMessage(uint32 entry, ...); - std::string PGetParseString(uint32 entry, ...) const; + + template + void PSendSysMessage(const char* fmt, Args const&... args) + { + SendSysMessage(Trinity::StringFormat(fmt, args...).c_str()); + } + + template + void PSendSysMessage(uint32 entry, Args const&... args) + { + SendSysMessage(PGetParseString(entry, args...).c_str()); + } + + template + std::string PGetParseString(uint32 entry, Args const&... args) const + { + return Trinity::StringFormat(GetTrinityString(entry), args...); + } bool ParseCommands(const char* text); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2523f316cec..de49be6e178 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3358,6 +3358,8 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play } } +int32 const ReputationMgr::Reputation_Cap; + void ObjectMgr::LoadQuests() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 11d77b082e8..0a2b3cb4edf 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -51,6 +51,8 @@ WorldSocketMgr::~WorldSocketMgr() delete _instanceAcceptor; } +int const boost::asio::socket_base::max_connections; + bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) { _tcpNoDelay = sConfigMgr->GetBoolDefault("Network.TcpNodelay", true); -- cgit v1.2.3 From 5a8db92e62452140ea87489f526f3b1b0ba192b9 Mon Sep 17 00:00:00 2001 From: Gigi1237 Date: Sun, 15 Mar 2015 16:50:43 +0100 Subject: Core/PacketIO: Updated and enabled _SPEED_CHANGE_ACK Added packet structure for MovmentAck --- src/server/game/Handlers/MovementHandler.cpp | 36 +++++++++------------- src/server/game/Server/Packets/MovementPackets.cpp | 13 ++++++++ src/server/game/Server/Packets/MovementPackets.h | 23 ++++++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 18 +++++------ src/server/game/Server/WorldSession.h | 4 ++- 5 files changed, 63 insertions(+), 31 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index c47fe33e3b2..d1f4c862b0c 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -392,22 +392,16 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov } } -void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) +void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet) { - /* extract packet */ - MovementInfo movementInfo; - static MovementStatusElements const speedElement = MSEExtraFloat; - Movement::ExtraMovementStatusElement extras(&speedElement); - GetPlayer()->ReadMovementInfo(recvData, &movementInfo, &extras); + OpcodeClient opcode = packet.GetOpcode(); // now can skip not our packet - if (_player->GetGUID() != movementInfo.guid) + if (_player->GetGUID() != packet.movementInfo.guid) { - recvData.rfinish(); // prevent warnings spam return; } - float newspeed = extras.Data.floatData; /*----------------*/ // client ACK send one packet for mounted/run case and need skip all except last from its @@ -427,21 +421,21 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) "PitchRate" }; - switch (recvData.GetOpcode()) + switch (opcode) { - /* + case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; break; case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; break; case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; break; case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; break; - case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break; - case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break; + //case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break; + //case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break; case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; break; - case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; break; - case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; break; - */ + //case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; break; + //case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; break; + default: - TC_LOG_ERROR("network", "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", recvData.GetOpcode()); + TC_LOG_ERROR("network", "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; } @@ -454,18 +448,18 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) return; } - if (!_player->GetTransport() && std::fabs(_player->GetSpeed(move_type) - newspeed) > 0.01f) + if (!_player->GetTransport() && std::fabs(_player->GetSpeed(move_type) - packet.Speed) > 0.01f) { - if (_player->GetSpeed(move_type) > newspeed) // must be greater - just correct + if (_player->GetSpeed(move_type) > packet.Speed) // must be greater - just correct { TC_LOG_ERROR("network", "%sSpeedChange player %s is NOT correct (must be %f instead %f), force set to correct value", - move_type_name[move_type], _player->GetName().c_str(), _player->GetSpeed(move_type), newspeed); + move_type_name[move_type], _player->GetName().c_str(), _player->GetSpeed(move_type), packet.Speed); _player->SetSpeed(move_type, _player->GetSpeedRate(move_type), true); } else // must be lesser - cheating { TC_LOG_DEBUG("misc", "Player %s from account id %u kicked for incorrect speed (must be %f instead %f)", - _player->GetName().c_str(), _player->GetSession()->GetAccountId(), _player->GetSpeed(move_type), newspeed); + _player->GetName().c_str(), _player->GetSession()->GetAccountId(), _player->GetSpeed(move_type), packet.Speed); _player->GetSession()->KickPlayer(); } } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index edac75346f8..d0a3e0038e9 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -595,3 +595,16 @@ void WorldPackets::Movement::MoveTeleportAck::Read() _worldPacket >> AckIndex; _worldPacket >> MoveTime; } + +void WorldPackets::Movement::MovementAck::Read() +{ + _worldPacket >> movementInfo; + _worldPacket >> AckIndex; +} + +void WorldPackets::Movement::MovementSpeedAck::Read() +{ + _worldPacket >> movementInfo; + _worldPacket >> AckIndex; + _worldPacket >> Speed; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 85156234477..0e5449c7947 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -285,6 +285,29 @@ namespace WorldPackets int32 AckIndex = 0; int32 MoveTime = 0; }; + + class MovementAck final : public ClientPacket + { + public: + MovementAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + MovementInfo movementInfo; + int32 AckIndex = 0; + }; + + class MovementSpeedAck final : public ClientPacket + { + public: + MovementSpeedAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + MovementInfo movementInfo; + int32 AckIndex = 0; + float Speed = 0.0f; + }; } ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index afc17d028cd..61c6c906dcf 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -544,17 +544,17 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleFeatherFallAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_UNROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); + DEFINE_HANDLER(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 71ce6546d3c..61d52cc8bff 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -287,6 +287,8 @@ namespace WorldPackets class ClientPlayerMovement; class WorldPortAck; class MoveTeleportAck; + class MovementAck; + class MovementSpeedAck; } namespace NPC @@ -838,7 +840,7 @@ class WorldSession void HandleMoveKnockBackAck(WorldPacket& recvPacket); void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet); - void HandleForceSpeedChangeAck(WorldPacket& recvData); + void HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet); void HandleSetCollisionHeightAck(WorldPacket& recvPacket); void HandlePingOpcode(WorldPacket& recvPacket); -- cgit v1.2.3 From 40809ebfece1637dcd42e1609f55203c3973c948 Mon Sep 17 00:00:00 2001 From: Luzifix Date: Mon, 16 Mar 2015 19:22:08 +0100 Subject: Core/PacketIO: update & enable CMSG_QUESTGIVER_HELLO --- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index afc17d028cd..c13110000f9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -664,7 +664,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_CANCEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_QUESTGIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode); DEFINE_HANDLER(CMSG_QUESTGIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverCompleteQuest, &WorldSession::HandleQuestgiverCompleteQuest); - DEFINE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); + DEFINE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); DEFINE_HANDLER(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index da7adf5d748..961ba613bd8 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -574,7 +574,7 @@ enum OpcodeClient : uint32 CMSG_QUESTGIVER_CANCEL = 0xBADD, CMSG_QUESTGIVER_CHOOSE_REWARD = 0x0CE1, CMSG_QUESTGIVER_COMPLETE_QUEST = 0x0A69, - CMSG_QUESTGIVER_HELLO = 0xBADD, + CMSG_QUESTGIVER_HELLO = 0x0B2A, CMSG_QUESTGIVER_QUERY_QUEST = 0x131A, CMSG_QUESTGIVER_QUEST_AUTOLAUNCH = 0xBADD, CMSG_QUESTGIVER_REQUEST_REWARD = 0xBADD, @@ -725,7 +725,7 @@ enum OpcodeClient : uint32 CMSG_TAXIENABLEALLNODES = 0xBADD, CMSG_TAXISHOWNODES = 0xBADD, CMSG_TAXI_NODE_STATUS_QUERY = 0x0EA1, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0B2A, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0xBADD, CMSG_TELEPORT_TO_UNIT = 0xBADD, CMSG_TEXT_EMOTE = 0x0B2B, CMSG_TIME_ADJUSTMENT_RESPONSE = 0xBADD, -- cgit v1.2.3 From 4ee22e3c5e8feeb0f6e9d388e03908eb0aa927c1 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Mon, 16 Mar 2015 20:37:50 +0100 Subject: Core/Packets: Enable opcode CMSG_BANKER_ACTIVATE / SMSG_SHOW_BANK --- src/server/game/Server/Protocol/Opcodes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c13110000f9..86c5ba482cf 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -186,7 +186,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); - DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); + DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode ); @@ -1754,7 +1754,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VIGNETTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_RATINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); -- cgit v1.2.3 From 034dbe267df49b98448e9000c7c534619612bdbc Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 1 Mar 2015 18:40:46 +0100 Subject: Core/Player: Optimize Player::HaveAtClient() performance Change m_clientGUIDs from std::set to std::unordered_set to reduce by 2.7x times the cpu usage in Player::HaveAtClient() (cherry picked from commit 49ececf03830ca1d3df45bec1cd7f657d309450b) --- src/server/game/Entities/Object/ObjectGuid.h | 2 ++ src/server/game/Entities/Player/Player.cpp | 12 ++++++------ src/server/game/Entities/Player/Player.h | 2 +- src/server/game/Grids/Notifiers/GridNotifiers.cpp | 2 +- src/server/game/Grids/Notifiers/GridNotifiers.h | 2 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index b4b08d7ace2..72fda2feb5e 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -24,6 +24,7 @@ #include #include +#include enum TypeID { @@ -266,6 +267,7 @@ typedef std::set GuidSet; typedef std::list GuidList; typedef std::deque GuidDeque; typedef std::vector GuidVector; +typedef std::unordered_set GuidUnorderedSet; // maximum buffer size for packed guid is 18 bytes #define PACKED_GUID_MIN_BUFFER_SIZE 18 diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 47b46f05752..b1b441e678c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22042,13 +22042,13 @@ bool Player::IsVisibleGloballyFor(Player const* u) const } template -inline void UpdateVisibilityOf_helper(GuidSet& s64, T* target, std::set& /*v*/) +inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, T* target, std::set& /*v*/) { s64.insert(target->GetGUID()); } template<> -inline void UpdateVisibilityOf_helper(GuidSet& s64, GameObject* target, std::set& /*v*/) +inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, GameObject* target, std::set& /*v*/) { // @HACK: This is to prevent objects like deeprun tram from disappearing when player moves far from its spawn point while riding it // But exclude stoppable elevators from this hack - they would be teleporting from one end to another @@ -22059,14 +22059,14 @@ inline void UpdateVisibilityOf_helper(GuidSet& s64, GameObject* target, std::set } template<> -inline void UpdateVisibilityOf_helper(GuidSet& s64, Creature* target, std::set& v) +inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Creature* target, std::set& v) { s64.insert(target->GetGUID()); v.insert(target); } template<> -inline void UpdateVisibilityOf_helper(GuidSet& s64, Player* target, std::set& v) +inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Player* target, std::set& v) { s64.insert(target->GetGUID()); v.insert(target); @@ -22128,7 +22128,7 @@ void Player::UpdateTriggerVisibility() UpdateData udata(GetMapId()); WorldPacket packet; - for (GuidSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr) + for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr) { if (itr->IsCreature()) { @@ -23235,7 +23235,7 @@ void Player::UpdateForQuestWorldObjects() UpdateData udata(GetMapId()); WorldPacket packet; - for (GuidSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr) + for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr) { if (itr->IsGameObject()) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d0cf22ca24b..596693e5da4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2435,7 +2435,7 @@ class Player : public Unit, public GridObject WorldLocation GetStartPosition() const; // currently visible objects at player client - GuidSet m_clientGUIDs; + GuidUnorderedSet m_clientGUIDs; bool HaveAtClient(WorldObject const* u) const; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index 533f2845b17..d5562a9a3c7 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -65,7 +65,7 @@ void VisibleNotifier::SendToSelf() } } - for (GuidSet::const_iterator it = vis_guids.begin(); it != vis_guids.end(); ++it) + for (auto it = vis_guids.begin(); it != vis_guids.end(); ++it) { i_player.m_clientGUIDs.erase(*it); i_data.AddOutOfRangeGUID(*it); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index ae8c96aff94..0936f8ff753 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -45,7 +45,7 @@ namespace Trinity Player &i_player; UpdateData i_data; std::set i_visibleNow; - GuidSet vis_guids; + GuidUnorderedSet vis_guids; VisibleNotifier(Player &player) : i_player(player), i_data(player.GetMapId()), vis_guids(player.m_clientGUIDs) { } template void Visit(GridRefManager &m); diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 56126fb9250..df5fae683fe 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -619,7 +619,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques WorldPackets::Quest::QuestGiverStatusMultiple response; - for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) + for (auto itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { if (itr->IsAnyTypeCreature()) { -- cgit v1.2.3 From a20905598df733eb9b00a1e5cf3766d5eaee0d48 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Tue, 3 Mar 2015 23:09:42 +0100 Subject: Core/PacketLog: Avoid unneeded calls with disabled packet logs Avoid calling GetOpcodeNameForLogging() when packet logs are disabled. (cherry picked from commit 5e7d4a44e0d6b92da8ba68a00be00c530a72c873) Conflicts: src/server/game/Server/WorldSocket.cpp --- src/server/game/Server/WorldSocket.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index ba0d2c7d48e..af99ba5df4b 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -212,14 +212,12 @@ bool WorldSocket::ReadDataHandler() OpcodeClient opcode = static_cast(cmd); - std::string opcodeName = GetOpcodeNameForLogging(opcode); - WorldPacket packet(opcode, std::move(_packetBuffer), GetConnectionType()); if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort(), GetConnectionType()); - TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), opcodeName.c_str()); + TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), GetOpcodeNameForLogging(opcode).c_str()); switch (opcode) { @@ -253,17 +251,17 @@ bool WorldSocket::ReadDataHandler() break; } case CMSG_KEEP_ALIVE: - TC_LOG_DEBUG("network", "%s", opcodeName.c_str()); + TC_LOG_DEBUG("network", "%s", GetOpcodeNameForLogging(opcode).c_str()); sScriptMgr->OnPacketReceive(_worldSession, packet); break; case CMSG_LOG_DISCONNECT: packet.rfinish(); // contains uint32 disconnectReason; - TC_LOG_DEBUG("network", "%s", opcodeName.c_str()); + TC_LOG_DEBUG("network", "%s", GetOpcodeNameForLogging(opcode).c_str()); sScriptMgr->OnPacketReceive(_worldSession, packet); return true; case CMSG_ENABLE_NAGLE: { - TC_LOG_DEBUG("network", "%s", opcodeName.c_str()); + TC_LOG_DEBUG("network", "%s", GetOpcodeNameForLogging(opcode).c_str()); sScriptMgr->OnPacketReceive(_worldSession, packet); if (_worldSession) _worldSession->HandleEnableNagleAlgorithm(); -- cgit v1.2.3 From 4df9f462146fb6411750cec0e6ead2a2e9019d09 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 05:18:51 +0100 Subject: Core: Move some more INFO-level logentries to DEBUG (cherry picked from commit db302c28c24a5bc9f77463555453bb09ca4b094a) Conflicts: src/server/game/Spells/Spell.cpp src/server/game/Spells/SpellEffects.cpp --- src/server/game/Spells/Spell.cpp | 22 +++++++++++----------- src/server/game/Spells/SpellEffects.cpp | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 919f11a5db4..ffc39e40713 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -523,23 +523,23 @@ void SpellCastTargets::Update(Unit* caster) void SpellCastTargets::OutDebug() const { if (!m_targetMask) - TC_LOG_INFO("spells", "No targets"); + TC_LOG_DEBUG("spells", "No targets"); - TC_LOG_INFO("spells", "target mask: %u", m_targetMask); + TC_LOG_DEBUG("spells", "target mask: %u", m_targetMask); if (m_targetMask & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_GAMEOBJECT_MASK)) - TC_LOG_INFO("spells", "Object target: %s", m_objectTargetGUID.ToString().c_str()); + TC_LOG_DEBUG("spells", "Object target: %s", m_objectTargetGUID.ToString().c_str()); if (m_targetMask & TARGET_FLAG_ITEM) - TC_LOG_INFO("spells", "Item target: %s", m_itemTargetGUID.ToString().c_str()); + TC_LOG_DEBUG("spells", "Item target: %s", m_itemTargetGUID.ToString().c_str()); if (m_targetMask & TARGET_FLAG_TRADE_ITEM) - TC_LOG_INFO("spells", "Trade item target: %s", m_itemTargetGUID.ToString().c_str()); + TC_LOG_DEBUG("spells", "Trade item target: %s", m_itemTargetGUID.ToString().c_str()); if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - TC_LOG_INFO("spells", "Source location: transport guid:%s trans offset: %s position: %s", m_src._transportGUID.ToString().c_str(), m_src._transportOffset.ToString().c_str(), m_src._position.ToString().c_str()); + TC_LOG_DEBUG("spells", "Source location: transport guid:%s trans offset: %s position: %s", m_src._transportGUID.ToString().c_str(), m_src._transportOffset.ToString().c_str(), m_src._position.ToString().c_str()); if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - TC_LOG_INFO("spells", "Destination location: transport guid:%s trans offset: %s position: %s", m_dst._transportGUID.ToString().c_str(), m_dst._transportOffset.ToString().c_str(), m_dst._position.ToString().c_str()); + TC_LOG_DEBUG("spells", "Destination location: transport guid:%s trans offset: %s position: %s", m_dst._transportGUID.ToString().c_str(), m_dst._transportOffset.ToString().c_str(), m_dst._position.ToString().c_str()); if (m_targetMask & TARGET_FLAG_STRING) - TC_LOG_INFO("spells", "String: %s", m_strTarget.c_str()); - TC_LOG_INFO("spells", "speed: %f", m_speed); - TC_LOG_INFO("spells", "pitch: %f", m_pitch); + TC_LOG_DEBUG("spells", "String: %s", m_strTarget.c_str()); + TC_LOG_DEBUG("spells", "speed: %f", m_speed); + TC_LOG_DEBUG("spells", "pitch: %f", m_pitch); } SpellValue::SpellValue(Difficulty diff, SpellInfo const* proto) @@ -6408,7 +6408,7 @@ void Spell::Delayed() // only called in DealDamage() else m_timer += delaytime; - TC_LOG_INFO("spells", "Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime); + TC_LOG_DEBUG("spells", "Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime); WorldPacket data(SMSG_SPELL_DELAYED, 8+4); data << m_caster->GetPackGUID(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 06cf95c77d2..a5afe74728f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3929,7 +3929,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) return; TC_LOG_DEBUG("spells", "Spell Effect: Stuck"); - TC_LOG_INFO("spells", "Player %s (%s) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUID().ToString().c_str(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + TC_LOG_DEBUG("spells", "Player %s (%s) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUID().ToString().c_str(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); if (player->IsInFlight()) return; -- cgit v1.2.3 From c23583582737939ca70714a0cd057cda3d8477e2 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 05:30:33 +0100 Subject: Core: Change some map-specific INFO-messages over to to DEBUG or ERROR (cherry picked from commit ec6bec6bc4e5b799c128992f68d429f068654b6e) Conflicts: src/server/game/Maps/Map.cpp --- src/server/game/Maps/Map.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 71d05031483..b4669846af6 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -136,9 +136,9 @@ void Map::LoadMMap(int gx, int gy) bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy); if (mmapLoadResult) - TC_LOG_INFO("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_DEBUG("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); else - TC_LOG_INFO("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_ERROR("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); } void Map::LoadVMap(int gx, int gy) @@ -150,10 +150,10 @@ void Map::LoadVMap(int gx, int gy) switch (vmapLoadResult) { case VMAP::VMAP_LOAD_RESULT_OK: - TC_LOG_INFO("maps", "VMAP loaded name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_DEBUG("maps", "VMAP loaded name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); break; case VMAP::VMAP_LOAD_RESULT_ERROR: - TC_LOG_INFO("maps", "Could not load VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_ERROR("maps", "Could not load VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); break; case VMAP::VMAP_LOAD_RESULT_IGNORED: TC_LOG_DEBUG("maps", "Ignored VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); @@ -183,7 +183,7 @@ void Map::LoadMap(int gx, int gy, bool reload) //map already load, delete it before reloading (Is it necessary? Do we really need the ability the reload maps during runtime?) if (GridMaps[gx][gy]) { - TC_LOG_INFO("maps", "Unloading previously loaded map %u before reloading.", GetId()); + TC_LOG_DEBUG("maps", "Unloading previously loaded map %u before reloading.", GetId()); sScriptMgr->OnUnloadGridMap(this, GridMaps[gx][gy], gx, gy); delete (GridMaps[gx][gy]); @@ -195,7 +195,7 @@ void Map::LoadMap(int gx, int gy, bool reload) int len = sWorld->GetDataPath().length() + strlen("maps/%03u%02u%02u.map") + 1; tmp = new char[len]; snprintf(tmp, len, (char *)(sWorld->GetDataPath() + "maps/%03u%02u%02u.map").c_str(), GetId(), gx, gy); - TC_LOG_INFO("maps", "Loading map %s", tmp); + TC_LOG_DEBUG("maps", "Loading map %s", tmp); // loading data GridMaps[gx][gy] = new GridMap(); if (!GridMaps[gx][gy]->loadData(tmp)) @@ -2507,7 +2507,7 @@ void Map::UpdateObjectsVisibilityFor(Player* player, Cell cell, CellCoord cellpa void Map::SendInitSelf(Player* player) { - TC_LOG_INFO("maps", "Creating player data for himself %s", player->GetGUID().ToString().c_str()); + TC_LOG_DEBUG("maps", "Creating player data for himself %s", player->GetGUID().ToString().c_str()); UpdateData data(player->GetMapId()); @@ -2953,7 +2953,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(GetInstanceId()); if (!mapSave) { - TC_LOG_INFO("maps", "InstanceMap::Add: creating instance save for map %d spawnmode %d with instance id %d", GetId(), GetSpawnMode(), GetInstanceId()); + TC_LOG_DEBUG("maps", "InstanceMap::Add: creating instance save for map %d spawnmode %d with instance id %d", GetId(), GetSpawnMode(), GetInstanceId()); mapSave = sInstanceSaveMgr->AddInstanceSave(GetId(), GetInstanceId(), Difficulty(GetSpawnMode()), 0, true); } @@ -3030,7 +3030,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) // first player enters (no players yet) SetResetSchedule(false); - TC_LOG_INFO("maps", "MAP: Player '%s' entered instance '%u' of map '%s'", player->GetName().c_str(), GetInstanceId(), GetMapName()); + TC_LOG_DEBUG("maps", "MAP: Player '%s' entered instance '%u' of map '%s'", player->GetName().c_str(), GetInstanceId(), GetMapName()); // initialize unload state m_unloadTimer = 0; m_resetAfterUnload = false; @@ -3056,7 +3056,7 @@ void InstanceMap::Update(const uint32 t_diff) void InstanceMap::RemovePlayerFromMap(Player* player, bool remove) { - TC_LOG_INFO("maps", "MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName()); + TC_LOG_DEBUG("maps", "MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName()); //if last player set unload timer if (!m_unloadTimer && m_mapRefManager.getSize() == 1) m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld->getIntConfig(CONFIG_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY); @@ -3308,7 +3308,7 @@ bool BattlegroundMap::AddPlayerToMap(Player* player) void BattlegroundMap::RemovePlayerFromMap(Player* player, bool remove) { - TC_LOG_INFO("maps", "MAP: Removing player '%s' from bg '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName()); + TC_LOG_DEBUG("maps", "MAP: Removing player '%s' from bg '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName()); Map::RemovePlayerFromMap(player, remove); } -- cgit v1.2.3 From 59b6c4dbbb8a9275aad8f00fb0810738b61c642d Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 05:40:20 +0100 Subject: Core: Move LOG_INFO -> LOG_DEBUG level for achievements (cherry picked from commit 8562be602bda60f5767b9e263287edb660177972) Conflicts: src/server/game/Achievements/AchievementMgr.cpp --- src/server/game/Achievements/AchievementMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 4932a83d665..40401b2ba31 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1738,7 +1738,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achiev if (!GetOwner()->GetSession()->PlayerLoading()) SendAchievementEarned(achievement); - TC_LOG_INFO("achievement", "AchievementMgr::CompletedAchievement(%u). %s %s", + TC_LOG_DEBUG("achievement", "AchievementMgr::CompletedAchievement(%u). %s %s", achievement->ID, GetOwner()->GetGUID().ToString().c_str(), GetOwner()->GetName().c_str()); CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; -- cgit v1.2.3 From aec63532976d3de68802ab89723d84adcda76aee Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 05:51:07 +0100 Subject: Core: More INFO -> DEBUG changes (WorldSession/WorldSocket) (cherry picked from commit 132d4ede37f849ef3803dda85ae3c7087a51cc83) Conflicts: src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSocket.cpp --- src/server/game/Server/WorldSession.cpp | 16 ++++++++-------- src/server/game/Server/WorldSocket.cpp | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 15a06a29cb7..6c889b51631 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -272,8 +272,8 @@ void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/ { uint64 minTime = uint64(cur_time - lastTime); uint64 fullTime = uint64(lastTime - firstTime); - TC_LOG_INFO("misc", "Send all time packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f time: %u", sendPacketCount, sendPacketBytes, float(sendPacketCount)/fullTime, float(sendPacketBytes)/fullTime, uint32(fullTime)); - TC_LOG_INFO("misc", "Send last min packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f", sendLastPacketCount, sendLastPacketBytes, float(sendLastPacketCount)/minTime, float(sendLastPacketBytes)/minTime); + TC_LOG_DEBUG("misc", "Send all time packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f time: %u", sendPacketCount, sendPacketBytes, float(sendPacketCount)/fullTime, float(sendPacketBytes)/fullTime, uint32(fullTime)); + TC_LOG_DEBUG("misc", "Send last min packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f", sendLastPacketCount, sendLastPacketBytes, float(sendLastPacketCount)/minTime, float(sendLastPacketBytes)/minTime); lastTime = cur_time; sendLastPacketCount = 1; @@ -865,7 +865,7 @@ void WorldSession::ReadAddonsInfo(ByteBuffer& data) addonInfo >> enabled >> crc >> unk1; - TC_LOG_INFO("misc", "ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1); + TC_LOG_DEBUG("misc", "ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1); AddonInfo addon(addonName, enabled, crc, 2, true); @@ -873,15 +873,15 @@ void WorldSession::ReadAddonsInfo(ByteBuffer& data) if (savedAddon) { if (addon.CRC != savedAddon->CRC) - TC_LOG_INFO("misc", "ADDON: %s was known, but didn't match known CRC (0x%x)!", addon.Name.c_str(), savedAddon->CRC); + TC_LOG_ERROR("misc", "ADDON: %s was known, but didn't match known CRC (0x%x)!", addon.Name.c_str(), savedAddon->CRC); else - TC_LOG_INFO("misc", "ADDON: %s was known, CRC is correct (0x%x)", addon.Name.c_str(), savedAddon->CRC); + TC_LOG_DEBUG("misc", "ADDON: %s was known, CRC is correct (0x%x)", addon.Name.c_str(), savedAddon->CRC); } else { AddonMgr::SaveAddon(addon); - TC_LOG_INFO("misc", "ADDON: %s (0x%x) was not known, saving...", addon.Name.c_str(), addon.CRC); + TC_LOG_DEBUG("misc", "ADDON: %s (0x%x) was not known, saving...", addon.Name.c_str(), addon.CRC); } /// @todo Find out when to not use CRC/pubkey, and other possible states. @@ -1174,7 +1174,7 @@ bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p, time_t time) co return true; case POLICY_KICK: { - TC_LOG_INFO("network", "AntiDOS: Player kicked!"); + TC_LOG_WARN("network", "AntiDOS: Player kicked!"); Session->KickPlayer(); return false; } @@ -1190,7 +1190,7 @@ bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p, time_t time) co case BAN_IP: nameOrIp = Session->GetRemoteAddress(); break; } sWorld->BanAccount(bm, nameOrIp, duration, "DOS (Packet Flooding/Spoofing", "Server: AutoDOS"); - TC_LOG_INFO("network", "AntiDOS: Player automatically banned for %u seconds.", duration); + TC_LOG_WARN("network", "AntiDOS: Player automatically banned for %u seconds.", duration); Session->KickPlayer(); return false; } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index af99ba5df4b..01035154214 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -625,7 +625,7 @@ void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession if (allowedAccountType > SEC_PLAYER && AccountTypes(security) < allowedAccountType) { SendAuthResponseError(AUTH_UNAVAILABLE); - TC_LOG_INFO("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); + TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); sScriptMgr->OnFailedAccountLogin(id); DelayedCloseSocket(); return; -- cgit v1.2.3 From 2bc44a2fb1abfd16d662526d99e80ad75f23a138 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 05:54:50 +0100 Subject: Core: More INFO -> DEBUG/WARN/ERROR mangling (cherry picked from commit 15e56ed0b3a43afd43760a26844567083427c544) --- .../game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 9c17a2277c0..0222087c168 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -382,9 +382,9 @@ void FlightPathMovementGenerator::PreloadEndGrid() // Load the grid if (endMap) { - TC_LOG_INFO("misc", "Preloading rid (%f, %f) for map %u at node index %u/%u", _endGridX, _endGridY, _endMapId, _preloadTargetNode, (uint32)(i_path->size()-1)); + TC_LOG_DEBUG("misc", "Preloading rid (%f, %f) for map %u at node index %u/%u", _endGridX, _endGridY, _endMapId, _preloadTargetNode, (uint32)(i_path->size()-1)); endMap->LoadGrid(_endGridX, _endGridY); } else - TC_LOG_INFO("misc", "Unable to determine map to preload flightmaster grid"); + TC_LOG_DEBUG("misc", "Unable to determine map to preload flightmaster grid"); } -- cgit v1.2.3 From b3b7b530035c85245d6b33552787ce3636cdccac Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:06:03 +0100 Subject: Core: INFO->DEBUG cleanups in Player.cpp (cherry picked from commit 6e509cf7c11d886e84a66e97c441917c17c48fbf) Conflicts: src/server/game/Entities/Player/Player.cpp --- src/server/game/Entities/Player/Player.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b1b441e678c..55f13138868 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6129,7 +6129,7 @@ void Player::SendActionButtons(uint32 state) const packet.Reason = state; SendDirectMessage(packet.Write()); - TC_LOG_INFO("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup()); + TC_LOG_DEBUG("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup()); } bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) @@ -6377,7 +6377,7 @@ void Player::CheckAreaExploreAndOutdoor() GiveXP(XP, NULL); SendExplorationExperience(area, XP); } - TC_LOG_INFO("entities.player", "Player %s discovered a new area: %u", GetGUID().ToString().c_str(), area); + TC_LOG_DEBUG("entities.player", "Player %s discovered a new area: %u", GetGUID().ToString().c_str(), area); } } } @@ -7603,7 +7603,7 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply) if (item->IsBroken()) return; - TC_LOG_INFO("entities.player.items", "applying mods for item %s", item->GetGUID().ToString().c_str()); + TC_LOG_DEBUG("entities.player.items", "applying mods for item %s", item->GetGUID().ToString().c_str()); uint8 attacktype = Player::GetAttackBySlot(slot); @@ -9452,7 +9452,7 @@ uint32 Player::GetXPRestBonus(uint32 xp) SetRestBonus(GetRestBonus() - rested_bonus); - TC_LOG_INFO("entities.player", "Player gain %u xp (+ %u Rested Bonus). Rested points=%f", xp+rested_bonus, rested_bonus, GetRestBonus()); + TC_LOG_DEBUG("entities.player", "Player gain %u xp (+ %u Rested Bonus). Rested points=%f", xp+rested_bonus, rested_bonus, GetRestBonus()); return rested_bonus; } @@ -17424,7 +17424,7 @@ void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effe aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data()); aura->ApplyForTargets(); - TC_LOG_INFO("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask); + TC_LOG_DEBUG("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask); } } while (auraResult->NextRow()); @@ -24964,7 +24964,7 @@ bool Player::LearnTalent(uint32 talentId) LearnSpell(spellid, false); - TC_LOG_INFO("misc", "TalentID: %u Spell: %u Group: %u\n", talentId, spellid, GetActiveTalentGroup()); + TC_LOG_DEBUG("misc", "TalentID: %u Spell: %u Group: %u\n", talentId, spellid, GetActiveTalentGroup()); return true; } -- cgit v1.2.3 From cbe97cc37d36c28bd7937fcafd2cf8e6bb47adc4 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:11:12 +0100 Subject: Core: More INFO -> DEBUG (Unit.cpp this time) (cherry picked from commit 64584e9e7a9a8f3d754e41d354764435fbf68947) Conflicts: src/server/game/Entities/Unit/Unit.cpp --- src/server/game/Entities/Unit/Unit.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b26211a4b5d..e93c176969f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2115,9 +2115,9 @@ void Unit::SendMeleeAttackStop(Unit* victim) SendMessageToSet(WorldPackets::Combat::SAttackStop(this, victim).Write(), true); if (victim) - TC_LOG_INFO("entities.unit", "%s stopped attacking %s", GetGUID().ToString().c_str(), victim->GetGUID().ToString().c_str()); + TC_LOG_DEBUG("entities.unit", "%s stopped attacking %s", GetGUID().ToString().c_str(), victim->GetGUID().ToString().c_str()); else - TC_LOG_INFO("entities.unit", "%s stopped attacking", GetGUID().ToString().c_str()); + TC_LOG_DEBUG("entities.unit", "%s stopped attacking", GetGUID().ToString().c_str()); } bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType /*attackType*/) @@ -15717,30 +15717,30 @@ void Unit::StopAttackFaction(uint32 faction_id) void Unit::OutDebugInfo() const { TC_LOG_ERROR("entities.unit", "Unit::OutDebugInfo"); - TC_LOG_INFO("entities.unit", "%s name %s", GetGUID().ToString().c_str(), GetName().c_str()); - TC_LOG_INFO("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); - TC_LOG_INFO("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask); + TC_LOG_DEBUG("entities.unit", "%s name %s", GetGUID().ToString().c_str(), GetName().c_str()); + TC_LOG_DEBUG("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); + TC_LOG_DEBUG("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask); if (IsInWorld()) - TC_LOG_INFO("entities.unit", "Mapid %u", GetMapId()); + TC_LOG_DEBUG("entities.unit", "Mapid %u", GetMapId()); std::ostringstream o; o << "Summon Slot: "; for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i) o << m_SummonSlot[i].ToString() << ", "; - TC_LOG_INFO("entities.unit", "%s", o.str().c_str()); + TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str()); o.str(""); o << "Controlled List: "; for (ControlList::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) o << (*itr)->GetGUID().ToString() << ", "; - TC_LOG_INFO("entities.unit", "%s", o.str().c_str()); + TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str()); o.str(""); o << "Aura List: "; for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr) o << itr->first << ", "; - TC_LOG_INFO("entities.unit", "%s", o.str().c_str()); + TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str()); o.str(""); if (IsVehicle()) @@ -15749,11 +15749,11 @@ void Unit::OutDebugInfo() const for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr) if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid)) o << passenger->GetGUID().ToString() << ", "; - TC_LOG_INFO("entities.unit", "%s", o.str().c_str()); + TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str()); } if (GetVehicle()) - TC_LOG_INFO("entities.unit", "On vehicle %u.", GetVehicleBase()->GetEntry()); + TC_LOG_DEBUG("entities.unit", "On vehicle %u.", GetVehicleBase()->GetEntry()); } uint32 Unit::GetRemainingPeriodicAmount(ObjectGuid caster, uint32 spellId, AuraType auraType, uint8 effectIndex) const -- cgit v1.2.3 From fb9b203be94da87e63ef86f674f7edd8acfc0b67 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:12:01 +0100 Subject: Core: Pet.cpp - INFO -> DEBUG level notifications... (cherry picked from commit a31bc08e441154efd7b76272dfae878794869650) Conflicts: src/server/game/Entities/Pet/Pet.cpp --- src/server/game/Entities/Pet/Pet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index a59866c402f..f0c4250ff1e 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1251,7 +1251,7 @@ void Pet::_LoadAuras(uint32 timediff) aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data()); aura->ApplyForTargets(); - TC_LOG_INFO("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask); + TC_LOG_DEBUG("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask); } } while (auraResult->NextRow()); -- cgit v1.2.3 From aec29478d3475cb2bc3cc044126564f98432b924 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:16:46 +0100 Subject: Core: And yet more INFO->DEBUG logging (cherry picked from commit 6f961ba138530cd4bece755cc8d971e7eff38688) Conflicts: src/server/game/Entities/Object/Object.cpp --- src/server/game/Entities/Object/Object.cpp | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index cb504f6cb19..b665d2934d1 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1521,37 +1521,37 @@ ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& st void MovementInfo::OutDebug() { - TC_LOG_INFO("misc", "MOVEMENT INFO"); - TC_LOG_INFO("misc", "%s", guid.ToString().c_str()); - TC_LOG_INFO("misc", "flags %s (%u)", Movement::MovementFlags_ToString(flags).c_str(), flags); - TC_LOG_INFO("misc", "flags2 %s (%u)", Movement::MovementFlagsExtra_ToString(flags2).c_str(), flags2); - TC_LOG_INFO("misc", "time %u current time %u", time, getMSTime()); - TC_LOG_INFO("misc", "position: `%s`", pos.ToString().c_str()); + TC_LOG_DEBUG("misc", "MOVEMENT INFO"); + TC_LOG_DEBUG("misc", "%s", guid.ToString().c_str()); + TC_LOG_DEBUG("misc", "flags %s (%u)", Movement::MovementFlags_ToString(flags).c_str(), flags); + TC_LOG_DEBUG("misc", "flags2 %s (%u)", Movement::MovementFlagsExtra_ToString(flags2).c_str(), flags2); + TC_LOG_DEBUG("misc", "time %u current time %u", time, getMSTime()); + TC_LOG_DEBUG("misc", "position: `%s`", pos.ToString().c_str()); if (!transport.guid.IsEmpty()) { - TC_LOG_INFO("misc", "TRANSPORT:"); - TC_LOG_INFO("misc", "%s", transport.guid.ToString().c_str()); - TC_LOG_INFO("misc", "position: `%s`", transport.pos.ToString().c_str()); - TC_LOG_INFO("misc", "seat: %i", transport.seat); - TC_LOG_INFO("misc", "time: %u", transport.time); + TC_LOG_DEBUG("misc", "TRANSPORT:"); + TC_LOG_DEBUG("misc", "%s", transport.guid.ToString().c_str()); + TC_LOG_DEBUG("misc", "position: `%s`", transport.pos.ToString().c_str()); + TC_LOG_DEBUG("misc", "seat: %i", transport.seat); + TC_LOG_DEBUG("misc", "time: %u", transport.time); if (flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) - TC_LOG_INFO("misc", "prevTime: %u", transport.prevTime); + TC_LOG_DEBUG("misc", "prevTime: %u", transport.prevTime); if (transport.vehicleId) - TC_LOG_INFO("misc", "vehicleId: %u", transport.vehicleId); + TC_LOG_DEBUG("misc", "vehicleId: %u", transport.vehicleId); } if ((flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)) - TC_LOG_INFO("misc", "pitch: %f", pitch); + TC_LOG_DEBUG("misc", "pitch: %f", pitch); if (flags & MOVEMENTFLAG_FALLING || jump.fallTime) { - TC_LOG_INFO("misc", "fallTime: %u j_zspeed: %f", jump.fallTime, jump.zspeed); + TC_LOG_DEBUG("misc", "fallTime: %u j_zspeed: %f", jump.fallTime, jump.zspeed); if (flags & MOVEMENTFLAG_FALLING) - TC_LOG_INFO("misc", "j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", jump.sinAngle, jump.cosAngle, jump.xyspeed); + TC_LOG_DEBUG("misc", "j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", jump.sinAngle, jump.cosAngle, jump.xyspeed); } if (flags & MOVEMENTFLAG_SPLINE_ELEVATION) - TC_LOG_INFO("misc", "splineElevation: %f", splineElevation); + TC_LOG_DEBUG("misc", "splineElevation: %f", splineElevation); } WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), LastUsedScriptID(0), -- cgit v1.2.3 From 49f4ffc2c8507253926a7d0ae756a395b47ce460 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:33:57 +0100 Subject: Core: More INFO -> DEBUG changes (cherry picked from commit 781edbe46a9d055b8a9bfdd446873cdf806a129a) --- src/server/game/Battlegrounds/ArenaTeam.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 77aa29536e4..e2a572b6dc7 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -172,7 +172,7 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) player->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 1); } - TC_LOG_INFO("bg.arena", "Player: %s [%s] joined arena team type: %u [Id: %u, Name: %s].", playerName.c_str(), playerGuid.ToString().c_str(), GetType(), GetId(), GetName().c_str()); + TC_LOG_DEBUG("bg.arena", "Player: %s [%s] joined arena team type: %u [Id: %u, Name: %s].", playerName.c_str(), playerGuid.ToString().c_str(), GetType(), GetId(), GetName().c_str()); return true; } -- cgit v1.2.3 From b0ee48370db7e1c234d13b0d010331b0e94f88d6 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 8 Mar 2015 06:34:19 +0100 Subject: Core: INFO->DEBUG level changes - forgot one in Map.cpp (cherry picked from commit ad7b33a47f5b987fb41921c8ae57022bb93fce3a) --- src/server/game/Maps/Map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b4669846af6..20b80d6ec8d 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2884,7 +2884,7 @@ bool InstanceMap::CanEnter(Player* player) uint32 maxPlayers = GetMaxPlayers(); if (GetPlayersCountExceptGMs() >= maxPlayers) { - TC_LOG_INFO("maps", "MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName().c_str()); + TC_LOG_WARN("maps", "MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName().c_str()); player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS); return false; } -- cgit v1.2.3 From 38c23495b38b786c648ec346b707d049e7a91071 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Mon, 9 Mar 2015 21:30:36 +0100 Subject: Core/Dungeon Finder: Fix Vote Kick breaking LFG queue Fix Vote Kick started with party in queue breaking the whole LFG queue. The status of Vote Kick is now storing in a bool variable in LfgGroupData, separated from LfgState of the group/members. If a Vote Kick started with party in queue, the members were not removed from queue correctly and would cause LFG matching system to match these "broken" players but not allowing to start a dungeon. Closes #10191 (cherry picked from commit 22403121fe9c762c82dc32913aeba46a7e76a004) --- src/server/game/DungeonFinding/LFG.cpp | 3 -- src/server/game/DungeonFinding/LFG.h | 4 +-- src/server/game/DungeonFinding/LFGGroupData.cpp | 12 +++++++- src/server/game/DungeonFinding/LFGGroupData.h | 4 +++ src/server/game/DungeonFinding/LFGMgr.cpp | 37 +++++++++++++++++-------- src/server/game/DungeonFinding/LFGMgr.h | 3 ++ src/server/game/DungeonFinding/LFGQueue.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 2 +- 8 files changed, 48 insertions(+), 19 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/DungeonFinding/LFG.cpp b/src/server/game/DungeonFinding/LFG.cpp index ab06eff7148..8ec638128d8 100644 --- a/src/server/game/DungeonFinding/LFG.cpp +++ b/src/server/game/DungeonFinding/LFG.cpp @@ -91,9 +91,6 @@ std::string GetStateString(LfgState state) case LFG_STATE_DUNGEON: entry = LANG_LFG_STATE_DUNGEON; break; - case LFG_STATE_BOOT: - entry = LANG_LFG_STATE_BOOT; - break; case LFG_STATE_FINISHED_DUNGEON: entry = LANG_LFG_STATE_FINISHED_DUNGEON; break; diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 0ee9e7886d5..680781cc9d1 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -68,8 +68,8 @@ enum LfgState LFG_STATE_ROLECHECK, // Rolecheck active LFG_STATE_QUEUED, // Queued LFG_STATE_PROPOSAL, // Proposal active - LFG_STATE_BOOT, // Vote kick active - LFG_STATE_DUNGEON, // In LFG Group, in a Dungeon + //LFG_STATE_BOOT, // Vote kick active + LFG_STATE_DUNGEON = 5, // In LFG Group, in a Dungeon LFG_STATE_FINISHED_DUNGEON, // In LFG Group, in a finished Dungeon LFG_STATE_RAIDBROWSER // Using Raid finder }; diff --git a/src/server/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp index 2ab1e0b1e7e..aa6916a39a4 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.cpp +++ b/src/server/game/DungeonFinding/LFGGroupData.cpp @@ -22,7 +22,7 @@ namespace lfg { LfgGroupData::LfgGroupData(): m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE), - m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS) + m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS), m_VoteKickActive(false) { } LfgGroupData::~LfgGroupData() @@ -126,4 +126,14 @@ uint8 LfgGroupData::GetKicksLeft() const return m_KicksLeft; } +void LfgGroupData::SetVoteKick(bool active) +{ + m_VoteKickActive = active; +} + +bool LfgGroupData::IsVoteKickActive() const +{ + return m_VoteKickActive; +} + } // namespace lfg diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h index 8d8f1dc0f3d..b573e7c309e 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.h +++ b/src/server/game/DungeonFinding/LFGGroupData.h @@ -66,6 +66,9 @@ class LfgGroupData // VoteKick uint8 GetKicksLeft() const; + void SetVoteKick(bool active); + bool IsVoteKickActive() const; + private: // General LfgState m_State; ///< State if group in LFG @@ -76,6 +79,7 @@ class LfgGroupData uint32 m_Dungeon; ///< Dungeon entry // Vote Kick uint8 m_KicksLeft; ///< Number of kicks left + bool m_VoteKickActive; }; } // namespace lfg diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 977dcbb216b..19ea140d998 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -309,9 +309,8 @@ void LFGMgr::Update(uint32 diff) ObjectGuid pguid = itVotes->first; if (pguid != boot.victim) SendLfgBootProposalUpdate(pguid, boot); - SetState(pguid, LFG_STATE_DUNGEON); } - SetState(itBoot->first, LFG_STATE_DUNGEON); + SetVoteKick(itBoot->first, false); BootsStore.erase(itBoot); } } @@ -642,7 +641,6 @@ void LFGMgr::LeaveLfg(ObjectGuid guid) break; case LFG_STATE_DUNGEON: case LFG_STATE_FINISHED_DUNGEON: - case LFG_STATE_BOOT: if (guid != gguid) // Player SetState(guid, LFG_STATE_NONE); break; @@ -1159,7 +1157,7 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate */ void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, std::string const& reason) { - SetState(gguid, LFG_STATE_BOOT); + SetVoteKick(gguid, true); LfgPlayerBoot& boot = BootsStore[gguid]; boot.inProgress = true; @@ -1173,7 +1171,6 @@ void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, st for (GuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr) { ObjectGuid guid = (*itr); - SetState(guid, LFG_STATE_BOOT); boot.votes[guid] = LFG_ANSWER_PENDING; } @@ -1230,13 +1227,10 @@ void LFGMgr::UpdateBoot(ObjectGuid guid, bool accept) { ObjectGuid pguid = itVotes->first; if (pguid != boot.victim) - { - SetState(pguid, LFG_STATE_DUNGEON); SendLfgBootProposalUpdate(pguid, boot); - } } - SetState(gguid, LFG_STATE_DUNGEON); + SetVoteKick(gguid, false); if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player { if (Group* group = sGroupMgr->GetGroupByGUID(gguid)) @@ -1498,12 +1492,12 @@ LfgState LFGMgr::GetState(ObjectGuid guid) if (guid.IsParty()) { state = GroupsStore[guid].GetState(); - TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %u", guid.ToString().c_str(), state); + TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str()); } else { state = PlayersStore[guid].GetState(); - TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %u", guid.ToString().c_str(), state); + TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str()); } return state; @@ -1526,6 +1520,16 @@ LfgState LFGMgr::GetOldState(ObjectGuid guid) return state; } +bool LFGMgr::IsVoteKickActive(ObjectGuid gguid) +{ + ASSERT(gguid.IsGroup()); + + bool active = GroupsStore[gguid].IsVoteKickActive(); + TC_LOG_TRACE("lfg.data.group.votekick.get", "Group: %s, Active: %d", gguid.ToString().c_str(), active); + + return active; +} + uint32 LFGMgr::GetDungeon(ObjectGuid guid, bool asId /*= true */) { uint32 dungeon = GroupsStore[guid].GetDungeon(asId); @@ -1686,6 +1690,17 @@ void LFGMgr::SetState(ObjectGuid guid, LfgState state) } } +void LFGMgr::SetVoteKick(ObjectGuid gguid, bool active) +{ + ASSERT(gguid.IsGroup()); + + LfgGroupData& data = GroupsStore[gguid]; + TC_LOG_TRACE("lfg.data.group.votekick.set", "Group: %s, New state: %d, Previous: %d", + gguid.ToString().c_str(), active, data.IsVoteKickActive()); + + data.SetVoteKick(active); +} + void LFGMgr::SetDungeon(ObjectGuid guid, uint32 dungeon) { TC_LOG_TRACE("lfg.data.group.dungeon.set", "Group: %s, Dungeon: %u", guid.ToString().c_str(), dungeon); diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 5e7c4e368a2..5fd0decadaf 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -328,6 +328,8 @@ class LFGMgr LfgDungeonSet const& GetSelectedDungeons(ObjectGuid guid); /// Get current lfg state LfgState GetState(ObjectGuid guid); + /// Get current vote kick state + bool IsVoteKickActive(ObjectGuid gguid); /// Get current dungeon uint32 GetDungeon(ObjectGuid guid, bool asId = true); /// Get the map id of the current dungeon @@ -435,6 +437,7 @@ class LFGMgr void SetSelectedDungeons(ObjectGuid guid, LfgDungeonSet const& dungeons); void DecreaseKicksLeft(ObjectGuid guid); void SetState(ObjectGuid guid, LfgState state); + void SetVoteKick(ObjectGuid gguid, bool active); void RemovePlayerData(ObjectGuid guid); void GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue); void _SaveToDB(ObjectGuid guid, uint32 db_guid); diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 7a4ec0f7e1e..97f87a4d814 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -377,7 +377,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Group with less that MAXGROUPSIZE members always compatible if (check.size() == 1 && numPlayers != MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) sigle group. Compatibles", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", strGuids.c_str()); LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front()); LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 55f13138868..f5c2a8e05f9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23885,7 +23885,7 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const return ERR_PARTY_LFG_BOOT_LIMIT; lfg::LfgState state = sLFGMgr->GetState(gguid); - if (state == lfg::LFG_STATE_BOOT) + if (sLFGMgr->IsVoteKickActive(gguid)) return ERR_PARTY_LFG_BOOT_IN_PROGRESS; if (grp->GetMembersCount() <= lfg::LFG_GROUP_KICK_VOTES_NEEDED) -- cgit v1.2.3 From 61e0ff320826d23fc28c39227c53575b9224b9b8 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 13 Mar 2015 21:48:42 +0100 Subject: Revert "*Do not allow players to use vehicles to go further than 1st boss in Ulduar." This reverts commit a009e53049da27966cb3c32e7b0a3094ea320aef. Remove hackfix for Ulduar vehicles, it should be handled in Ulduar script (cherry picked from commit f1ae2c7b73f3fbc665acac8fd70ce325f20e1194) --- src/server/game/Entities/Player/Player.cpp | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f5c2a8e05f9..6ea9bc523b9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23743,18 +23743,6 @@ void Player::UpdateAreaDependentAuras(uint32 newArea) if (itr->second->autocast && itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea)) if (!HasAura(itr->second->spellId)) CastSpell(this, itr->second->spellId, true); - - if (newArea == 4273 && GetVehicleCreatureBase() && GetPositionX() > 400) // Ulduar - { - switch (GetVehicleBase()->GetEntry()) - { - case 33062: - case 33109: - case 33060: - GetVehicleCreatureBase()->DespawnOrUnsummon(); - break; - } - } } uint32 Player::GetCorpseReclaimDelay(bool pvp) const -- cgit v1.2.3 From 3a1c778d54c99ff2a78bb0c2d4bf528cb506072b Mon Sep 17 00:00:00 2001 From: click Date: Sun, 15 Mar 2015 21:04:51 +0100 Subject: Core/AHBot: Remove a lingering warning that annoyed me for all too long (cherry picked from commit 7c8f7f6f8fc7fbc76a329c70980b09b9b3ada5ef) --- src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp index c1f195d0b94..993494c8b80 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp @@ -64,7 +64,7 @@ void AuctionBotBuyer::LoadConfig() } } -void AuctionBotBuyer::LoadBuyerValues(BuyerConfiguration& config) +void AuctionBotBuyer::LoadBuyerValues(BuyerConfiguration& /* config */) { } -- cgit v1.2.3 From cc3387d9848b60a4fb7203dde120028818d4efc0 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 15 Mar 2015 21:32:35 +0100 Subject: Merge pull request #14371 from Kittnz/movecirclepath_003 Core: Move FillCirclePath function to MotionMaster Closes #14371 (cherry picked from commit cf14e9051d15e33ca9fa87be3287d2a628faedef) --- src/server/game/Movement/MotionMaster.cpp | 37 +++++++++++++++++++ src/server/game/Movement/MotionMaster.h | 1 + .../HallsOfReflection/halls_of_reflection.cpp | 23 +----------- .../Northrend/Nexus/EyeOfEternity/boss_malygos.cpp | 43 +--------------------- .../Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp | 21 +---------- 5 files changed, 42 insertions(+), 83 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 7eb38f3e637..5177bf5c9de 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -381,6 +381,43 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED); } +void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount) +{ + float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f); + Position const& pos = { x, y, z, 0.0f }; + float angle = pos.GetAngle(_owner->GetPositionX(), _owner->GetPositionY()); + + Movement::MoveSplineInit init(_owner); + + for (uint8 i = 0; i < stepCount; angle += step, ++i) + { + G3D::Vector3 point; + point.x = x + radius * cosf(angle); + point.y = y + radius * sinf(angle); + + if (_owner->IsFlying()) + point.z = z; + else + point.z = _owner->GetMap()->GetHeight(_owner->GetPhaseMask(), point.x, point.y, z); + + init.Path().push_back(point); + } + + if (_owner->IsFlying()) + { + init.SetFly(); + init.SetCyclic(); + init.SetAnimation(Movement::ToFly); + } + else + { + init.SetWalk(true); + init.SetCyclic(); + } + + init.Launch(); +} + void MotionMaster::MoveFall(uint32 id /*=0*/) { // use larger distance for vmap height search than in most other cases diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 2821cd5a59b..0b547d96e7f 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -184,6 +184,7 @@ class MotionMaster //: private std::stack void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP) { MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); }; void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP); + void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount); void MoveFall(uint32 id = 0); void MoveSeekAssistance(float x, float y, float z); diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 5b3be128b32..20add695394 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -2640,13 +2640,7 @@ class npc_quel_delar_sword : public CreatureScript break; case EVENT_QUEL_DELAR_FLIGHT: { - Movement::MoveSplineInit init(me); - FillCirclePath(QuelDelarCenterPos, 18.0f, 718.046f, init.Path(), true); - init.SetFly(); - init.SetCyclic(); - init.SetAnimation(Movement::ToFly); - init.Launch(); - + me->GetMotionMaster()->MoveCirclePath(QuelDelarCenterPos.GetPositionX(), QuelDelarCenterPos.GetPositionY(), 718.046f, 18.0f, true, 16); _events.ScheduleEvent(EVENT_QUEL_DELAR_LAND, 15000); break; } @@ -2694,21 +2688,6 @@ class npc_quel_delar_sword : public CreatureScript } private: - void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise) - { - float step = clockwise ? -M_PI / 8.0f : M_PI / 8.0f; - float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY()); - - for (uint8 i = 0; i < 16; angle += step, ++i) - { - G3D::Vector3 point; - point.x = centerPos.GetPositionX() + radius * cosf(angle); - point.y = centerPos.GetPositionY() + radius * sinf(angle); - point.z = z; - path.push_back(point); - } - } - EventMap _events; InstanceScript* _instance; bool _intro; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index abbc7acb004..0c79b42f20c 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -520,11 +520,7 @@ public: _despawned = false; break; case ACTION_CYCLIC_MOVEMENT: - Movement::MoveSplineInit init(me); - FillCirclePath(MalygosPositions[3], 120.0f, 283.2763f, init.Path(), true); - init.SetFly(); - init.SetCyclic(); - init.Launch(); + me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 283.2763f, 120.0f, true, 16); break; } } @@ -1020,22 +1016,6 @@ public: } private: - // Used to generate perfect cyclic movements (Enter Circle). - void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise) - { - float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f; - float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY()); - - for (uint8 i = 0; i < 16; angle += step, ++i) - { - G3D::Vector3 point; - point.x = centerPos.GetPositionX() + radius * cosf(angle); - point.y = centerPos.GetPositionY() + radius * sinf(angle); - point.z = z; // Don't use any height getters unless all bugs are fixed. - path.push_back(point); - } - } - uint8 _phase; // Counter for phases used with a getter. uint8 _summonDeaths; // Keeps count of arcane trash. uint8 _preparingPulsesChecker; // In retail they use 2 preparing pulses with 7 sec CD, after they pass 2 seconds. @@ -1326,11 +1306,7 @@ public: { if (action < ACTION_DELAYED_DESPAWN) { - Movement::MoveSplineInit init(me); - FillCirclePath(MalygosPositions[3], 35.0f, 282.3402f, init.Path(), true); - init.SetFly(); - init.SetCyclic(); - init.Launch(); + me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 282.3402f, 35.0f, true, 16); } else { @@ -1339,21 +1315,6 @@ public: } private: - void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise) - { - float step = clockwise ? float(-M_PI) / 9.0f : float(M_PI) / 9.0f; - float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY()); - - for (uint8 i = 0; i < 18; angle += step, ++i) - { - G3D::Vector3 point; - point.x = centerPos.GetPositionX() + radius * cosf(angle); - point.y = centerPos.GetPositionY() + radius * sinf(angle); - point.z = z; // Don't use any height getters unless all bugs are fixed. - path.push_back(point); - } - } - InstanceScript* _instance; }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index c37cf28ab78..f31a79f46d5 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1126,30 +1126,11 @@ class npc_ominous_cloud : public CreatureScript DoCast(me, SPELL_OMINOUS_CLOUD_VISUAL); } - void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise) - { - float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f; - float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY()); - - for (uint8 i = 0; i < 16; angle += step, ++i) - { - G3D::Vector3 point; - point.x = centerPos.GetPositionX() + radius * cosf(angle); - point.y = centerPos.GetPositionY() + radius * sinf(angle); - point.z = me->GetMap()->GetHeight(me->GetPhaseMask(), point.x, point.y, z + 5.0f); - path.push_back(point); - } - } - void UpdateAI(uint32 /*diff*/) override { } void DoAction(int32 action) override { - Movement::MoveSplineInit init(me); - FillCirclePath(YoggSaronSpawnPos, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), me->GetPositionZ(), init.Path(), action != 0); - init.SetWalk(true); - init.SetCyclic(); - init.Launch(); + me->GetMotionMaster()->MoveCirclePath(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY(), me->GetPositionZ() + 5.0f, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), true, 16); } }; -- cgit v1.2.3 From ec640e38408c703dfcaa488ece14e299d8fe9117 Mon Sep 17 00:00:00 2001 From: Duarte Duarte Date: Tue, 17 Mar 2015 12:42:35 +0000 Subject: Merge pull request #14370 from Kittnz/realm_achievement Core/Condition: Realm Achievement condition (cherry picked from commit 769acfbd02a04c114956758bcd626a740aa76c2a) --- src/server/game/Conditions/ConditionMgr.cpp | 23 ++++++++++++++++++++++- src/server/game/Conditions/ConditionMgr.h | 3 ++- 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 6fce1b9f97f..b0a878aff3f 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -99,7 +99,8 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Distance", true, true, true }, { "Alive", false, false, false }, { "Health Value", true, true, false }, - { "Health Pct", true, true, false } + { "Health Pct", true, true, false }, + { "Realm Achievement", true, false, false } }; // Checks if object meets the condition @@ -416,6 +417,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) condMeets = creature->GetCreatureTemplate()->type == ConditionValue1; break; } + case CONDITION_REALM_ACHIEVEMENT: + { + AchievementEntry const* achievement = sAchievementMgr->GetAchievement(ConditionValue1); + if (achievement && sAchievementMgr->IsRealmCompleted(achievement, std::numeric_limits::max())) + condMeets = true; + break; + } default: condMeets = false; break; @@ -585,6 +593,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() case CONDITION_CREATURE_TYPE: mask |= GRID_MAP_TYPE_MASK_CREATURE; break; + case CONDITION_REALM_ACHIEVEMENT: + mask |= GRID_MAP_TYPE_MASK_ALL; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -2116,6 +2127,16 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) case CONDITION_AREAID: case CONDITION_ALIVE: break; + case CONDITION_REALM_ACHIEVEMENT: + { + AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); + if (!achievement) + { + TC_LOG_ERROR("sql.sql", "%s has non existing realm first achivement id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1); + return false; + } + break; + } default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index aa9ad9963d9..d96a1aaf83b 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -72,7 +72,8 @@ enum ConditionTypes CONDITION_ALIVE = 36, // 0 0 0 true if unit is alive CONDITION_HP_VAL = 37, // hpVal ComparisonType 0 true if unit's hp matches given value CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct - CONDITION_MAX = 39 // MAX + CONDITION_REALM_ACHIEVEMENT = 39, // achievement_id 0 0 true if realm achievement is complete + CONDITION_MAX = 40 // MAX }; /*! Documentation on implementing a new ConditionSourceType: -- cgit v1.2.3 From a4b5b41a9b2e12f5f12584803cd1a98c653cc01b Mon Sep 17 00:00:00 2001 From: Nayd Date: Wed, 18 Mar 2015 00:53:39 +0000 Subject: Core/LFGMgr: Fix compiler error --- src/server/game/DungeonFinding/LFGMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 19ea140d998..db711bd9a47 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1522,7 +1522,7 @@ LfgState LFGMgr::GetOldState(ObjectGuid guid) bool LFGMgr::IsVoteKickActive(ObjectGuid gguid) { - ASSERT(gguid.IsGroup()); + ASSERT(gguid.IsParty()); bool active = GroupsStore[gguid].IsVoteKickActive(); TC_LOG_TRACE("lfg.data.group.votekick.get", "Group: %s, Active: %d", gguid.ToString().c_str(), active); @@ -1692,7 +1692,7 @@ void LFGMgr::SetState(ObjectGuid guid, LfgState state) void LFGMgr::SetVoteKick(ObjectGuid gguid, bool active) { - ASSERT(gguid.IsGroup()); + ASSERT(gguid.IsParty()); LfgGroupData& data = GroupsStore[gguid]; TC_LOG_TRACE("lfg.data.group.votekick.set", "Group: %s, New state: %d, Previous: %d", -- cgit v1.2.3 From 433bc289c2c82b7377ad0189e415a3ca070d220f Mon Sep 17 00:00:00 2001 From: Naios Date: Wed, 18 Mar 2015 19:08:45 +0100 Subject: Core/Misc: Fix some issues detected by static analysis * Assignment of function parameter has no effect outside the function. Did you forget dereferencing it? -> This argument is passed by value, it makes no sence so set it to null here. * Member variable 'instance_violet_hold_InstanceMapScript::bWiped' is not initialized in the constructor. * Mismatching allocation and deallocation: Data --- src/server/bnetserver/Server/ModuleManager.h | 3 ++- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 2 -- src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/bnetserver/Server/ModuleManager.h b/src/server/bnetserver/Server/ModuleManager.h index 05a7298e27c..68d5b2a1e78 100644 --- a/src/server/bnetserver/Server/ModuleManager.h +++ b/src/server/bnetserver/Server/ModuleManager.h @@ -54,9 +54,10 @@ namespace Battlenet memcpy(Data, right.Data, DataSize); } } + ~ModuleInfo() { - delete Data; + delete[] Data; } std::string Type; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index b587e82013f..587e1fca023 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -440,8 +440,6 @@ bool AuctionHouseObject::RemoveAuction(AuctionEntry* auction) // we need to delete the entry, it is not referenced any more delete auction; - auction = NULL; - return wasInMap; } diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 3e3ce5cde75..a462c68e084 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -133,6 +133,7 @@ public: uiCyanigosaEventTimer = 3 * IN_MILLISECONDS; bActive = false; + bWiped = false; bIsDoorSpellCast = false; bCrystalActivated = false; defenseless = true; -- cgit v1.2.3 From 478e86c074cc9c6a19f6c83d2a265eb1ccd705fc Mon Sep 17 00:00:00 2001 From: Luzifix Date: Wed, 18 Mar 2015 23:00:25 +0100 Subject: Core/PacketIO: Create BankHandler & Bank opcode Structure Thx @gigi1237 for search Opcodes Thx @Nayd to help with InvUpdate & InvItem Structure --- src/server/game/Handlers/BankHandler.cpp | 172 +++++++++++++++++++++++++ src/server/game/Handlers/ItemHandler.cpp | 134 ------------------- src/server/game/Handlers/NPCHandler.cpp | 25 ---- src/server/game/Server/Packets/BankPackets.cpp | 38 ++++++ src/server/game/Server/Packets/BankPackets.h | 65 ++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 11 +- src/server/game/Server/Protocol/Opcodes.h | 8 +- src/server/game/Server/WorldSession.h | 15 ++- 8 files changed, 297 insertions(+), 171 deletions(-) create mode 100644 src/server/game/Handlers/BankHandler.cpp create mode 100644 src/server/game/Server/Packets/BankPackets.cpp create mode 100644 src/server/game/Server/Packets/BankPackets.h (limited to 'src/server/game') diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp new file mode 100644 index 00000000000..8879b4e2532 --- /dev/null +++ b/src/server/game/Handlers/BankHandler.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "BankPackets.h" +#include "NPCPackets.h" +#include "ObjectMgr.h" +#include "Opcodes.h" +#include "Player.h" +#include "WorldPacket.h" +#include "WorldSession.h" + +void WorldSession::HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& packet) +{ + TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u", packet.Bag, packet.Slot); + + if (!CanUseBank()) + { + TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + return; + } + + Item* item = _player->GetItemByPos(packet.Bag, packet.Slot); + if (!item) + return; + + ItemPosCountVec dest; + InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false); + if (msg != EQUIP_ERR_OK) + { + _player->SendEquipError(msg, item, NULL); + return; + } + + if (dest.size() == 1 && dest[0].pos == item->GetPos()) + { + _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, NULL); + return; + } + + _player->RemoveItem(packet.Bag, packet.Slot, true); + _player->ItemRemovedQuestCheck(item->GetEntry(), item->GetCount()); + _player->BankItem(dest, item, true); +} + +void WorldSession::HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet) +{ + Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_BANKER); + if (!unit) + { + TC_LOG_ERROR("network", "WORLD: HandleBankerActivateOpcode - %s not found or you can not interact with him.", packet.Unit.ToString().c_str()); + return; + } + + // remove fake death + if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) + GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); + + // set currentBankerGUID for other bank action + + SendShowBank(packet.Unit); +} + +void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBankItem& packet) +{ + TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u", packet.Bag, packet.Slot); + + if (!CanUseBank()) + { + TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + return; + } + + Item* item = _player->GetItemByPos(packet.Bag, packet.Slot); + if (!item) + return; + + if (_player->IsBankPos(packet.Bag, packet.Slot)) // moving from bank to inventory + { + ItemPosCountVec dest; + InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, item, false); + if (msg != EQUIP_ERR_OK) + { + _player->SendEquipError(msg, item, NULL); + return; + } + + _player->RemoveItem(packet.Bag, packet.Slot, true); + if (Item const* storedItem = _player->StoreItem(dest, item, true)) + _player->ItemAddedQuestCheck(storedItem->GetEntry(), storedItem->GetCount()); + + } + else // moving from inventory to bank + { + ItemPosCountVec dest; + InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false); + if (msg != EQUIP_ERR_OK) + { + _player->SendEquipError(msg, item, NULL); + return; + } + + _player->RemoveItem(packet.Bag, packet.Slot, true); + _player->BankItem(dest, item, true); + } +} + +void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet) +{ + WorldPacket data(SMSG_BUY_BANK_SLOT_RESULT, 4); + if (!CanUseBank(packet.Guid)) + { + data << uint32(ERR_BANKSLOT_NOTBANKER); + SendPacket(&data); + TC_LOG_ERROR("network", "WORLD: HandleBuyBankSlotOpcode - %s not found or you can't interact with him.", packet.Guid.ToString().c_str()); + return; + } + + uint32 slot = _player->GetBankBagSlotCount(); + + // next slot + ++slot; + + TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = %u", slot); + + BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot); + + if (!slotEntry) + { + data << uint32(ERR_BANKSLOT_FAILED_TOO_MANY); + SendPacket(&data); + return; + } + + uint32 price = slotEntry->Cost; + + if (!_player->HasEnoughMoney(uint64(price))) + { + data << uint32(ERR_BANKSLOT_INSUFFICIENT_FUNDS); + SendPacket(&data); + return; + } + + _player->SetBankBagSlotCount(slot); + _player->ModifyMoney(-int64(price)); + + data << uint32(ERR_BANKSLOT_OK); + SendPacket(&data); + + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT); +} + +void WorldSession::SendShowBank(ObjectGuid guid) +{ + m_currentBankerGUID = guid; + WorldPackets::NPC::ShowBank packet; + packet.Guid = guid; + SendPacket(packet.Write()); +} diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index e6803832a56..db7b49521c3 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -741,140 +741,6 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBag _player->StoreItem(dest, item, true); } -void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket) -{ - TC_LOG_DEBUG("network", "WORLD: CMSG_BUY_BANK_SLOT"); - - ObjectGuid guid; - recvPacket >> guid; - - WorldPacket data(SMSG_BUY_BANK_SLOT_RESULT, 4); - if (!CanUseBank(guid)) - { - data << uint32(ERR_BANKSLOT_NOTBANKER); - SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: HandleBuyBankSlotOpcode - %s not found or you can't interact with him.", guid.ToString().c_str()); - return; - } - - uint32 slot = _player->GetBankBagSlotCount(); - - // next slot - ++slot; - - TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = %u", slot); - - BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot); - - if (!slotEntry) - { - data << uint32(ERR_BANKSLOT_FAILED_TOO_MANY); - SendPacket(&data); - return; - } - - uint32 price = slotEntry->Cost; - - if (!_player->HasEnoughMoney(uint64(price))) - { - data << uint32(ERR_BANKSLOT_INSUFFICIENT_FUNDS); - SendPacket(&data); - return; - } - - _player->SetBankBagSlotCount(slot); - _player->ModifyMoney(-int64(price)); - - data << uint32(ERR_BANKSLOT_OK); - SendPacket(&data); - - _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT); -} - -void WorldSession::HandleAutoBankItemOpcode(WorldPacket& recvPacket) -{ - TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOBANK_ITEM"); - uint8 srcbag, srcslot; - - recvPacket >> srcbag >> srcslot; - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot); - - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); - return; - } - - Item* pItem = _player->GetItemByPos(srcbag, srcslot); - if (!pItem) - return; - - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, NULL); - return; - } - - if (dest.size() == 1 && dest[0].pos == pItem->GetPos()) - { - _player->SendEquipError(EQUIP_ERR_CANT_SWAP, pItem, NULL); - return; - } - - _player->RemoveItem(srcbag, srcslot, true); - _player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount()); - _player->BankItem(dest, pItem, true); -} - -void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket) -{ - TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_BANK_ITEM"); - uint8 srcbag, srcslot; - - recvPacket >> srcbag >> srcslot; - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot); - - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); - return; - } - - Item* pItem = _player->GetItemByPos(srcbag, srcslot); - if (!pItem) - return; - - if (_player->IsBankPos(srcbag, srcslot)) // moving from bank to inventory - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, NULL); - return; - } - - _player->RemoveItem(srcbag, srcslot, true); - if (Item const* storedItem = _player->StoreItem(dest, pItem, true)) - _player->ItemAddedQuestCheck(storedItem->GetEntry(), storedItem->GetCount()); - } - else // moving from inventory to bank - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, NULL); - return; - } - - _player->RemoveItem(srcbag, srcslot, true); - _player->BankItem(dest, pItem, true); - } -} - void WorldSession::SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId) { WorldPacket data(SMSG_ENCHANTMENT_LOG, (8+8+4+4)); diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 80a2284aa7d..48e752b5d0b 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -73,31 +73,6 @@ void WorldSession::SendTabardVendorActivate(ObjectGuid guid) SendPacket(packet.Write()); } -void WorldSession::HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet) -{ - TC_LOG_DEBUG("network", "WORLD: Received CMSG_BANKER_ACTIVATE"); - - Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_BANKER); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleBankerActivateOpcode - %s not found or you can not interact with him.", packet.Unit.ToString().c_str()); - return; - } - - // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) - GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - - SendShowBank(packet.Unit); -} - -void WorldSession::SendShowBank(ObjectGuid guid) -{ - WorldPackets::NPC::ShowBank packet; - packet.Guid = guid; - SendPacket(packet.Write()); -} - void WorldSession::SendShowMailBox(ObjectGuid guid) { WorldPacket data(SMSG_SHOW_MAILBOX, 8); diff --git a/src/server/game/Server/Packets/BankPackets.cpp b/src/server/game/Server/Packets/BankPackets.cpp new file mode 100644 index 00000000000..0f6af30bed0 --- /dev/null +++ b/src/server/game/Server/Packets/BankPackets.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "BankPackets.h" +#include "ItemPackets.h" + +void WorldPackets::Bank::AutoBankItem::Read() +{ + _worldPacket >> Inv + >> Bag + >> Slot; +} + +void WorldPackets::Bank::AutoStoreBankItem::Read() +{ + _worldPacket >> Inv + >> Bag + >> Slot; +} + +void WorldPackets::Bank::BuyBankSlot::Read() +{ + _worldPacket >> Guid; +} diff --git a/src/server/game/Server/Packets/BankPackets.h b/src/server/game/Server/Packets/BankPackets.h new file mode 100644 index 00000000000..dc7883c3643 --- /dev/null +++ b/src/server/game/Server/Packets/BankPackets.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef BankPackets_h__ +#define BankPackets_h__ + +#include "ItemPackets.h" +#include "Packet.h" +#include "ObjectGuid.h" +#include "WorldSession.h" + +namespace WorldPackets +{ + namespace Bank + { + class AutoBankItem final : public ClientPacket + { + public: + AutoBankItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTOBANK_ITEM, std::move(packet)) { } + + void Read() override; + + WorldPackets::Item::InvUpdate Inv; + uint8 Bag = 0; + uint8 Slot = 0; + }; + + class AutoStoreBankItem final : public ClientPacket + { + public: + AutoStoreBankItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTOSTORE_BANK_ITEM, std::move(packet)) { } + + void Read() override; + + WorldPackets::Item::InvUpdate Inv; + uint8 Bag = 0; + uint8 Slot = 0; + }; + + class BuyBankSlot final : public ClientPacket + { + public: + BuyBankSlot(WorldPacket&& packet) : ClientPacket(CMSG_BUY_BANK_SLOT, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; + }; + } +} +#endif // BankPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 86c5ba482cf..29c0496bbe8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -20,6 +20,7 @@ #include "WorldSession.h" #include "Packets/AchievementPackets.h" #include "Packets/AuctionHousePackets.h" +#include "Packets/BankPackets.h" #include "Packets/BlackMarketPackets.h" #include "Packets/CharacterPackets.h" #include "Packets/ChannelPackets.h" @@ -178,12 +179,12 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_SELL_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionSellItem ); DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); - DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode ); + DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoBankItem, &WorldSession::HandleAutoBankItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); + DEFINE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode ); DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode ); + DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); @@ -228,7 +229,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_BUG_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode ); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BUY_BANK_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankSlotOpcode ); + DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode); DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CAGE_BATTLE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ADD_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent ); @@ -808,7 +809,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode); - DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); + DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_SUB_GROUPS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGroupSwapSubGroupOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SYNC_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 961ba613bd8..9e776488531 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -82,12 +82,12 @@ enum OpcodeClient : uint32 CMSG_AUCTION_SELL_ITEM = 0xBADD, CMSG_AUTH_CONTINUED_SESSION = 0x1A72, CMSG_AUTH_SESSION = 0x1872, - CMSG_AUTOBANK_ITEM = 0xBADD, + CMSG_AUTOBANK_ITEM = 0x00C6, CMSG_AUTOEQUIP_GROUND_ITEM = 0xBADD, - CMSG_AUTOEQUIP_ITEM = 0xBADD, - CMSG_AUTOEQUIP_ITEM_SLOT = 0xBADD, + CMSG_AUTOEQUIP_ITEM = 0x0235, + CMSG_AUTOEQUIP_ITEM_SLOT = 0x00E5, CMSG_AUTOSTORE_BAG_ITEM = 0xBADD, - CMSG_AUTOSTORE_BANK_ITEM = 0xBADD, + CMSG_AUTOSTORE_BANK_ITEM = 0x00D5, CMSG_AUTOSTORE_GROUND_ITEM = 0xBADD, CMSG_AUTOSTORE_LOOT_ITEM = 0x0843, CMSG_BANKER_ACTIVATE = 0x0931, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 71ce6546d3c..02eee5c18f4 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -90,6 +90,13 @@ namespace WorldPackets enum class ConnectToSerial : uint32; } + namespace Bank + { + class AutoBankItem; + class AutoStoreBankItem; + class BuyBankSlot; + } + namespace BlackMarket { class BlackMarketOpen; @@ -999,7 +1006,6 @@ class WorldSession void HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& packet); void HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet); - void HandleBuyBankSlotOpcode(WorldPacket& recvPacket); void HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet); void HandleTrainerBuySpellOpcode(WorldPacket& recvPacket); void HandlePetitionShowList(WorldPackets::Petition::PetitionShowList& packet); @@ -1043,6 +1049,11 @@ class WorldSession void HandleAuctionPlaceBid(WorldPacket& recvData); void HandleAuctionListPendingSales(WorldPacket& recvData); + // Bank + void HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& packet); + void HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBankItem& packet); + void HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet); + // Black Market void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& packet); @@ -1072,8 +1083,6 @@ class WorldSession void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket); void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem); void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet); - void HandleAutoBankItemOpcode(WorldPacket& recvPacket); - void HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket); void HandleWrapItemOpcode(WorldPacket& recvPacket); void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet); -- cgit v1.2.3 From 2abcd4ef4625a9d06337a4ca91afb42d7d43becd Mon Sep 17 00:00:00 2001 From: Carbenium Date: Thu, 19 Mar 2015 00:52:03 +0100 Subject: Core/Support: Fix some static analysis issues --- src/server/game/Support/SupportMgr.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 9183c2f7fde..773dd5d9676 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -219,7 +219,7 @@ std::string GmTicket::FormatViewMessageString(ChatHandler& handler, const char* BugTicket::BugTicket() : _facing(0.0f) { } -BugTicket::BugTicket(Player* player) : Ticket(player) +BugTicket::BugTicket(Player* player) : Ticket(player), _facing(0.0f) { _id = sSupportMgr->GenerateBugId(); } @@ -432,7 +432,7 @@ std::string ComplaintTicket::FormatViewMessageString(ChatHandler& handler, bool SuggestionTicket::SuggestionTicket() : _facing(0.0f) { } -SuggestionTicket::SuggestionTicket(Player* player) : Ticket(player) +SuggestionTicket::SuggestionTicket(Player* player) : Ticket(player), _facing(0.0f) { _id = sSupportMgr->GenerateSuggestionId(); } @@ -715,7 +715,8 @@ void SupportMgr::LoadComplaintTickets() _lastComplaintId = id; chatLogStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GM_COMPLAINT_CHATLINES); - chatLogResult = CharacterDatabase.Query(stmt); + chatLogStmt->setUInt32(0, id); + chatLogResult = CharacterDatabase.Query(chatLogStmt); if (chatLogResult) { -- cgit v1.2.3 From b3a279b6abd2325bb0ebb2c1b2818001679f5c7e Mon Sep 17 00:00:00 2001 From: ariel- Date: Thu, 19 Mar 2015 11:12:51 +0100 Subject: Split up LANG_MAP_POSITION to fix a crash when issuing .gps command Conflicts: src/server/game/Miscellaneous/Language.h (cherry picked from commit 461daadcaf0cafa410c740e6376090c27a1df8ff) --- sql/updates/world/2015_03_19_00_world.sql | 4 ++++ src/server/game/Miscellaneous/Language.h | 4 +++- src/server/scripts/Commands/cs_misc.cpp | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 sql/updates/world/2015_03_19_00_world.sql (limited to 'src/server/game') diff --git a/sql/updates/world/2015_03_19_00_world.sql b/sql/updates/world/2015_03_19_00_world.sql new file mode 100644 index 00000000000..b08542dab48 --- /dev/null +++ b/sql/updates/world/2015_03_19_00_world.sql @@ -0,0 +1,4 @@ +UPDATE `trinity_string` SET `content_default` = 'Map: %u (%s) Zone: %u (%s) Area: %u (%s) Phase: %u\nX: %f Y: %f Z: %f Orientation: %f' WHERE `entry` = 101; +DELETE FROM `trinity_string` WHERE `entry` = 185; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES +(185, 'grid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u MMap: %u)'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 446ee2606e1..0e89c3f7a0d 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -215,7 +215,9 @@ enum TrinityStrings LANG_PHASING_PHASEMASK = 182, LANG_PHASING_REPORT_STATUS = 183, LANG_PHASING_NO_DEFINITIONS = 184, // Phasing - // Room for more level 1 185-199 not used + + LANG_GRID_POSITION = 185, + // Room for more level 1 186-199 not used // level 2 chat LANG_NO_SELECTION = 200, diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index bc8f7bad5fb..cf1bc4fbb0e 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -238,7 +238,8 @@ public: zoneId, (zoneEntry ? zoneEntry->ZoneName : unknown), areaId, (areaEntry ? areaEntry->ZoneName : unknown), object->GetPhaseMask(), - object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), + object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); + handler->PSendSysMessage(LANG_GRID_POSITION, cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap); -- cgit v1.2.3 From da0680db0637bace0daed24a5cf96af9533ec556 Mon Sep 17 00:00:00 2001 From: Luzifix Date: Thu, 19 Mar 2015 21:56:03 +0100 Subject: Core/PacketIO: OpenItem for 6.1 You can test it with http://www.wowhead.com/item=41426/ --- src/server/game/Handlers/SpellHandler.cpp | 35 ++++++++++--------------- src/server/game/Server/Packets/SpellPackets.cpp | 6 +++++ src/server/game/Server/Packets/SpellPackets.h | 11 ++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 8 +++--- src/server/game/Server/Protocol/Opcodes.h | 4 +-- src/server/game/Server/WorldSession.h | 3 ++- 6 files changed, 39 insertions(+), 28 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 0553d99dd8f..e9eccb6b634 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -129,42 +129,35 @@ void WorldSession::HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet) } } -void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) +void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet) { - TC_LOG_DEBUG("network", "WORLD: CMSG_OPEN_ITEM packet, data length = %i", (uint32)recvPacket.size()); - - Player* pUser = _player; + Player* player = _player; // ignore for remote control state - if (pUser->m_mover != pUser) + if (player->m_mover != player) return; + TC_LOG_INFO("network", "bagIndex: %u, slot: %u", packet.Slot, packet.PackSlot); - uint8 bagIndex, slot; - - recvPacket >> bagIndex >> slot; - - TC_LOG_INFO("network", "bagIndex: %u, slot: %u", bagIndex, slot); - - Item* item = pUser->GetItemByPos(bagIndex, slot); + Item* item = player->GetItemByPos(packet.Slot, packet.PackSlot); if (!item) { - pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); return; } ItemTemplate const* proto = item->GetTemplate(); if (!proto) { - pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, NULL); return; } // Verify that the bag is an actual bag or wrapped item that can be used "normally" if (!(proto->GetFlags() & ITEM_PROTO_FLAG_OPENABLE) && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED)) { - pUser->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); TC_LOG_ERROR("network", "Possible hacking attempt: Player %s [%s] tried to open item [%s, entry: %u] which is not openable!", - pUser->GetName().c_str(), pUser->GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), proto->GetId()); + player->GetName().c_str(), player->GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), proto->GetId()); return; } @@ -176,7 +169,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) if (!lockInfo) { - pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); TC_LOG_ERROR("network", "WORLD::OpenItem: item [%s] has an unknown lockId: %u!", item->GetGUID().ToString().c_str(), lockId); return; } @@ -184,7 +177,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) // was not unlocked yet if (item->IsLocked()) { - pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); return; } } @@ -206,12 +199,12 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) item->SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Empty); item->SetEntry(entry); item->SetUInt32Value(ITEM_FIELD_FLAGS, flags); - item->SetState(ITEM_CHANGED, pUser); + item->SetState(ITEM_CHANGED, player); } else { TC_LOG_ERROR("network", "Wrapped item %s don't have record in character_gifts table and will deleted", item->GetGUID().ToString().c_str()); - pUser->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); + player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); return; } @@ -222,7 +215,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) CharacterDatabase.Execute(stmt); } else - pUser->SendLoot(item->GetGUID(), LOOT_CORPSE); + player->SendLoot(item->GetGUID(), LOOT_CORPSE); } void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjectUse& packet) diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index fabecce0d34..4045a76cb62 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -626,3 +626,9 @@ void WorldPackets::Spells::CancelCast::Read() _worldPacket >> SpellID; _worldPacket >> CastID; } + +void WorldPackets::Spells::OpenItem::Read() +{ + _worldPacket >> Slot + >> PackSlot; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 634f4b40e7f..72a4fd4bdce 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -588,6 +588,17 @@ namespace WorldPackets uint32 SpellID = 0; uint8 CastID = 0; }; + + class OpenItem final : public ClientPacket + { + public: + OpenItem(WorldPacket&& packet) : ClientPacket(CMSG_OPEN_ITEM, std::move(packet)) { } + + void Read() override; + + uint8 Slot = 0; + uint8 PackSlot = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 6a60b79d094..bb6d69260bc 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -185,7 +185,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); + DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode ); @@ -611,7 +611,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_GARRISON_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode ); + DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_GAME_OBJ, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode ); @@ -1348,7 +1348,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1407,7 +1407,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 961ba613bd8..e1b459c2599 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -520,7 +520,7 @@ enum OpcodeClient : uint32 CMSG_OFFER_PETITION = 0xBADD, CMSG_OPENING_CINEMATIC = 0xBADD, CMSG_OPEN_GARRISON_MISSION_NPC = 0x1911, - CMSG_OPEN_ITEM = 0xBADD, + CMSG_OPEN_ITEM = 0x0E51, CMSG_OPEN_SHIPMENT_GAME_OBJ = 0xBADD, CMSG_OPEN_SHIPMENT_NPC = 0x0E41, CMSG_OPT_OUT_OF_LOOT = 0xBADD, @@ -591,7 +591,7 @@ enum OpcodeClient : uint32 CMSG_RANDOM_ROLL = 0x1BE2, CMSG_READY_CHECK_RESPONSE = 0xBADD, CMSG_READ_ITEM = 0xBADD, - CMSG_REAGENT_BANK_BUY_TAB = 0xBADD, + CMSG_REAGENT_BANK_BUY_TAB = 0x0A3C, CMSG_REALM_NAME_QUERY = 0x17BC, CMSG_RECLAIM_CORPSE = 0x093B, CMSG_RECRUIT_A_FRIEND = 0xBADD, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 61d52cc8bff..48c79fb9df2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -354,6 +354,7 @@ namespace WorldPackets class CastSpell; class PetCastSpell; class UseItem; + class OpenItem; class SetActionButton; } @@ -1083,7 +1084,7 @@ class WorldSession void HandleSetSheathedOpcode(WorldPackets::Combat::SetSheathed& packet); void HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet); - void HandleOpenItemOpcode(WorldPacket& recvPacket); + void HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet); void HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& castRequest); void HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& packet); void HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura); -- cgit v1.2.3 From a5b662e0d91020e5dd033588526df6dbf08c4289 Mon Sep 17 00:00:00 2001 From: MitchesD Date: Fri, 20 Mar 2015 15:41:13 +0100 Subject: Core/PacketIO: CMSG_SET_ACTIVE_MOVER, SMSG_MOVE_SET_ACTIVE_MOVER updated and enabled --- src/server/game/Entities/Player/Player.cpp | 25 +++------------------ src/server/game/Handlers/MovementHandler.cpp | 26 +++------------------- src/server/game/Server/Packets/MovementPackets.cpp | 12 ++++++++++ src/server/game/Server/Packets/MovementPackets.h | 20 +++++++++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 4 ++-- src/server/game/Server/WorldSession.h | 3 ++- 6 files changed, 42 insertions(+), 48 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6ea9bc523b9..0f5a36e14b4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23691,28 +23691,9 @@ void Player::SetMover(Unit* target) m_mover = target; m_mover->m_movedPlayer = this; - ObjectGuid guid = target->GetGUID(); - - WorldPacket data(SMSG_MOVE_SET_ACTIVE_MOVER, 9); - data.WriteBit(guid[5]); - data.WriteBit(guid[7]); - data.WriteBit(guid[3]); - data.WriteBit(guid[6]); - data.WriteBit(guid[0]); - data.WriteBit(guid[4]); - data.WriteBit(guid[1]); - data.WriteBit(guid[2]); - - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[4]); - - SendDirectMessage(&data); + WorldPackets::Movement::MoveSetActiveMover packet; + packet.MoverGUID = target->GetGUID(); + SendDirectMessage(packet.Write()); } void Player::UpdateZoneDependentAuras(uint32 newZone) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index d1f4c862b0c..f40527b66d7 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -465,33 +465,13 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpe } } -void WorldSession::HandleSetActiveMoverOpcode(WorldPacket& recvPacket) +void WorldSession::HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover& packet) { TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_SET_ACTIVE_MOVER"); - ObjectGuid guid; - - guid[7] = recvPacket.ReadBit(); - guid[2] = recvPacket.ReadBit(); - guid[1] = recvPacket.ReadBit(); - guid[0] = recvPacket.ReadBit(); - guid[4] = recvPacket.ReadBit(); - guid[5] = recvPacket.ReadBit(); - guid[6] = recvPacket.ReadBit(); - guid[3] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(guid[3]); - recvPacket.ReadByteSeq(guid[2]); - recvPacket.ReadByteSeq(guid[4]); - recvPacket.ReadByteSeq(guid[0]); - recvPacket.ReadByteSeq(guid[5]); - recvPacket.ReadByteSeq(guid[1]); - recvPacket.ReadByteSeq(guid[6]); - recvPacket.ReadByteSeq(guid[7]); - if (GetPlayer()->IsInWorld()) - if (_player->m_mover->GetGUID() != guid) - TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , guid.ToString().c_str(), _player->m_mover->GetGUID().ToString().c_str()); + if (_player->m_mover->GetGUID() != packet.ActiveMover) + TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , packet.ActiveMover.ToString().c_str(), _player->m_mover->GetGUID().ToString().c_str()); } void WorldSession::HandleMoveNotActiveMover(WorldPacket &recvData) diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index d0a3e0038e9..836c00b70ca 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -608,3 +608,15 @@ void WorldPackets::Movement::MovementSpeedAck::Read() _worldPacket >> AckIndex; _worldPacket >> Speed; } + +void WorldPackets::Movement::SetActiveMover::Read() +{ + _worldPacket >> ActiveMover; +} + +WorldPacket const* WorldPackets::Movement::MoveSetActiveMover::Write() +{ + _worldPacket << MoverGUID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 0e5449c7947..0b57cdaddb0 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -308,6 +308,26 @@ namespace WorldPackets int32 AckIndex = 0; float Speed = 0.0f; }; + + class SetActiveMover final : public ClientPacket + { + public: + SetActiveMover(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTIVE_MOVER, std::move(packet)) { } + + void Read() override; + + ObjectGuid ActiveMover; + }; + + class MoveSetActiveMover final : public ServerPacket + { + public: + MoveSetActiveMover() : ServerPacket(SMSG_MOVE_SET_ACTIVE_MOVER, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + }; } ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0c86320bdd8..c73ad32de49 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -743,7 +743,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACHIEVEMENTS_HIDDEN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_ACTIONBAR_TOGGLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetActionBarToggles, &WorldSession::HandleSetActionBarToggles); DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_MOVER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode ); + DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SetActiveMover, &WorldSession::HandleSetActiveMoverOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGroupAssistantLeaderOpcode); @@ -1446,7 +1446,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c44afbea3f6..a0c7906d0bf 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -296,6 +296,7 @@ namespace WorldPackets class MoveTeleportAck; class MovementAck; class MovementSpeedAck; + class SetActiveMover; } namespace NPC @@ -919,7 +920,7 @@ class WorldSession void HandleMoveWorldportAckOpcode(); // for server-side calls void HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMovement& packet); - void HandleSetActiveMoverOpcode(WorldPacket& recvData); + void HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover& packet); void HandleMoveNotActiveMover(WorldPacket& recvData); void HandleDismissControlledVehicle(WorldPacket& recvData); void HandleRequestVehicleExit(WorldPacket& recvData); -- cgit v1.2.3 From 791cf47d0b0e403f15d8a1a3af3691b418281ae8 Mon Sep 17 00:00:00 2001 From: Zedron Date: Fri, 20 Mar 2015 13:51:50 -0500 Subject: Core/PacketIO: Fixed teleporting between maps CMSG_MOVE_WORLDPORT_ACK should have STATUS_TRANSFER, as the player isn't in the world (yet) --- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c73ad32de49..2e1daccc803 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -601,7 +601,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TOGGLE_COLLISION_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); - DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode); + DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode); DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_NEW_SPELL_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); -- cgit v1.2.3 From f6428df949225211958b9ad348b7119ba4253f12 Mon Sep 17 00:00:00 2001 From: MitchesD Date: Fri, 20 Mar 2015 20:07:25 +0100 Subject: Scripts/Misc: sync with 3cc305138c9b57da02d42b88cc0cae941016542a adfd8a6 - Scripts/Mulgore: The Plains Vision - Move Corescrript to SAI c21a600 - Delete zone_mulgore.cpp 87f40a5 - Scripts/Kalimdor: Remove Mulgorescripts 8904a94 - Scripts/The Barrens: Add missing Text for 'The Escape' cfc5fb2 - DB/Misc: Fix a few startup errors from recent Updates (Script part) --- src/server/game/Scripting/ScriptLoader.cpp | 2 - src/server/scripts/Kalimdor/CMakeLists.txt | 1 - src/server/scripts/Kalimdor/zone_mulgore.cpp | 178 --------------------- src/server/scripts/Kalimdor/zone_the_barrens.cpp | 1 + .../scripts/Northrend/zone_borean_tundra.cpp | 44 ----- 5 files changed, 1 insertion(+), 225 deletions(-) delete mode 100644 src/server/scripts/Kalimdor/zone_mulgore.cpp (limited to 'src/server/game') diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 603089b0a6b..553c752ccce 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -368,7 +368,6 @@ void AddSC_dustwallow_marsh(); void AddSC_felwood(); void AddSC_feralas(); void AddSC_moonglade(); -void AddSC_mulgore(); void AddSC_orgrimmar(); void AddSC_silithus(); void AddSC_stonetalon_mountains(); @@ -1090,7 +1089,6 @@ void AddKalimdorScripts() AddSC_felwood(); AddSC_feralas(); AddSC_moonglade(); - AddSC_mulgore(); AddSC_orgrimmar(); AddSC_silithus(); AddSC_stonetalon_mountains(); diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index d5e445230bd..8c3f3216e91 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -92,7 +92,6 @@ set(scripts_STAT_SRCS Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp - Kalimdor/zone_mulgore.cpp Kalimdor/zone_bloodmyst_isle.cpp Kalimdor/zone_thunder_bluff.cpp Kalimdor/zone_azshara.cpp diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp deleted file mode 100644 index b6db431d0b2..00000000000 --- a/src/server/scripts/Kalimdor/zone_mulgore.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) 2008-2015 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/* ScriptData -SDName: Mulgore -SD%Complete: 100 -SDComment: Support for quest: 11129, 861 -SDCategory: Mulgore -EndScriptData */ - -/* ContentData -npc_kyle_frenzied -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "Player.h" -#include "SpellInfo.h" - -/*##### -# npc_kyle_frenzied -######*/ - -enum KyleFrenzied -{ - EMOTE_SEE_LUNCH = 0, - EMOTE_EAT_LUNCH = 1, - EMOTE_DANCE = 2, - - SPELL_LUNCH = 42222, - NPC_KYLE_FRENZIED = 23616, - NPC_KYLE_FRIENDLY = 23622, - POINT_ID = 1 -}; - -class npc_kyle_frenzied : public CreatureScript -{ -public: - npc_kyle_frenzied() : CreatureScript("npc_kyle_frenzied") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kyle_frenziedAI (creature); - } - - struct npc_kyle_frenziedAI : public ScriptedAI - { - npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - EventActive = false; - IsMovingToLunch = false; - PlayerGUID.Clear(); - EventTimer = 5000; - EventPhase = 0; - } - - bool EventActive; - bool IsMovingToLunch; - ObjectGuid PlayerGUID; - uint32 EventTimer; - uint8 EventPhase; - - void Reset() override - { - Initialize(); - - if (me->GetEntry() == NPC_KYLE_FRIENDLY) - me->UpdateEntry(NPC_KYLE_FRENZIED); - } - - void SpellHit(Unit* Caster, SpellInfo const* Spell) - { - if (!me->GetVictim() && !EventActive && Spell->Id == SPELL_LUNCH) - { - if (Caster->GetTypeId() == TYPEID_PLAYER) - PlayerGUID = Caster->GetGUID(); - - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) - { - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - } - - EventActive = true; - Talk(EMOTE_SEE_LUNCH); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CREATURE_SPECIAL); - } - } - - void MovementInform(uint32 type, uint32 pointId) override - { - if (type != POINT_MOTION_TYPE || !EventActive) - return; - - if (pointId == POINT_ID) - IsMovingToLunch = false; - } - - void UpdateAI(uint32 diff) override - { - if (EventActive) - { - if (IsMovingToLunch) - return; - - if (EventTimer <= diff) - { - EventTimer = 5000; - ++EventPhase; - - switch (EventPhase) - { - case 1: - if (Unit* unit = ObjectAccessor::GetUnit(*me, PlayerGUID)) - { - if (GameObject* go = unit->GetGameObject(SPELL_LUNCH)) - { - IsMovingToLunch = true; - me->GetMotionMaster()->MovePoint(POINT_ID, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); - } - } - break; - case 2: - Talk(EMOTE_EAT_LUNCH); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); - break; - case 3: - if (Player* unit = ObjectAccessor::GetPlayer(*me, PlayerGUID)) - unit->TalkedToCreature(me->GetEntry(), me->GetGUID()); - - me->UpdateEntry(NPC_KYLE_FRIENDLY); - break; - case 4: - EventTimer = 30000; - Talk(EMOTE_DANCE); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCESPECIAL); - break; - case 5: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); - Reset(); - me->GetMotionMaster()->Clear(); - break; - } - } - else - EventTimer -= diff; - } - } - }; - -}; - -void AddSC_mulgore() -{ - new npc_kyle_frenzied(); -} diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 232261df951..1c9d5cf2c62 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -654,6 +654,7 @@ public: if (quest->GetQuestId() == QUEST_ESCAPE) { creature->setFaction(FACTION_RATCHET); + creature->AI()->Talk(SAY_START); if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI())) pEscortAI->Start(true, false, player->GetGUID()); } diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index f6b9f9fb6be..b58d9419e95 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -29,7 +29,6 @@ npc_corastrasza npc_sinkhole_kill_credit npc_khunok_the_behemoth npc_nerubar_victim -npc_keristrasza npc_nesingwary_trapper npc_lurgglbr npc_nexus_drake_hatchling @@ -222,48 +221,6 @@ public: } }; -/*###### -## npc_keristrasza -######*/ - -enum Keristrasza -{ - SPELL_TELEPORT_TO_SARAGOSA = 46772 -}; - -#define GOSSIP_HELLO_KERI "I am prepared to face Saragosa!" - -class npc_keristrasza : public CreatureScript -{ -public: - npc_keristrasza() : CreatureScript("npc_keristrasza") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(11957) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_KERI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_TELEPORT_TO_SARAGOSA, true); - } - - return true; - } -}; - /*###### ## npc_corastrasza ######*/ @@ -2488,7 +2445,6 @@ void AddSC_borean_tundra() { new npc_sinkhole_kill_credit(); new npc_khunok_the_behemoth(); - new npc_keristrasza(); new npc_corastrasza(); new npc_iruk(); new npc_nerubar_victim(); -- cgit v1.2.3 From 844eaae029b6c388aa411d9d17eda75ddcc9b61a Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Fri, 20 Mar 2015 21:12:10 +0100 Subject: Core/PacketIO: Update SMSG_MAIL_QUERY_NEXT_TIME_RESULT for 6.1.0 --- src/server/game/Server/Packets/MailPackets.cpp | 4 ---- src/server/game/Server/Packets/MailPackets.h | 1 - 2 files changed, 5 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index d558b4682c1..425feac5d9f 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -240,8 +240,6 @@ WorldPackets::Mail::MailQueryNextTimeResult::MailNextTimeEntry::MailNextTimeEntr { case MAIL_NORMAL: SenderGuid = ObjectGuid::Create(mail->sender); - SenderHint.NativeRealmAddress.Set(GetVirtualRealmAddress()); - SenderHint.VirtualRealmAddress.Set(GetVirtualRealmAddress()); break; case MAIL_AUCTION: case MAIL_CREATURE: @@ -264,8 +262,6 @@ WorldPacket const* WorldPackets::Mail::MailQueryNextTimeResult::Write() for (auto const& entry : Next) { _worldPacket << entry.SenderGuid; - _worldPacket << entry.SenderHint; - _worldPacket << float(entry.TimeLeft); _worldPacket << int32(entry.AltSenderID); _worldPacket << int8(entry.AltSenderType); diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index 281a48b7248..e79469a76d8 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -223,7 +223,6 @@ namespace WorldPackets MailNextTimeEntry(::Mail const* mail); ObjectGuid SenderGuid; - Query::PlayerGuidLookupHint SenderHint; float TimeLeft = 0.0f; int32 AltSenderID = 0; int8 AltSenderType = 0; -- cgit v1.2.3 From 127d8a2bcc5acdcc909c7812a53e40d8dc79e437 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sat, 21 Mar 2015 11:27:15 +0100 Subject: Core/PacketIO: Sync with wpp and enable some opcodes --- src/server/game/Server/Protocol/Opcodes.cpp | 7 ++-- src/server/game/Server/Protocol/Opcodes.h | 53 +++++++++++++++-------------- 2 files changed, 31 insertions(+), 29 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2e1daccc803..bfa0c829f3b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -489,7 +489,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost ); DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode); DEFINE_HANDLER(CMSG_LOAD_SCREEN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::LoadingScreenNotify, &WorldSession::HandleLoadScreenOpcode); - DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode); + DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_LOGOUT_INSTANT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutRequest, &WorldSession::HandleLogoutRequestOpcode); DEFINE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); @@ -668,7 +668,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); DEFINE_HANDLER(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); + DEFINE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery); DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode); DEFINE_HANDLER(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); @@ -692,7 +692,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::RepairItem, &WorldSession::HandleRepairItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPLACE_ACCOUNT_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPLACE_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest); + DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_IGNORED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChatIgnoredOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_PVP_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK ); @@ -836,6 +836,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_HANDLER(CMSG_UI_TIME_REQUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::UITimeRequest, &WorldSession::HandleUITimeRequest); + DEFINE_OPCODE_HANDLER_OLD(CMSG_TWITTER_GET_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 9e776488531..9668a30cad7 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -73,13 +73,13 @@ enum OpcodeClient : uint32 CMSG_ATTACKSWING = 0x048B, CMSG_AUCTION_HELLO_REQUEST = 0x06E3, CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x0C81, - CMSG_AUCTION_LIST_ITEMS = 0xBADD, + CMSG_AUCTION_LIST_ITEMS = 0x05C3, CMSG_AUCTION_LIST_OWNER_ITEMS = 0x082A, CMSG_AUCTION_LIST_PENDING_SALES = 0x0D82, CMSG_AUCTION_PLACE_BID = 0x09E1, - CMSG_AUCTION_REMOVE_ITEM = 0xBADD, + CMSG_AUCTION_REMOVE_ITEM = 0x1309, CMSG_AUCTION_REPLICATE_ITEMS = 0xBADD, - CMSG_AUCTION_SELL_ITEM = 0xBADD, + CMSG_AUCTION_SELL_ITEM = 0x09A3, CMSG_AUTH_CONTINUED_SESSION = 0x1A72, CMSG_AUTH_SESSION = 0x1872, CMSG_AUTOBANK_ITEM = 0x00C6, @@ -115,7 +115,7 @@ enum OpcodeClient : uint32 CMSG_BATTLE_PET_DELETE_PET = 0xBADD, CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0xBADD, CMSG_BATTLE_PET_MODIFY_NAME = 0x1131, - CMSG_BATTLE_PET_NAME_QUERY = 0xBADD, + CMSG_BATTLE_PET_NAME_QUERY = 0x1184, CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x1773, CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x1B24, CMSG_BATTLE_PET_REQUEST_UPDATE = 0xBADD, @@ -279,7 +279,7 @@ enum OpcodeClient : uint32 CMSG_GET_GARRISON_INFO = 0x0352, CMSG_GET_ITEM_PURCHASE_DATA = 0x0CE4, CMSG_GET_MAIL_LIST = 0x0979, - CMSG_GET_MIRROR_IMAGE_DATA = 0xBADD, + CMSG_GET_MIRROR_IMAGE_DATA = 0x1952, CMSG_GET_SHIPMENT_INFO = 0xBADD, CMSG_GET_TROPHY_LIST = 0xBADD, CMSG_GET_UNDELETE_COOLDOWN_STATUS = 0x196A, @@ -288,7 +288,7 @@ enum OpcodeClient : uint32 CMSG_GM_LAG_REPORT = 0xBADD, CMSG_GM_NUKE = 0xBADD, CMSG_GM_SET_SECURITY_GROUP = 0xBADD, - CMSG_GM_SURVEY_SUBMIT = 0xBADD, + CMSG_GM_SURVEY_SUBMIT = 0x1BAB, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0xBADD, CMSG_GM_TICKET_CREATE = 0x19A4, CMSG_GM_TICKET_DELETE_TICKET = 0x1B39, @@ -397,7 +397,7 @@ enum OpcodeClient : uint32 CMSG_LF_GUILD_SET_GUILD_POST = 0xBADD, CMSG_LIST_INVENTORY = 0x06C4, CMSG_LOAD_SCREEN = 0x13E4, - CMSG_LOGOUT_CANCEL = 0xBADD, + CMSG_LOGOUT_CANCEL = 0x0DC1, CMSG_LOGOUT_INSTANT = 0xBADD, CMSG_LOGOUT_REQUEST = 0x0824, CMSG_LOG_DISCONNECT = 0x1432, @@ -452,7 +452,7 @@ enum OpcodeClient : uint32 CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x038B, CMSG_MOVE_FALL_LAND = 0x0DEA, CMSG_MOVE_FALL_RESET = 0x0F89, - CMSG_MOVE_FEATHER_FALL_ACK = 0x0F89, + CMSG_MOVE_FEATHER_FALL_ACK = 0x02B1, CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0xBADD, CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x09CB, CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0xBADD, @@ -548,7 +548,7 @@ enum OpcodeClient : uint32 CMSG_PET_CAST_SPELL = 0xBADD, CMSG_PET_LEARN_TALENT = 0xBADD, CMSG_PET_NAME_CACHE = 0xBADD, - CMSG_PET_NAME_QUERY = 0xBADD, + CMSG_PET_NAME_QUERY = 0x0CCB, CMSG_PET_RENAME = 0x1333, CMSG_PET_SET_ACTION = 0xBADD, CMSG_PET_SET_SPECIALIZATION = 0xBADD, @@ -577,7 +577,7 @@ enum OpcodeClient : uint32 CMSG_QUESTGIVER_HELLO = 0x0B2A, CMSG_QUESTGIVER_QUERY_QUEST = 0x131A, CMSG_QUESTGIVER_QUEST_AUTOLAUNCH = 0xBADD, - CMSG_QUESTGIVER_REQUEST_REWARD = 0xBADD, + CMSG_QUESTGIVER_REQUEST_REWARD = 0x1509, CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x0A39, CMSG_QUESTGIVER_STATUS_QUERY = 0x0A7B, CMSG_QUESTLOG_REMOVE_QUEST = 0x04C3, @@ -595,12 +595,12 @@ enum OpcodeClient : uint32 CMSG_REALM_NAME_QUERY = 0x17BC, CMSG_RECLAIM_CORPSE = 0x093B, CMSG_RECRUIT_A_FRIEND = 0xBADD, - CMSG_REGISTER_ADDON_PREFIXES = 0xBADD, + CMSG_REGISTER_ADDON_PREFIXES = 0x063B, CMSG_REORDER_CHARACTERS = 0x1729, CMSG_REPAIR_ITEM = 0x05E2, CMSG_REPLACE_ACCOUNT_DATA = 0xBADD, CMSG_REPLACE_TROPHY = 0xBADD, - CMSG_REPOP_REQUEST = 0xBADD, + CMSG_REPOP_REQUEST = 0x0B3B, CMSG_REPORT_FILTERED = 0xBADD, CMSG_REPORT_IGNORED = 0xBADD, CMSG_REPORT_PVP_AFK = 0xBADD, @@ -614,8 +614,8 @@ enum OpcodeClient : uint32 CMSG_REQUEST_GUILD_REWARDS_LIST = 0xBADD, CMSG_REQUEST_HONOR_STATS = 0xBADD, CMSG_REQUEST_LFG_LIST_BLACKLIST = 0xBADD, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0xBADD, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x1339, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x1972, CMSG_REQUEST_PET_INFO = 0xBADD, CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0xBADD, CMSG_REQUEST_PVP_REWARDS = 0xBADD, @@ -743,6 +743,7 @@ enum OpcodeClient : uint32 CMSG_TROPHY_MONUMENT_LOAD_SELECTED_TROPHY_ID = 0xBADD, CMSG_TURN_IN_PETITION = 0xBADD, CMSG_TUTORIAL_FLAG = 0x1132, + CMSG_TWITTER_GET_STATUS = 0x1128, CMSG_UI_TIME_REQUEST = 0x1B7B, CMSG_UNACCEPT_TRADE = 0xBADD, CMSG_UNDELETE_CHARACTER = 0xBADD, @@ -767,7 +768,7 @@ enum OpcodeClient : uint32 CMSG_VOICE_DEL_IGNORE = 0xBADD, CMSG_VOICE_SESSION_ENABLE = 0x153A, CMSG_VOID_STORAGE_QUERY = 0x17C3, - CMSG_VOID_STORAGE_TRANSFER = 0xBADD, + CMSG_VOID_STORAGE_TRANSFER = 0x0674, CMSG_VOID_STORAGE_UNLOCK = 0xBADD, CMSG_VOID_SWAP_ITEM = 0xBADD, CMSG_WARDEN_DATA = 0x11E3, @@ -892,8 +893,8 @@ enum OpcodeServer : uint32 SMSG_BATTLEGROUND_INIT = 0xBADD, SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0xBADD, - SMSG_BATTLEGROUND_POINTS = 0xBADD, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x1962, + SMSG_BATTLEGROUND_POINTS = 0x15AB, SMSG_BATTLENET_CHALLENGE_ABORT = 0xBADD, SMSG_BATTLENET_CHALLENGE_START = 0xBADD, SMSG_BATTLE_PAY_ACK_FAILED = 0xBADD, @@ -1306,7 +1307,7 @@ enum OpcodeServer : uint32 SMSG_LFG_PLAYER_INFO = 0x03FA, SMSG_LFG_PLAYER_REWARD = 0xBADD, SMSG_LFG_PROPOSAL_UPDATE = 0xBADD, - SMSG_LFG_QUEUE_STATUS = 0xBADD, + SMSG_LFG_QUEUE_STATUS = 0x0292, SMSG_LFG_ROLE_CHECK_UPDATE = 0xBADD, SMSG_LFG_ROLE_CHOSEN = 0xBADD, SMSG_LFG_SEARCH_RESULTS = 0xBADD, @@ -1314,7 +1315,7 @@ enum OpcodeServer : uint32 SMSG_LFG_TELEPORT_DENIED = 0xBADD, SMSG_LFG_UPDATE_LIST = 0xBADD, SMSG_LFG_UPDATE_SEARCH = 0xBADD, - SMSG_LFG_UPDATE_STATUS = 0xBADD, + SMSG_LFG_UPDATE_STATUS = 0x02B1, SMSG_LF_GUILD_APPLICANT_LIST_UPDATED = 0xBADD, SMSG_LF_GUILD_APPLICATIONS = 0xBADD, SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0xBADD, @@ -1485,10 +1486,10 @@ enum OpcodeServer : uint32 SMSG_PARTY_COMMAND_RESULT = 0xBADD, SMSG_PARTY_INVITE = 0x1F9C, SMSG_PARTY_KILL_LOG = 0x0CA4, - SMSG_PARTY_MEMBER_STATE = 0xBADD, + SMSG_PARTY_MEMBER_STATE = 0x1564, SMSG_PARTY_MEMBER_STATS = 0xBADD, SMSG_PARTY_MEMBER_STATS_FULL = 0xBADD, - SMSG_PARTY_UPDATE = 0xBADD, + SMSG_PARTY_UPDATE = 0x0981, SMSG_PAUSE_MIRROR_TIMER = 0xBADD, SMSG_PENDING_RAID_LOCK = 0xBADD, SMSG_PERIODICAURALOG = 0x184B, @@ -1612,7 +1613,7 @@ enum OpcodeServer : uint32 SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD, SMSG_REFER_A_FRIEND_FAILURE = 0xBADD, SMSG_REFRESH_COMPONENT = 0xBADD, - SMSG_REFRESH_SPELL_HISTORY = 0xBADD, + SMSG_REFRESH_SPELL_HISTORY = 0x072B, SMSG_REMOVE_ITEM_PASSIVE = 0xBADD, SMSG_REMOVE_LOSS_OF_CONTROL = 0xBADD, SMSG_REPLACE_TROPHY_RESPONSE = 0xBADD, @@ -1686,7 +1687,7 @@ enum OpcodeServer : uint32 SMSG_SET_FACTION_STANDING = 0x1129, SMSG_SET_FACTION_VISIBLE = 0x0A72, SMSG_SET_FLAT_SPELL_MODIFIER = 0x120B, - SMSG_SET_FORCED_REACTIONS = 0xBADD, + SMSG_SET_FORCED_REACTIONS = 0x0EC2, SMSG_SET_ITEM_PURCHASE_DATA = 0xBADD, SMSG_SET_LFG_TIME_WALKER = 0xBADD, SMSG_SET_LOOT_METHOD_FAILED = 0xBADD, @@ -1815,10 +1816,10 @@ enum OpcodeServer : uint32 SMSG_VOICE_SESSION_ROSTER_UPDATE = 0xBADD, SMSG_VOICE_SET_TALKER_MUTED = 0xBADD, SMSG_VOID_ITEM_SWAP_RESPONSE = 0xBADD, - SMSG_VOID_STORAGE_CONTENTS = 0xBADD, + SMSG_VOID_STORAGE_CONTENTS = 0x1122, SMSG_VOID_STORAGE_FAILED = 0xBADD, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0xBADD, - SMSG_VOID_TRANSFER_RESULT = 0xBADD, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x1BAB, + SMSG_VOID_TRANSFER_RESULT = 0x192C, SMSG_WAIT_QUEUE_FINISH = 0xBADD, SMSG_WAIT_QUEUE_UPDATE = 0xBADD, SMSG_WARDEN_DATA = 0x110A, -- cgit v1.2.3 From 352012e53173372ebc82898e1b6854c983b01b25 Mon Sep 17 00:00:00 2001 From: Naios Date: Sat, 21 Mar 2015 00:25:21 +0100 Subject: Core/Updates: Add an automatic database update system. Automatically detects new and edited sql updates through file lists and hashing. Detects renames, deletes and is able to create and auto import full databases. * cleanups in main.cpp of world & bnetserver * refactoring in DatabaseWorkerPool.h & MySQLConnection.cpp Make sure you re-run cmake, because boost::iostreams was added as dependency. Maybe you need to install libboost-iostreams1.55-dev on unix as well. Import every update manual until (included) those INSERT IGNORE updates for each database. Thanks DDuarte and Shauren for your amazing ideas, help and advises. In hope that nobody gets a "Your database structure is not up to date..." anymore ,-) Signed-off-by: Naios Signed-off-by: Nayd --- .travis.yml | 4 +- cmake/macros/ConfigureBoost.cmake | 4 +- cmake/macros/FindMySQL.cmake | 65 ++- dep/PackageList.txt | 4 + dep/process/License.txt | 23 + dep/process/Readme.txt | 6 + dep/process/boost/process.hpp | 22 + dep/process/boost/process/all.hpp | 30 ++ dep/process/boost/process/child.hpp | 74 +++ dep/process/boost/process/config.hpp | 82 ++++ dep/process/boost/process/create_pipe.hpp | 48 ++ dep/process/boost/process/execute.hpp | 38 ++ dep/process/boost/process/executor.hpp | 176 ++++++++ dep/process/boost/process/initializers.hpp | 497 +++++++++++++++++++++ dep/process/boost/process/mitigate.hpp | 104 +++++ dep/process/boost/process/pipe.hpp | 64 +++ dep/process/boost/process/posix/child.hpp | 26 ++ dep/process/boost/process/posix/create_pipe.hpp | 40 ++ dep/process/boost/process/posix/execute.hpp | 82 ++++ dep/process/boost/process/posix/executor.hpp | 120 +++++ dep/process/boost/process/posix/initializers.hpp | 39 ++ .../boost/process/posix/initializers/bind_fd.hpp | 43 ++ .../process/posix/initializers/bind_stderr.hpp | 37 ++ .../process/posix/initializers/bind_stdin.hpp | 37 ++ .../process/posix/initializers/bind_stdout.hpp | 37 ++ .../boost/process/posix/initializers/close_fd.hpp | 35 ++ .../boost/process/posix/initializers/close_fds.hpp | 43 ++ .../process/posix/initializers/close_fds_if.hpp | 80 ++++ .../process/posix/initializers/close_stderr.hpp | 30 ++ .../process/posix/initializers/close_stdin.hpp | 30 ++ .../process/posix/initializers/close_stdout.hpp | 30 ++ .../process/posix/initializers/hide_console.hpp | 24 + .../process/posix/initializers/inherit_env.hpp | 36 ++ .../posix/initializers/initializer_base.hpp | 35 ++ .../posix/initializers/notify_io_service.hpp | 55 +++ .../process/posix/initializers/on_exec_error.hpp | 42 ++ .../process/posix/initializers/on_exec_setup.hpp | 42 ++ .../process/posix/initializers/on_fork_error.hpp | 42 ++ .../process/posix/initializers/on_fork_setup.hpp | 42 ++ .../process/posix/initializers/on_fork_success.hpp | 42 ++ .../boost/process/posix/initializers/run_exe.hpp | 59 +++ .../boost/process/posix/initializers/set_args.hpp | 57 +++ .../process/posix/initializers/set_cmd_line.hpp | 54 +++ .../boost/process/posix/initializers/set_env.hpp | 54 +++ .../process/posix/initializers/set_on_error.hpp | 95 ++++ .../process/posix/initializers/start_in_dir.hpp | 36 ++ .../process/posix/initializers/throw_on_error.hpp | 90 ++++ dep/process/boost/process/posix/pipe.hpp | 30 ++ dep/process/boost/process/posix/search_path.hpp | 53 +++ dep/process/boost/process/posix/shell_path.hpp | 32 ++ dep/process/boost/process/posix/terminate.hpp | 37 ++ dep/process/boost/process/posix/wait_for_exit.hpp | 52 +++ dep/process/boost/process/search_path.hpp | 51 +++ dep/process/boost/process/shell_path.hpp | 46 ++ dep/process/boost/process/terminate.hpp | 52 +++ dep/process/boost/process/wait_for_exit.hpp | 58 +++ dep/process/boost/process/windows/child.hpp | 55 +++ dep/process/boost/process/windows/create_pipe.hpp | 40 ++ dep/process/boost/process/windows/execute.hpp | 82 ++++ dep/process/boost/process/windows/executor.hpp | 130 ++++++ dep/process/boost/process/windows/initializers.hpp | 33 ++ .../process/windows/initializers/bind_stderr.hpp | 39 ++ .../process/windows/initializers/bind_stdin.hpp | 39 ++ .../process/windows/initializers/bind_stdout.hpp | 39 ++ .../process/windows/initializers/close_stderr.hpp | 31 ++ .../process/windows/initializers/close_stdin.hpp | 31 ++ .../process/windows/initializers/close_stdout.hpp | 31 ++ .../process/windows/initializers/hide_console.hpp | 31 ++ .../process/windows/initializers/inherit_env.hpp | 24 + .../windows/initializers/initializer_base.hpp | 29 ++ .../initializers/on_CreateProcess_error.hpp | 42 ++ .../initializers/on_CreateProcess_setup.hpp | 42 ++ .../initializers/on_CreateProcess_success.hpp | 42 ++ .../boost/process/windows/initializers/run_exe.hpp | 69 +++ .../process/windows/initializers/set_args.hpp | 87 ++++ .../process/windows/initializers/set_cmd_line.hpp | 68 +++ .../boost/process/windows/initializers/set_env.hpp | 88 ++++ .../process/windows/initializers/set_on_error.hpp | 36 ++ .../process/windows/initializers/show_window.hpp | 36 ++ .../process/windows/initializers/start_in_dir.hpp | 69 +++ .../windows/initializers/throw_on_error.hpp | 30 ++ dep/process/boost/process/windows/pipe.hpp | 32 ++ dep/process/boost/process/windows/search_path.hpp | 104 +++++ dep/process/boost/process/windows/shell_path.hpp | 50 +++ dep/process/boost/process/windows/terminate.hpp | 38 ++ .../boost/process/windows/wait_for_exit.hpp | 49 ++ revision.h.in.cmake | 3 + sql/base/auth_database.sql | 57 +++ sql/base/characters_database.sql | 55 +++ sql/base/dev/hotfixes_database.sql | 18 - sql/base/hotfixes_database.sql | 56 +++ sql/custom/auth/.gitignore | 1 + sql/custom/characters/.gitignore | 1 + sql/custom/hotfixes/.gitignore | 1 + sql/custom/world/.gitignore | 1 + sql/old/6.x/auth/CREATE_SUBDIRECTORIES_HERE | 0 sql/old/6.x/characters/CREATE_SUBDIRECTORIES_HERE | 0 sql/old/6.x/hotfixes/CREATE_SUBDIRECTORIES_HERE | 0 sql/old/6.x/world/CREATE_SUBDIRECTORIES_HERE | 0 sql/updates/auth/2015_03_20_00_auth.sql | 23 + sql/updates/auth/2015_03_20_01_auth.sql | 6 + sql/updates/auth/2015_03_20_02_auth.sql | 25 ++ .../characters/2015_03_20_00_characters.sql | 23 + .../characters/2015_03_20_01_characters.sql | 6 + .../characters/2015_03_20_02_characters.sql | 23 + sql/updates/hotfixes/2015_03_20_00_hotfixes.sql | 23 + sql/updates/hotfixes/2015_03_20_01_hotfixes.sql | 6 + sql/updates/hotfixes/2015_03_20_02_hotfixes.sql | 18 + sql/updates/world/2015_03_20_04_world.sql | 23 + sql/updates/world/2015_03_20_05_world.sql | 6 + sql/updates/world/2015_03_20_06_world.sql | 170 +++++++ src/server/bnetserver/CMakeLists.txt | 2 + src/server/bnetserver/Main.cpp | 30 +- src/server/bnetserver/bnetserver.conf.dist | 82 ++++ src/server/game/CMakeLists.txt | 1 + src/server/scripts/CMakeLists.txt | 1 + src/server/shared/CMakeLists.txt | 4 + src/server/shared/Database/DatabaseLoader.cpp | 193 ++++++++ src/server/shared/Database/DatabaseLoader.h | 72 +++ src/server/shared/Database/DatabaseWorkerPool.h | 91 ++-- src/server/shared/Database/MySQLConnection.cpp | 8 +- src/server/shared/Database/MySQLConnection.h | 5 +- src/server/shared/Updater/DBUpdater.cpp | 408 +++++++++++++++++ src/server/shared/Updater/DBUpdater.h | 79 ++++ src/server/shared/Updater/UpdateFetcher.cpp | 387 ++++++++++++++++ src/server/shared/Updater/UpdateFetcher.h | 128 ++++++ src/server/worldserver/CMakeLists.txt | 2 + src/server/worldserver/Main.cpp | 107 +---- src/server/worldserver/worldserver.conf.dist | 86 ++++ 129 files changed, 6734 insertions(+), 179 deletions(-) create mode 100644 dep/process/License.txt create mode 100644 dep/process/Readme.txt create mode 100644 dep/process/boost/process.hpp create mode 100644 dep/process/boost/process/all.hpp create mode 100644 dep/process/boost/process/child.hpp create mode 100644 dep/process/boost/process/config.hpp create mode 100644 dep/process/boost/process/create_pipe.hpp create mode 100644 dep/process/boost/process/execute.hpp create mode 100644 dep/process/boost/process/executor.hpp create mode 100644 dep/process/boost/process/initializers.hpp create mode 100644 dep/process/boost/process/mitigate.hpp create mode 100644 dep/process/boost/process/pipe.hpp create mode 100644 dep/process/boost/process/posix/child.hpp create mode 100644 dep/process/boost/process/posix/create_pipe.hpp create mode 100644 dep/process/boost/process/posix/execute.hpp create mode 100644 dep/process/boost/process/posix/executor.hpp create mode 100644 dep/process/boost/process/posix/initializers.hpp create mode 100644 dep/process/boost/process/posix/initializers/bind_fd.hpp create mode 100644 dep/process/boost/process/posix/initializers/bind_stderr.hpp create mode 100644 dep/process/boost/process/posix/initializers/bind_stdin.hpp create mode 100644 dep/process/boost/process/posix/initializers/bind_stdout.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_fd.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_fds.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_fds_if.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_stderr.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_stdin.hpp create mode 100644 dep/process/boost/process/posix/initializers/close_stdout.hpp create mode 100644 dep/process/boost/process/posix/initializers/hide_console.hpp create mode 100644 dep/process/boost/process/posix/initializers/inherit_env.hpp create mode 100644 dep/process/boost/process/posix/initializers/initializer_base.hpp create mode 100644 dep/process/boost/process/posix/initializers/notify_io_service.hpp create mode 100644 dep/process/boost/process/posix/initializers/on_exec_error.hpp create mode 100644 dep/process/boost/process/posix/initializers/on_exec_setup.hpp create mode 100644 dep/process/boost/process/posix/initializers/on_fork_error.hpp create mode 100644 dep/process/boost/process/posix/initializers/on_fork_setup.hpp create mode 100644 dep/process/boost/process/posix/initializers/on_fork_success.hpp create mode 100644 dep/process/boost/process/posix/initializers/run_exe.hpp create mode 100644 dep/process/boost/process/posix/initializers/set_args.hpp create mode 100644 dep/process/boost/process/posix/initializers/set_cmd_line.hpp create mode 100644 dep/process/boost/process/posix/initializers/set_env.hpp create mode 100644 dep/process/boost/process/posix/initializers/set_on_error.hpp create mode 100644 dep/process/boost/process/posix/initializers/start_in_dir.hpp create mode 100644 dep/process/boost/process/posix/initializers/throw_on_error.hpp create mode 100644 dep/process/boost/process/posix/pipe.hpp create mode 100644 dep/process/boost/process/posix/search_path.hpp create mode 100644 dep/process/boost/process/posix/shell_path.hpp create mode 100644 dep/process/boost/process/posix/terminate.hpp create mode 100644 dep/process/boost/process/posix/wait_for_exit.hpp create mode 100644 dep/process/boost/process/search_path.hpp create mode 100644 dep/process/boost/process/shell_path.hpp create mode 100644 dep/process/boost/process/terminate.hpp create mode 100644 dep/process/boost/process/wait_for_exit.hpp create mode 100644 dep/process/boost/process/windows/child.hpp create mode 100644 dep/process/boost/process/windows/create_pipe.hpp create mode 100644 dep/process/boost/process/windows/execute.hpp create mode 100644 dep/process/boost/process/windows/executor.hpp create mode 100644 dep/process/boost/process/windows/initializers.hpp create mode 100644 dep/process/boost/process/windows/initializers/bind_stderr.hpp create mode 100644 dep/process/boost/process/windows/initializers/bind_stdin.hpp create mode 100644 dep/process/boost/process/windows/initializers/bind_stdout.hpp create mode 100644 dep/process/boost/process/windows/initializers/close_stderr.hpp create mode 100644 dep/process/boost/process/windows/initializers/close_stdin.hpp create mode 100644 dep/process/boost/process/windows/initializers/close_stdout.hpp create mode 100644 dep/process/boost/process/windows/initializers/hide_console.hpp create mode 100644 dep/process/boost/process/windows/initializers/inherit_env.hpp create mode 100644 dep/process/boost/process/windows/initializers/initializer_base.hpp create mode 100644 dep/process/boost/process/windows/initializers/on_CreateProcess_error.hpp create mode 100644 dep/process/boost/process/windows/initializers/on_CreateProcess_setup.hpp create mode 100644 dep/process/boost/process/windows/initializers/on_CreateProcess_success.hpp create mode 100644 dep/process/boost/process/windows/initializers/run_exe.hpp create mode 100644 dep/process/boost/process/windows/initializers/set_args.hpp create mode 100644 dep/process/boost/process/windows/initializers/set_cmd_line.hpp create mode 100644 dep/process/boost/process/windows/initializers/set_env.hpp create mode 100644 dep/process/boost/process/windows/initializers/set_on_error.hpp create mode 100644 dep/process/boost/process/windows/initializers/show_window.hpp create mode 100644 dep/process/boost/process/windows/initializers/start_in_dir.hpp create mode 100644 dep/process/boost/process/windows/initializers/throw_on_error.hpp create mode 100644 dep/process/boost/process/windows/pipe.hpp create mode 100644 dep/process/boost/process/windows/search_path.hpp create mode 100644 dep/process/boost/process/windows/shell_path.hpp create mode 100644 dep/process/boost/process/windows/terminate.hpp create mode 100644 dep/process/boost/process/windows/wait_for_exit.hpp delete mode 100644 sql/base/dev/hotfixes_database.sql create mode 100644 sql/base/hotfixes_database.sql create mode 100644 sql/custom/auth/.gitignore create mode 100644 sql/custom/characters/.gitignore create mode 100644 sql/custom/hotfixes/.gitignore create mode 100644 sql/custom/world/.gitignore create mode 100644 sql/old/6.x/auth/CREATE_SUBDIRECTORIES_HERE create mode 100644 sql/old/6.x/characters/CREATE_SUBDIRECTORIES_HERE create mode 100644 sql/old/6.x/hotfixes/CREATE_SUBDIRECTORIES_HERE create mode 100644 sql/old/6.x/world/CREATE_SUBDIRECTORIES_HERE create mode 100644 sql/updates/auth/2015_03_20_00_auth.sql create mode 100644 sql/updates/auth/2015_03_20_01_auth.sql create mode 100644 sql/updates/auth/2015_03_20_02_auth.sql create mode 100644 sql/updates/characters/2015_03_20_00_characters.sql create mode 100644 sql/updates/characters/2015_03_20_01_characters.sql create mode 100644 sql/updates/characters/2015_03_20_02_characters.sql create mode 100644 sql/updates/hotfixes/2015_03_20_00_hotfixes.sql create mode 100644 sql/updates/hotfixes/2015_03_20_01_hotfixes.sql create mode 100644 sql/updates/hotfixes/2015_03_20_02_hotfixes.sql create mode 100644 sql/updates/world/2015_03_20_04_world.sql create mode 100644 sql/updates/world/2015_03_20_05_world.sql create mode 100644 sql/updates/world/2015_03_20_06_world.sql create mode 100644 src/server/shared/Database/DatabaseLoader.cpp create mode 100644 src/server/shared/Database/DatabaseLoader.h create mode 100644 src/server/shared/Updater/DBUpdater.cpp create mode 100644 src/server/shared/Updater/DBUpdater.h create mode 100644 src/server/shared/Updater/UpdateFetcher.cpp create mode 100644 src/server/shared/Updater/UpdateFetcher.h (limited to 'src/server/game') diff --git a/.travis.yml b/.travis.yml index cb3d09c671c..83e13961c31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_install: - sudo apt-get -qq update - sudo apt-get -qq install build-essential libtool gcc-4.8 g++-4.8 make cmake openssl - sudo apt-get -qq install libssl-dev libmysqlclient15-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev libzmq3-dev - - sudo apt-get -qq install libboost1.55-dev libboost-thread1.55-dev libboost-filesystem1.55-dev libboost-system1.55-dev libboost-program-options1.55-dev + - sudo apt-get -qq install libboost1.55-dev libboost-thread1.55-dev libboost-filesystem1.55-dev libboost-system1.55-dev libboost-program-options1.55-dev libboost-iostreams1.55-dev install: - mysql -uroot -e 'create database test_mysql;' @@ -26,7 +26,7 @@ script: - mysql -utrinity -ptrinity auth < sql/base/auth_database.sql - mysql -utrinity -ptrinity characters < sql/base/characters_database.sql - mysql -utrinity -ptrinity world < sql/base/dev/world_database.sql - - mysql -utrinity -ptrinity hotfixes < sql/base/dev/hotfixes_database.sql + - mysql -utrinity -ptrinity hotfixes < sql/base/hotfixes_database.sql - cat sql/updates/world/*.sql | mysql -utrinity -ptrinity world - cat sql/updates/hotfixes/*.sql | mysql -utrinity -ptrinity hotfixes - mysql -uroot < sql/create/drop_mysql.sql diff --git a/cmake/macros/ConfigureBoost.cmake b/cmake/macros/ConfigureBoost.cmake index 4147eeef2f5..190151af155 100644 --- a/cmake/macros/ConfigureBoost.cmake +++ b/cmake/macros/ConfigureBoost.cmake @@ -25,7 +25,7 @@ if(WIN32) add_definitions(-D_WIN32_WINNT=${ver}) endif() -find_package(Boost 1.49 REQUIRED system filesystem thread program_options) +find_package(Boost 1.49 REQUIRED system filesystem thread program_options iostreams) add_definitions(-DBOOST_DATE_TIME_NO_LIB) add_definitions(-DBOOST_REGEX_NO_LIB) add_definitions(-DBOOST_CHRONO_NO_LIB) @@ -35,7 +35,7 @@ add_definitions(-DBOOST_CHRONO_NO_LIB) include (CheckCXXSourceCompiles) set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR}) -set(CMAKE_REQUIRED_LIBRARIES ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) +set(CMAKE_REQUIRED_LIBRARIES ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_IOSTREAMS_LIBRARY}) set(CMAKE_REQUIRED_FLAGS "-std=c++11") unset(boost_filesystem_copy_links_without_NO_SCOPED_ENUM CACHE) check_cxx_source_compiles(" diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake index 990f4918d6a..6b00510ba42 100644 --- a/cmake/macros/FindMySQL.cmake +++ b/cmake/macros/FindMySQL.cmake @@ -5,6 +5,7 @@ # This module defines # MYSQL_INCLUDE_DIR, where to find mysql.h # MYSQL_LIBRARIES, the libraries to link against to connect to MySQL +# MYSQL_EXECUTABLE, the MySQL executable. # MYSQL_FOUND, if false, you cannot build anything that requires MySQL. # also defined, but not for general use are @@ -182,6 +183,65 @@ else( NOT WIN32 ) set( MYSQL_EXTRA_LIBRARIES "" ) endif( NOT WIN32 ) +if( UNIX ) + find_program(MYSQL_EXECUTABLE mysql + PATHS + ${MYSQL_CONFIG_PREFER_PATH} + /usr/local/mysql/bin/ + /usr/local/bin/ + /usr/bin/ + DOC + "path to your mysql binary." + ) +endif( UNIX ) + +if( WIN32 ) + find_program(MYSQL_EXECUTABLE mysql + PATHS + "C:/Program Files/MySQL/MySQL Server 5.6/bin" + "C:/Program Files/MySQL/MySQL Server 5.6/bin/opt" + "C:/Program Files/MySQL/MySQL Server 5.5/bin" + "C:/Program Files/MySQL/MySQL Server 5.5/bin/opt" + "C:/Program Files/MySQL/MySQL Server 5.1/bin" + "C:/Program Files/MySQL/MySQL Server 5.1/bin/opt" + "C:/Program Files/MySQL/MySQL Server 5.0/bin" + "C:/Program Files/MySQL/MySQL Server 5.0/bin/opt" + "C:/Program Files/MySQL/bin" + "C:/Program Files (x86)/MySQL/MySQL Server 5.6/bin" + "C:/Program Files (x86)/MySQL/MySQL Server 5.6/bin/opt" + "C:/Program Files (x86)/MySQL/MySQL Server 5.5/bin" + "C:/Program Files (x86)/MySQL/MySQL Server 5.5/bin/opt" + "C:/Program Files (x86)/MySQL/MySQL Server 5.1/bin" + "C:/Program Files (x86)/MySQL/MySQL Server 5.1/bin/opt" + "C:/Program Files (x86)/MySQL/MySQL Server 5.0/bin" + "C:/Program Files (x86)/MySQL/MySQL Server 5.0/bin/opt" + "C:/Program Files (x86)/MySQL/bin" + "C:/MySQL/bin/debug" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/bin/opt" + "$ENV{ProgramFiles}/MySQL/*/bin/opt" + "$ENV{SystemDrive}/MySQL/*/bin/opt" + "c:/msys/local/include" + "$ENV{MYSQL_ROOT}/bin" + DOC + "path to your mysql binary." + ) +endif( WIN32 ) + if( MYSQL_LIBRARY ) if( MYSQL_INCLUDE_DIR ) set( MYSQL_FOUND 1 ) @@ -190,7 +250,10 @@ if( MYSQL_LIBRARY ) else( MYSQL_INCLUDE_DIR ) message(FATAL_ERROR "Could not find MySQL headers! Please install the development libraries and headers") endif( MYSQL_INCLUDE_DIR ) - mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR ) + if( MYSQL_EXECUTABLE ) + message(STATUS "Found MySQL executable: ${MYSQL_EXECUTABLE}") + endif( MYSQL_EXECUTABLE ) + mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR MYSQL_EXECUTABLE) else( MYSQL_LIBRARY ) message(FATAL_ERROR "Could not find the MySQL libraries! Please install the development libraries and headers") endif( MYSQL_LIBRARY ) diff --git a/dep/PackageList.txt b/dep/PackageList.txt index 0bee1e14d92..2290a1980ec 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -4,6 +4,10 @@ Boost http://www.boost.org Version: 1.55 +Boost Process (Proposed for boost, but its not an official part of it yet. Used to start child processes.) + http://www.highscore.de/boost/process0.5/ + Version: 0.5 + bzip2 (a freely available, patent free, high-quality data compressor) http://www.bzip.org/ Version: 1.0.6 diff --git a/dep/process/License.txt b/dep/process/License.txt new file mode 100644 index 00000000000..36b7cd93cdf --- /dev/null +++ b/dep/process/License.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/dep/process/Readme.txt b/dep/process/Readme.txt new file mode 100644 index 00000000000..ada7cf74974 --- /dev/null +++ b/dep/process/Readme.txt @@ -0,0 +1,6 @@ +Boost.Process (Not part of the official boost libraries yet) +================================================================ +Its used to start child processes within the application. + +Website: http://www.highscore.de/boost/process0.5/ +Downloaded from: http://www.highscore.de/boost/process0.5/process.zip diff --git a/dep/process/boost/process.hpp b/dep/process/boost/process.hpp new file mode 100644 index 00000000000..2271e9b49e7 --- /dev/null +++ b/dep/process/boost/process.hpp @@ -0,0 +1,22 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011 Jeff Flinn, Boris Schaeling +// Copyright (c) 2012 Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process.hpp + * + * Convenience header which includes all public Boost.Process header files. + */ + +#ifndef BOOST_PROCESS_HPP +#define BOOST_PROCESS_HPP + +#include + +#endif diff --git a/dep/process/boost/process/all.hpp b/dep/process/boost/process/all.hpp new file mode 100644 index 00000000000..234dd05d4c1 --- /dev/null +++ b/dep/process/boost/process/all.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/all.hpp + * + * Convenience header which includes all public Boost.Process header files. + */ + +#ifndef BOOST_PROCESS_ALL_HPP +#define BOOST_PROCESS_ALL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/dep/process/boost/process/child.hpp b/dep/process/boost/process/child.hpp new file mode 100644 index 00000000000..ec129fc9367 --- /dev/null +++ b/dep/process/boost/process/child.hpp @@ -0,0 +1,74 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/child.hpp + * + * Defines a child process class. + */ + +#ifndef BOOST_PROCESS_CHILD_HPP +#define BOOST_PROCESS_CHILD_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(child) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(child) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Represents a child process. + * + * On Windows child is movable but non-copyable. The destructor + * automatically closes handles to the child process. + */ +struct child +{ + /** + * Process information. + * + * \remark Windows only. + */ + PROCESS_INFORMATION proc_info; + + /** + * Constructor. + * + * \remark Windows only. + */ + explicit child(const PROCESS_INFORMATION &pi) : proc_info(pi) {} + + /** + * Returns the process handle. + * + * \remark Windows only. + */ + HANDLE process_handle() const { return proc_info.hProcess; } + + /** + * Process identifier. + * + * \remark POSIX only. + */ + pid_t pid; + + /** + * Constructor. + * + * \remark POSIX only. + */ + explicit child(pid_t p) : pid(p) {} +}; + +}} +#endif + +#endif diff --git a/dep/process/boost/process/config.hpp b/dep/process/boost/process/config.hpp new file mode 100644 index 00000000000..7aae4d3ca4f --- /dev/null +++ b/dep/process/boost/process/config.hpp @@ -0,0 +1,82 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/config.hpp + * + * Defines various macros. + */ + +#ifndef BOOST_PROCESS_CONFIG_HPP +#define BOOST_PROCESS_CONFIG_HPP + +#include +#include +#include +#include + +#if defined(BOOST_POSIX_API) +# include +# define BOOST_PROCESS_LAST_ERROR errno +# define BOOST_PROCESS_PLATFORM posix +#elif defined(BOOST_WINDOWS_API) +# include +# define BOOST_PROCESS_LAST_ERROR GetLastError() +# define BOOST_PROCESS_PLATFORM windows +#endif + +/** \cond */ +#define BOOST_PROCESS_PLATFORM_PROMOTE_PATH(COMPONENT) \ + +#define BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(COMPONENT) \ + namespace boost { namespace process { using BOOST_PROCESS_PLATFORM::COMPONENT; }} +#define BOOST_PROCESS_PLATFORM_PROMOTE_INITIALIZERS_NAMESPACE \ + namespace boost { namespace process { namespace initializers { \ + using namespace boost::process::BOOST_PROCESS_PLATFORM::initializers; }}} +/** \endcond */ + +#if defined(BOOST_PROCESS_DOXYGEN) +/** + * \def BOOST_POSIX_API + * + * This macro is defined on POSIX. + */ +#define BOOST_POSIX_API +/** + * \def BOOST_WINDOWS_API + * + * This macro is defined on Windows. + */ +#define BOOST_WINDOWS_API +#endif + +/** + * \def BOOST_PROCESS_THROW(EX) + * + * Defines how exceptions are thrown. Set this macro for example + * to \c BOOST_THROW_EXCEPTION if you like to use Boost.Exception. + */ +#define BOOST_PROCESS_THROW(EX) throw EX + +/** \cond */ +#define BOOST_PROCESS_SOURCE_LOCATION \ + "in file '" __FILE__ "', line " BOOST_STRINGIZE(__LINE__) ": " + +#define BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR(what) \ + BOOST_PROCESS_THROW(boost::system::system_error( \ + boost::system::error_code(BOOST_PROCESS_LAST_ERROR, \ + boost::system::system_category()), \ + BOOST_PROCESS_SOURCE_LOCATION what)) + +#define BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec) \ + ec = boost::system::error_code(BOOST_PROCESS_LAST_ERROR, \ + boost::system::system_category()) +/** \endcond */ + +#endif diff --git a/dep/process/boost/process/create_pipe.hpp b/dep/process/boost/process/create_pipe.hpp new file mode 100644 index 00000000000..6c34ecf44b1 --- /dev/null +++ b/dep/process/boost/process/create_pipe.hpp @@ -0,0 +1,48 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/create_pipe.hpp + * + * Defines a function to create a pipe. + */ + +#ifndef BOOST_PROCESS_CREATE_PIPE_HPP +#define BOOST_PROCESS_CREATE_PIPE_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(create_pipe) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(create_pipe) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Creates an anonymous pipe. + * + * \note On Windows anonymous pipes don't support + * asynchronous I/O. + * + * \throws boost::system::system_error in case of an error + */ +pipe create_pipe(); + +/** + * Creates an anonymous pipe. + * + * \note On Windows anonymous pipes don't support + * asynchronous I/O. + */ +pipe create_pipe(boost::system::error_code &ec); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/execute.hpp b/dep/process/boost/process/execute.hpp new file mode 100644 index 00000000000..608831171e9 --- /dev/null +++ b/dep/process/boost/process/execute.hpp @@ -0,0 +1,38 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/execute.hpp + * + * Defines a function to execute a program. + */ + +#ifndef BOOST_PROCESS_EXECUTE_HPP +#define BOOST_PROCESS_EXECUTE_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(execute) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(execute) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Starts a program. + * + * \tparam initializers define what and how the program is started + */ +template +child execute(const Initializer &initializer, const Initializers... &initializers); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/executor.hpp b/dep/process/boost/process/executor.hpp new file mode 100644 index 00000000000..905d7f84cc7 --- /dev/null +++ b/dep/process/boost/process/executor.hpp @@ -0,0 +1,176 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/executor.hpp + * + * Defines an executor which can create child processes. + */ + +#ifndef BOOST_PROCESS_EXECUTOR_HPP +#define BOOST_PROCESS_EXECUTOR_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(executor) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(executor) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Starts a program. + * + * boost::process::executor is a functor which calls the system functions + * to start a program. Before system functions are called it iterates + * over initializers and calls a member function passing a reference + * to itself as a parameter. Initializers get then a chance to setup + * the executor. If system functions fail boost::process::executor again + * iterates over initializers and calls another member function passing a + * reference to itself as a parameter. This gives initializers a + * chance to handle the error. + * + * \note Library users shouldn't need to use boost::process::executor. + * It is recommended to call boost::process::execute which uses + * boost::pocess::executor internally. + */ +struct executor +{ + /** + * Default constructor. + */ + executor(); + + /** + * Starts a program. + * + * \tparam initializers define what and how the program is started + */ + template + child operator()(const Initializer &initializer, const Initializers... &initializers); + + ///\defgroup WindowsOnly Windows only. + ///@{ + + /** + * Program name. + * + * \remark Windows only. + */ + LPCTSTR exe; + + /** + * Command line. + * + * \remark Windows only. + */ + LPTSTR cmd_line; + + /** + * Process attributes. + * + * \remark Windows only. + */ + LPSECURITY_ATTRIBUTES proc_attrs; + + /** + * Thread attributes. + * + * \remark Windows only. + */ + LPSECURITY_ATTRIBUTES thread_attrs; + + /** + * Flag to inherit handles. + * + * \remark Windows only. + */ + BOOL inherit_handles; + + /** + * Creation flags. + * + * \remark Windows only. + */ + DWORD creation_flags; + + /** + * Environment variables. + * + * \remark Windows only. + */ + LPVOID env; + + /** + * Work directory. + * + * \remark Windows only. + */ + LPCTSTR work_dir; + + /** + * Startupinfo structure. + * + * \remark Windows only. + */ + STARTUPINFO startup_info; + + /** + * Startupinfoex structure. + * + * If this member variable is available, \c startup_info is a reference + * to \c StartupInfo in STARTUPINFOEX. + * + * \remark Windows Vista, Windows Server 2008 or better. + */ + STARTUPINFOEX startup_info_ex; + + /** + * Process information. + * + * \c proc_info contains the result after a child process + * could be started successfully. + * + * \remark Windows only. + */ + PROCESS_INFORMATION proc_info; + + ///@} + + ///\defgroup POSIXOnly POSIX only. + ///@{ + + /** + * Program name. + * + * \remark POSIX only. + */ + const char *exe; + + /** + * Command line arguments. + * + * \remark POSIX only. + */ + char **cmd_line; + + /** + * Environment variables. + * + * \remark POSIX only. + */ + char **env; + + ///@} +}; + +}} +#endif + +#endif diff --git a/dep/process/boost/process/initializers.hpp b/dep/process/boost/process/initializers.hpp new file mode 100644 index 00000000000..c7175d1425d --- /dev/null +++ b/dep/process/boost/process/initializers.hpp @@ -0,0 +1,497 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/initializers.hpp + * + * Defines initializers. + */ + +#ifndef BOOST_PROCESS_INITIALIZERS_HPP +#define BOOST_PROCESS_INITIALIZERS_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(initializers) +BOOST_PROCESS_PLATFORM_PROMOTE_INITIALIZERS_NAMESPACE + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { namespace initializers { + +/** + * Binds the standard error stream. + */ +class bind_stderr : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink); +}; + +/** + * Binds the standard input stream. + */ +class bind_stdin : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit bind_stdin(const boost::iostreams::file_descriptor_source &source); +}; + +/** + * Binds the standard output stream. + */ +class bind_stdout : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink); +}; + +/** + * Binds a file descriptor. + * + * \remark POSIX only. + */ +class bind_fd : public initializer_base +{ +public: + /** + * Constructor. + */ + bind_fd(int id, const boost::iostreams::file_descriptor &fd); +}; + +/** + * Closes a file descriptor. + * + * \remark POSIX only. + */ +class close_fd : public initializer_base +{ + /** + * Constructor. + */ + explicit close_fd(int fd); +}; + +/** + * Closes file descriptors. + * + * \remark POSIX only. + */ +class close_fds : public initializer_base +{ +public: + /** + * Constructor. + * + * \c range_type must be an int-range. + */ + explicit close_fds(const range_type &fds); +}; + +/** + * Closes all file descriptors a predicate returns + * true for. + * + * This initializer doesn't close file descriptors + * immediately. Instead it sets the \c FD_CLOEXEC + * flag. File descriptors are closed when \c execve + * is called and the call succeeds. + * + * \remark POSIX only. + */ +class close_fds_if : public initializer_base +{ +public: + /** + * Constructor. + * + * \c predicate_type must be a function or functor with + * this signature: bool(int) + */ + explicit close_fds_if(const predicate_type &pred); +}; + +/** + * Closes the standard error stream. + */ +class close_stderr : public initializer_base +{ + /** + * Constructor. + */ + close_stderr(); +}; + +/** + * Closes the standard input stream. + */ +class close_stdin : public initializer_base +{ + /** + * Constructor. + */ + close_stdin(); +}; + +/** + * Closes the standard output stream. + */ +class close_stdout : public initializer_base +{ + /** + * Constructor. + */ + close_stdout(); +}; + +/** + * Hides the console. + */ +class hide_console : public initializer_base +{ +public: + /** + * Constructor. + */ + hide_console(); +}; + +/** + * Inherits environment variables. + */ +class inherit_env : public initializer_base +{ +public: + /** + * Constructor. + */ + inherit_env(); +}; + +/** + * Notifies an I/O service object of fork-related events. + * + * \see boost::asio::io_service::notify_fork + * + * \remark POSIX only. + */ +class notify_io_service : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit notify_io_service(boost::asio::io_service &io_service); +}; + +/** + * Generic initializer to execute any code if \c execve + * failed. + * + * \remark POSIX only. + */ +class on_exec_error : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_exec_error(handler_type handler); +}; + +/** + * Generic initializer to execute any code before \c execve + * is called. + * + * \remark POSIX only. + */ +class on_exec_setup : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_exec_setup(handler_type handler); +}; + +/** + * Generic initializer to execute any code if \c fork + * failed. + * + * \remark POSIX only. + */ +class on_fork_error : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_fork_error(handler_type handler); +}; + +/** + * Generic initializer to execute any code before \c fork + * is called. + * + * \remark POSIX only. + */ +class on_fork_setup : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_fork_setup(handler_type handler); +}; + +/** + * Generic initializer to execute any code in the parent + * process after \c fork has been called successfully. + * + * \remark POSIX only. + */ +class on_fork_success : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_fork_success(handler_type handler); +}; + +/** + * Generic initializer to execute any code if \c CreateProcess + * failed. + * + * \remark Windows only. + */ +class on_CreateProcess_error : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_CreateProcess_error(handler_type handler); +}; + +/** + * Generic initializer to execute any code before \c CreateProcess + * is called. + * + * \remark Windows only. + */ +class on_CreateProcess_setup : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_CreateProcess_setup(handler_type handler); +}; + +/** + * Generic initializer to execute any code after \c CreateProcess + * has been called successfully. + * + * \remark Windows only. + */ +class on_CreateProcess_success : public initializer_base +{ +public: + /** + * Constructor. + * + * \c handler_type must be a function or functor with + * this signature: void(executor&) + */ + explicit on_CreateProcess_success(handler_type handler); +}; + +/** + * Specifies the executable to start. + * + * This initializer must always be used. The only exception is + * if you use \c set_args or a generic initializer which + * specifies the executable. + */ +class run_exe : public initializer_base +{ +public: + /** + * Constructor. + * + * On Windows \c string_type must be const char*, + * std::string or boost::filesystem::path. + * If Unicode is used, \c string_type must be + * const wchar_t*, std::wstring or + * boost::filesystem::path. + * + * On POSIX \c string_type must be const char*, + * std::string or boost::filesystem::path. + */ + explicit run_exe(const string_type &s); +}; + +/** + * Sets the command line arguments. + * + * The first argument specifies the executable to start unless + * \c run_exe is used. + * + * Use \c set_cmd_line if you don't want to pass a collection of + * command line arguments but set the command line as one string. + */ +class set_args : public initializer_base +{ +public: + /** + * Constructor. + * + * On Windows \c range_type must be a std::string-range. + * If Unicode is used, \c range_type must be a + * std::wstring-range. + * + * On POSIX \c range_type must be a std::string-range. + */ + explicit set_args(const range_type &r); +}; + +/** + * Sets the command line. + * + * Use \c set_args if you don't want to set the command line as + * one string but pass a collection of command line arguments. + */ +class set_cmd_line : public initializer_base +{ +public: + /** + * Constructor. + * + * On Windows \c string_type must be const char*, + * std::string or boost::filesystem::path. + * If Unicode is used, \c string_type must be + * const wchar_t*, std::wstring or + * boost::filesystem::path. + * + * On POSIX \c string_type must be const char*, + * std::string or boost::filesystem::path. + */ + explicit set_cmd_line(const string_type &s); +}; + +/** + * Sets the environment. + */ +class set_env : public initializer_base +{ +public: + /** + * Constructor. + * + * On Windows \c range_type must be a std::string-range. + * If Unicode is used, \c range_type must be a + * std::wstring-range. + * + * On POSIX \c range_type must be a std::string-range. + */ + explicit set_env(const range_type &r); +}; + +/** + * Sets an error if a child process can't be created. + */ +class set_on_error : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit set_on_error(boost::system::error_code &ec); +}; + +/** + * Sets the flag \c wShowWindow in \c STARTUPINFO. + * + * \remark Windows only. + */ +class show_window : public initializer_base +{ +public: + /** + * Constructor. + */ + explicit show_window(WORD flags); +}; + +/** + * Sets the work directory. + */ +class start_in_dir : public initializer_base +{ +public: + /** + * Constructor. + * + * On Windows \c string_type must be const char*, + * std::string or boost::filesystem::path. + * If Unicode is used, \c string_type must be + * const wchar_t*, std::wstring or + * boost::filesystem::path. + * + * On POSIX \c string_type must be const char*, + * std::string or boost::filesystem::path. + */ + explicit start_in_dir(const string_type &s); +}; + +/** + * Throws an error if a child process can't be created. + * + * The type of the error thrown is \c boost::system::system_error. + */ +class throw_on_error : public initializer_base +{ +public: +}; + +}}} +#endif + +#endif diff --git a/dep/process/boost/process/mitigate.hpp b/dep/process/boost/process/mitigate.hpp new file mode 100644 index 00000000000..6838984aa1a --- /dev/null +++ b/dep/process/boost/process/mitigate.hpp @@ -0,0 +1,104 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/mitigate.hpp + * + * Helpers to mitigate platform differences. + */ + +#ifndef BOOST_PROCESS_MITIGATE_HPP +#define BOOST_PROCESS_MITIGATE_HPP + +#include +#if defined(BOOST_POSIX_API) +# include +#endif + +namespace boost { namespace process { + +#if defined(BOOST_WINDOWS_API) +typedef boost::asio::windows::stream_handle pipe_end; +#elif defined(BOOST_POSIX_API) +typedef boost::asio::posix::stream_descriptor pipe_end; +#endif + +inline const char *zero_device() +{ +#if defined(BOOST_WINDOWS_API) + return "NUL"; +#elif defined(BOOST_POSIX_API) + return "/dev/zero"; +#endif +} + +inline const char *null_device() +{ +#if defined(BOOST_WINDOWS_API) + return "NUL"; +#elif defined(BOOST_POSIX_API) + return "/dev/null"; +#endif +} + +#if defined(BOOST_WINDOWS_API) +# define BOOST_PROCESS_EXITSTATUS(a) static_cast(a) +#elif defined(BOOST_POSIX_API) +# define BOOST_PROCESS_EXITSTATUS WEXITSTATUS +#endif + +#if defined(BOOST_PROCESS_DOXYGEN) +/** + * Type definition for the end of a pipe. + * + * On Windows the type is based on boost::asio::windows::stream_handle. On + * POSIX it is based on boost::asio::posix::stream_descriptor. + * + * You can use this type definition for asynchronous I/O with streams of + * child processes. + */ +typedef boost_asio_type pipe_end; + +/** + * Gets the name of the zero device. + * + * You can use zero_device to initialize a + * boost::iostreams::file_descriptor_source to read + * null characters from. + * + * \returns NUL on Windows and /dev/zero on POSIX. + */ +const char *zero_device(); + +/** + * Gets the name of the null device. + * + * You can use null_device to initialize a + * boost::iostreams::file_descriptor_sink which discards + * data written to it. + * + * \returns NUL on Windows and /dev/null on POSIX. + */ +const char *null_device(); + +/** + * \def BOOST_PROCESS_EXITSTATUS + * + * On Windows \c BOOST_PROCESS_EXITSTATUS is a static cast to \c int. + * On POSIX it is set to \c WEXITSTATUS. + * + * You can use \c BOOST_PROCESS_EXITSTATUS for the return value of + * boost::process::wait_for_exit to get the exit status of a process. + */ +#define BOOST_PROCESS_EXITSTATUS +#endif + +}} + +#endif diff --git a/dep/process/boost/process/pipe.hpp b/dep/process/boost/process/pipe.hpp new file mode 100644 index 00000000000..35f2a4470d6 --- /dev/null +++ b/dep/process/boost/process/pipe.hpp @@ -0,0 +1,64 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/pipe.hpp + * + * Defines a pipe. + */ + +#ifndef BOOST_PROCESS_PIPE_HPP +#define BOOST_PROCESS_PIPE_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(pipe) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(pipe) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(make_pipe) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Represents a pipe. + */ +struct pipe +{ + /** + * Read-end. + */ + pipe_end_type source; + + /** + * Write-end. + */ + pipe_end_type sink; + + /** + * Constructor. + */ + pipe(pipe_end_type source, pipe_end_type sink); +}; + +/** + * Returns a pipe instance. + * + * This is a helper function to instantiate boost::process::pipe. + * + * \note boost::process::make_pipe does not create a pipe. + * You must pass existing pipe ends to this function. + * If you want to create an anonymous pipe, call + * boost::process::create_pipe. + */ +pipe make_pipe(pipe_end_type source, pipe_end_type sink); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/posix/child.hpp b/dep/process/boost/process/posix/child.hpp new file mode 100644 index 00000000000..913484529e8 --- /dev/null +++ b/dep/process/boost/process/posix/child.hpp @@ -0,0 +1,26 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_CHILD_HPP +#define BOOST_PROCESS_POSIX_CHILD_HPP + +#include + +namespace boost { namespace process { namespace posix { + +struct child +{ + pid_t pid; + + explicit child(pid_t p) : pid(p) {} +}; + +}}} + +#endif diff --git a/dep/process/boost/process/posix/create_pipe.hpp b/dep/process/boost/process/posix/create_pipe.hpp new file mode 100644 index 00000000000..ecdd523516f --- /dev/null +++ b/dep/process/boost/process/posix/create_pipe.hpp @@ -0,0 +1,40 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_CREATE_PIPE_HPP +#define BOOST_PROCESS_POSIX_CREATE_PIPE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +inline pipe create_pipe() +{ + int fds[2]; + if (::pipe(fds) == -1) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("pipe(2) failed"); + return pipe(fds[0], fds[1]); +} + +inline pipe create_pipe(boost::system::error_code &ec) +{ + int fds[2]; + if (::pipe(fds) == -1) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); + return pipe(fds[0], fds[1]); +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/execute.hpp b/dep/process/boost/process/posix/execute.hpp new file mode 100644 index 00000000000..27082196c8a --- /dev/null +++ b/dep/process/boost/process/posix/execute.hpp @@ -0,0 +1,82 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_EXECUTE_HPP +#define BOOST_PROCESS_POSIX_EXECUTE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +template +child execute(const I0 &i0) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0))); +} + +template +child execute(const I0 &i0, const I1 &i1) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9))); +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/executor.hpp b/dep/process/boost/process/posix/executor.hpp new file mode 100644 index 00000000000..a3e81f128f5 --- /dev/null +++ b/dep/process/boost/process/posix/executor.hpp @@ -0,0 +1,120 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_EXECUTOR_HPP +#define BOOST_PROCESS_POSIX_EXECUTOR_HPP + +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +struct executor +{ + executor() : exe(0), cmd_line(0), env(0) {} + + struct call_on_fork_setup + { + executor &e_; + + call_on_fork_setup(executor &e) : e_(e) {} + + template + void operator()(const Arg &arg) const + { + arg.on_fork_setup(e_); + } + }; + + struct call_on_fork_error + { + executor &e_; + + call_on_fork_error(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_fork_error(e_); + } + }; + + struct call_on_fork_success + { + executor &e_; + + call_on_fork_success(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_fork_success(e_); + } + }; + + struct call_on_exec_setup + { + executor &e_; + + call_on_exec_setup(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_exec_setup(e_); + } + }; + + struct call_on_exec_error + { + executor &e_; + + call_on_exec_error(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_exec_error(e_); + } + }; + + template + child operator()(const InitializerSequence &seq) + { + boost::fusion::for_each(seq, call_on_fork_setup(*this)); + + pid_t pid = ::fork(); + if (pid == -1) + { + boost::fusion::for_each(seq, call_on_fork_error(*this)); + } + else if (pid == 0) + { + boost::fusion::for_each(seq, call_on_exec_setup(*this)); + ::execve(exe, cmd_line, env); + boost::fusion::for_each(seq, call_on_exec_error(*this)); + _exit(EXIT_FAILURE); + } + + boost::fusion::for_each(seq, call_on_fork_success(*this)); + + return child(pid); + } + + const char *exe; + char **cmd_line; + char **env; +}; + +}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers.hpp b/dep/process/boost/process/posix/initializers.hpp new file mode 100644 index 00000000000..78295c14cb6 --- /dev/null +++ b/dep/process/boost/process/posix/initializers.hpp @@ -0,0 +1,39 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/dep/process/boost/process/posix/initializers/bind_fd.hpp b/dep/process/boost/process/posix/initializers/bind_fd.hpp new file mode 100644 index 00000000000..851b7ef3e44 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/bind_fd.hpp @@ -0,0 +1,43 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_FD_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_FD_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class bind_fd_ : public initializer_base +{ +public: + bind_fd_(int id, const FileDescriptor &fd) : id_(id), fd_(fd) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::dup2(fd_.handle(), id_); + } + +private: + int id_; + FileDescriptor fd_; +}; + +template +bind_fd_ bind_fd(int id, const FileDescriptor &fd) +{ + return bind_fd_(id, fd); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/bind_stderr.hpp b/dep/process/boost/process/posix/initializers/bind_stderr.hpp new file mode 100644 index 00000000000..be767bf2fe1 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/bind_stderr.hpp @@ -0,0 +1,37 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDERR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDERR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class bind_stderr : public initializer_base +{ +public: + explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink) + : sink_(sink) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::dup2(sink_.handle(), STDERR_FILENO); + } + +private: + boost::iostreams::file_descriptor_sink sink_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/bind_stdin.hpp b/dep/process/boost/process/posix/initializers/bind_stdin.hpp new file mode 100644 index 00000000000..b592d6f8b38 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/bind_stdin.hpp @@ -0,0 +1,37 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDIN_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDIN_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class bind_stdin : public initializer_base +{ +public: + explicit bind_stdin(const boost::iostreams::file_descriptor_source &source) + : source_(source) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::dup2(source_.handle(), STDIN_FILENO); + } + +private: + boost::iostreams::file_descriptor_source source_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/bind_stdout.hpp b/dep/process/boost/process/posix/initializers/bind_stdout.hpp new file mode 100644 index 00000000000..a2c316d9972 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/bind_stdout.hpp @@ -0,0 +1,37 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDOUT_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDOUT_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class bind_stdout : public initializer_base +{ +public: + explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink) + : sink_(sink) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::dup2(sink_.handle(), STDOUT_FILENO); + } + +private: + boost::iostreams::file_descriptor_sink sink_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_fd.hpp b/dep/process/boost/process/posix/initializers/close_fd.hpp new file mode 100644 index 00000000000..fd516e41005 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_fd.hpp @@ -0,0 +1,35 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FD_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FD_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class close_fd : public initializer_base +{ +public: + explicit close_fd(int fd) : fd_(fd) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::close(fd_); + } + +private: + int fd_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_fds.hpp b/dep/process/boost/process/posix/initializers/close_fds.hpp new file mode 100644 index 00000000000..2fa338501eb --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_fds.hpp @@ -0,0 +1,43 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class close_fds_ : public initializer_base +{ +public: + explicit close_fds_(const Range &fds) : fds_(fds) {} + + template + void on_exec_setup(PosixExecutor&) const + { + boost::for_each(fds_, ::close); + } + +private: + Range fds_; +}; + +template +close_fds_ close_fds(const Range &fds) +{ + return close_fds_(fds); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_fds_if.hpp b/dep/process/boost/process/posix/initializers/close_fds_if.hpp new file mode 100644 index 00000000000..fb3a651d628 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_fds_if.hpp @@ -0,0 +1,80 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_IF_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_IF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef BOOST_PROCESS_POSIX_MAX_FD +# define BOOST_PROCESS_POSIX_MAX_FD 32 +#endif + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class close_fds_if_ : public initializer_base +{ +private: + static void close(int fd) + { + ::fcntl(fd, F_SETFD, FD_CLOEXEC); + } + +public: + explicit close_fds_if_(const Predicate &pred) : pred_(pred) {} + + template + void on_exec_setup(PosixExecutor&) const + { + boost::for_each( + boost::adaptors::filter( + boost::counting_range(0, upper_bound()), + pred_ + ), + close + ); + } + +private: + static int upper_bound() + { + int up; +#if defined(F_MAXFD) + do + { + up = ::fcntl(0, F_MAXFD); + } while (up == -1 && errno == EINTR); + if (up == -1) +#endif + up = ::sysconf(_SC_OPEN_MAX); + if (up == -1) + up = BOOST_PROCESS_POSIX_MAX_FD; + return up; + } + + Predicate pred_; +}; + +template +close_fds_if_ close_fds_if(const Predicate &pred) +{ + return close_fds_if_(pred); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_stderr.hpp b/dep/process/boost/process/posix/initializers/close_stderr.hpp new file mode 100644 index 00000000000..1a4c2ad00df --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_stderr.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDERR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDERR_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class close_stderr : public initializer_base +{ +public: + template + void on_exec_setup(PosixExecutor&) const + { + ::close(STDERR_FILENO); + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_stdin.hpp b/dep/process/boost/process/posix/initializers/close_stdin.hpp new file mode 100644 index 00000000000..021c3ec54df --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_stdin.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDIN_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDIN_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class close_stdin : public initializer_base +{ +public: + template + void on_exec_setup(PosixExecutor&) const + { + ::close(STDIN_FILENO); + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/close_stdout.hpp b/dep/process/boost/process/posix/initializers/close_stdout.hpp new file mode 100644 index 00000000000..cfab7d1d62f --- /dev/null +++ b/dep/process/boost/process/posix/initializers/close_stdout.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDOUT_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDOUT_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class close_stdout : public initializer_base +{ +public: + template + void on_exec_setup(PosixExecutor&) const + { + ::close(STDOUT_FILENO); + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/hide_console.hpp b/dep/process/boost/process/posix/initializers/hide_console.hpp new file mode 100644 index 00000000000..20d527b457f --- /dev/null +++ b/dep/process/boost/process/posix/initializers/hide_console.hpp @@ -0,0 +1,24 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_HIDE_CONSOLE_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_HIDE_CONSOLE_HPP + +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class hide_console : public initializer_base +{ +public: +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/inherit_env.hpp b/dep/process/boost/process/posix/initializers/inherit_env.hpp new file mode 100644 index 00000000000..bc73c8571f8 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/inherit_env.hpp @@ -0,0 +1,36 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_INHERIT_ENV_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_INHERIT_ENV_HPP + +#include +// From +#if defined(__APPLE__) && defined(__DYNAMIC__) +extern "C" { extern char ***_NSGetEnviron(void); } +# define environ (*_NSGetEnviron()) +#else +# include +#endif + +namespace boost { namespace process { namespace posix { namespace initializers { + +class inherit_env : public initializer_base +{ +public: + template + void on_fork_setup(PosixExecutor &e) const + { + e.env = environ; + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/initializer_base.hpp b/dep/process/boost/process/posix/initializers/initializer_base.hpp new file mode 100644 index 00000000000..775f00e48ce --- /dev/null +++ b/dep/process/boost/process/posix/initializers/initializer_base.hpp @@ -0,0 +1,35 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_INITIALIZER_BASE_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_INITIALIZER_BASE_HPP + +namespace boost { namespace process { namespace posix { namespace initializers { + +struct initializer_base +{ + template + void on_fork_setup(PosixExecutor&) const {} + + template + void on_fork_error(PosixExecutor&) const {} + + template + void on_fork_success(PosixExecutor&) const {} + + template + void on_exec_setup(PosixExecutor&) const {} + + template + void on_exec_error(PosixExecutor&) const {} +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/notify_io_service.hpp b/dep/process/boost/process/posix/initializers/notify_io_service.hpp new file mode 100644 index 00000000000..d94f674c81a --- /dev/null +++ b/dep/process/boost/process/posix/initializers/notify_io_service.hpp @@ -0,0 +1,55 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_NOTIFY_IO_SERVICE_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_NOTIFY_IO_SERVICE_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class notify_io_service_ : public initializer_base +{ +public: + explicit notify_io_service_(IOService &io_service) : + io_service_(io_service) {} + + template + void on_fork_setup(PosixExecutor&) const + { + io_service_.notify_fork(IOService::fork_prepare); + } + + template + void on_fork_success(PosixExecutor&) const + { + io_service_.notify_fork(IOService::fork_parent); + } + + template + void on_exec_setup(PosixExecutor&) const + { + io_service_.notify_fork(IOService::fork_child); + } + +private: + IOService &io_service_; +}; + +template +notify_io_service_ notify_io_service(IOService &io_service) +{ + return notify_io_service_(io_service); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/on_exec_error.hpp b/dep/process/boost/process/posix/initializers/on_exec_error.hpp new file mode 100644 index 00000000000..63b56def4f2 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/on_exec_error.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_ERROR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_ERROR_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class on_exec_error_ : public initializer_base +{ +public: + explicit on_exec_error_(Handler handler) : handler_(handler) {} + + template + void on_exec_error(PosixExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_exec_error_ on_exec_error(Handler handler) +{ + return on_exec_error_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/on_exec_setup.hpp b/dep/process/boost/process/posix/initializers/on_exec_setup.hpp new file mode 100644 index 00000000000..50f5f3736b1 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/on_exec_setup.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_SETUP_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_SETUP_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class on_exec_setup_ : public initializer_base +{ +public: + explicit on_exec_setup_(Handler handler) : handler_(handler) {} + + template + void on_exec_setup(PosixExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_exec_setup_ on_exec_setup(Handler handler) +{ + return on_exec_setup_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/on_fork_error.hpp b/dep/process/boost/process/posix/initializers/on_fork_error.hpp new file mode 100644 index 00000000000..42ecf1aac91 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/on_fork_error.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_ERROR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_ERROR_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class on_fork_error_ : public initializer_base +{ +public: + explicit on_fork_error_(Handler handler) : handler_(handler) {} + + template + void on_fork_error(PosixExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_fork_error_ on_fork_error(Handler handler) +{ + return on_fork_error_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/on_fork_setup.hpp b/dep/process/boost/process/posix/initializers/on_fork_setup.hpp new file mode 100644 index 00000000000..c0c5b0682f2 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/on_fork_setup.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SETUP_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SETUP_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class on_fork_setup_ : public initializer_base +{ +public: + explicit on_fork_setup_(Handler handler) : handler_(handler) {} + + template + void on_fork_setup(PosixExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_fork_setup_ on_fork_setup(Handler handler) +{ + return on_fork_setup_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/on_fork_success.hpp b/dep/process/boost/process/posix/initializers/on_fork_success.hpp new file mode 100644 index 00000000000..01c9b12db06 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/on_fork_success.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SUCCESS_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SUCCESS_HPP + +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class on_fork_success_ : public initializer_base +{ +public: + explicit on_fork_success_(Handler handler) : handler_(handler) {} + + template + void on_fork_success(PosixExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_fork_success_ on_fork_success(Handler handler) +{ + return on_fork_success_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/run_exe.hpp b/dep/process/boost/process/posix/initializers/run_exe.hpp new file mode 100644 index 00000000000..6cceeea8c15 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/run_exe.hpp @@ -0,0 +1,59 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_RUN_EXE_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_RUN_EXE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class run_exe_ : public initializer_base +{ +public: + explicit run_exe_(const std::string &s) : s_(s), cmd_line_(new char*[2]) + { + cmd_line_[0] = const_cast(s_.c_str()); + cmd_line_[1] = 0; + } + + template + void on_exec_setup(PosixExecutor &e) const + { + e.exe = s_.c_str(); + if (!e.cmd_line) + e.cmd_line = cmd_line_.get(); + } + +private: + std::string s_; + boost::shared_array cmd_line_; +}; + +inline run_exe_ run_exe(const char *s) +{ + return run_exe_(s); +} + +inline run_exe_ run_exe(const std::string &s) +{ + return run_exe_(s); +} + +inline run_exe_ run_exe(const boost::filesystem::path &p) +{ + return run_exe_(p.string()); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/set_args.hpp b/dep/process/boost/process/posix/initializers/set_args.hpp new file mode 100644 index 00000000000..294926dc222 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/set_args.hpp @@ -0,0 +1,57 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ARGS_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ARGS_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class set_args_ : public initializer_base +{ +private: + static char *c_str(const std::string &s) + { + return const_cast(s.c_str()); + } + +public: + explicit set_args_(const Range &args) + { + args_.reset(new char*[args.size() + 1]); + boost::transform(args, args_.get(), c_str); + args_[args.size()] = 0; + } + + template + void on_exec_setup(PosixExecutor &e) const + { + e.cmd_line = args_.get(); + if (!e.exe && *args_[0]) + e.exe = args_[0]; + } + +private: + boost::shared_array args_; +}; + +template +set_args_ set_args(const Range &range) +{ + return set_args_(range); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/set_cmd_line.hpp b/dep/process/boost/process/posix/initializers/set_cmd_line.hpp new file mode 100644 index 00000000000..0f59d253594 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/set_cmd_line.hpp @@ -0,0 +1,54 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_CMD_LINE_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_CMD_LINE_HPP + +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class set_cmd_line : public initializer_base +{ +private: + static char *c_str(const std::string &s) + { + return const_cast(s.c_str()); + } + +public: + explicit set_cmd_line(const std::string &s) + { + typedef boost::tokenizer > tokenizer; + boost::escaped_list_separator sep('\\', ' ', '\"'); + tokenizer tok(s, sep); + args_.assign(tok.begin(), tok.end()); + cmd_line_.reset(new char*[args_.size() + 1]); + boost::transform(args_, cmd_line_.get(), c_str); + cmd_line_[args_.size()] = 0; + } + + template + void on_exec_setup(PosixExecutor &e) const + { + e.cmd_line = cmd_line_.get(); + } + +private: + std::vector args_; + boost::shared_array cmd_line_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/set_env.hpp b/dep/process/boost/process/posix/initializers/set_env.hpp new file mode 100644 index 00000000000..76649184f34 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/set_env.hpp @@ -0,0 +1,54 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ENV_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ENV_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +template +class set_env_ : public initializer_base +{ +private: + static char *get_ptr(const std::string &s) + { + return const_cast(s.c_str()); + } + +public: + explicit set_env_(const Range &envs) : env_(new char*[envs.size() + 1]) + { + boost::transform(envs, env_.get(), get_ptr); + env_[envs.size()] = 0; + } + + template + void on_fork_setup(PosixExecutor &e) const + { + e.env = env_.get(); + } + +private: + boost::shared_array env_; +}; + +template +set_env_ set_env(const Range &envs) +{ + return set_env_(envs); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/set_on_error.hpp b/dep/process/boost/process/posix/initializers/set_on_error.hpp new file mode 100644 index 00000000000..c01a816e603 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/set_on_error.hpp @@ -0,0 +1,95 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ON_ERROR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ON_ERROR_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class set_on_error : public initializer_base +{ +public: + explicit set_on_error(boost::system::error_code &ec) : ec_(ec) {} + + template + void on_fork_setup(PosixExecutor&) const + { + if (::pipe(fds_) == -1) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_); + if (::fcntl(fds_[1], F_SETFD, FD_CLOEXEC) == -1) + { + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_); + ::close(fds_[0]); + ::close(fds_[1]); + } + } + + template + void on_fork_error(PosixExecutor&) const + { + if (!ec_) + { + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_); + ::close(fds_[0]); + ::close(fds_[1]); + } + } + + template + void on_fork_success(PosixExecutor&) const + { + if (!ec_) + { + ::close(fds_[1]); + int code; + if (::read(fds_[0], &code, sizeof(int)) > 0) + { + ec_ = boost::system::error_code(code, + boost::system::system_category()); + } + ::close(fds_[0]); + } + } + + template + void on_exec_setup(PosixExecutor&) const + { + if (!ec_) + { + ::close(fds_[0]); + } + } + + template + void on_exec_error(PosixExecutor&) const + { + if (!ec_) + { + int e = errno; + while (::write(fds_[1], &e, sizeof(int)) == -1 && errno == EINTR) + ; + ::close(fds_[1]); + } + } + +private: + boost::system::error_code &ec_; + mutable int fds_[2]; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/start_in_dir.hpp b/dep/process/boost/process/posix/initializers/start_in_dir.hpp new file mode 100644 index 00000000000..187b5a31f44 --- /dev/null +++ b/dep/process/boost/process/posix/initializers/start_in_dir.hpp @@ -0,0 +1,36 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_START_IN_DIR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_START_IN_DIR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class start_in_dir : public initializer_base +{ +public: + explicit start_in_dir(const std::string &s) : s_(s) {} + + template + void on_exec_setup(PosixExecutor&) const + { + ::chdir(s_.c_str()); + } + +private: + std::string s_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/initializers/throw_on_error.hpp b/dep/process/boost/process/posix/initializers/throw_on_error.hpp new file mode 100644 index 00000000000..7734c19e30b --- /dev/null +++ b/dep/process/boost/process/posix/initializers/throw_on_error.hpp @@ -0,0 +1,90 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_THROW_ON_ERROR_HPP +#define BOOST_PROCESS_POSIX_INITIALIZERS_THROW_ON_ERROR_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { namespace initializers { + +class throw_on_error : public initializer_base +{ +public: + template + void on_fork_setup(PosixExecutor&) const + { + if (::pipe(fds_) == -1) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("pipe(2) failed"); + if (::fcntl(fds_[1], F_SETFD, FD_CLOEXEC) == -1) + { + int e = errno; + ::close(fds_[0]); + ::close(fds_[1]); + BOOST_PROCESS_THROW(boost::system::system_error( + boost::system::error_code(e, boost::system::system_category()), + BOOST_PROCESS_SOURCE_LOCATION "fcntl(2) failed")); + } + } + + template + void on_fork_error(PosixExecutor&) const + { + int e = errno; + ::close(fds_[0]); + ::close(fds_[1]); + BOOST_PROCESS_THROW(boost::system::system_error( + boost::system::error_code(e, boost::system::system_category()), + BOOST_PROCESS_SOURCE_LOCATION "fork(2) failed")); + } + + template + void on_fork_success(PosixExecutor&) const + { + ::close(fds_[1]); + int code; + if (::read(fds_[0], &code, sizeof(int)) > 0) + { + ::close(fds_[0]); + BOOST_PROCESS_THROW(boost::system::system_error( + boost::system::error_code(code, + boost::system::system_category()), + BOOST_PROCESS_SOURCE_LOCATION "execve(2) failed")); + } + ::close(fds_[0]); + } + + template + void on_exec_setup(PosixExecutor&) const + { + ::close(fds_[0]); + } + + template + void on_exec_error(PosixExecutor&) const + { + int e = errno; + while (::write(fds_[1], &e, sizeof(int)) == -1 && errno == EINTR) + ; + ::close(fds_[1]); + } + +private: + mutable int fds_[2]; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/posix/pipe.hpp b/dep/process/boost/process/posix/pipe.hpp new file mode 100644 index 00000000000..ca5b29447ab --- /dev/null +++ b/dep/process/boost/process/posix/pipe.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_PIPE_HPP +#define BOOST_PROCESS_POSIX_PIPE_HPP + +namespace boost { namespace process { namespace posix { + +struct pipe +{ + int source; + int sink; + + pipe(int source, int sink) : source(source), sink(sink) {} +}; + +inline pipe make_pipe(int source, int sink) +{ + return pipe(source, sink); +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/search_path.hpp b/dep/process/boost/process/posix/search_path.hpp new file mode 100644 index 00000000000..6dc2bea063d --- /dev/null +++ b/dep/process/boost/process/posix/search_path.hpp @@ -0,0 +1,53 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_SEARCH_PATH_HPP +#define BOOST_PROCESS_POSIX_SEARCH_PATH_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +inline std::string search_path(const std::string &filename, + std::string path = "") +{ + if (path.empty()) + { + path = ::getenv("PATH"); + if (path.empty()) + BOOST_PROCESS_THROW(std::runtime_error( + "Environment variable PATH not found")); + } + + std::string result; + typedef boost::tokenizer > tokenizer; + boost::char_separator sep(":"); + tokenizer tok(path, sep); + for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it) + { + boost::filesystem::path p = *it; + p /= filename; + if (!::access(p.c_str(), X_OK)) + { + result = p.string(); + break; + } + } + return result; +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/shell_path.hpp b/dep/process/boost/process/posix/shell_path.hpp new file mode 100644 index 00000000000..3e21e757591 --- /dev/null +++ b/dep/process/boost/process/posix/shell_path.hpp @@ -0,0 +1,32 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_SHELL_PATH_HPP +#define BOOST_PROCESS_POSIX_SHELL_PATH_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +inline boost::filesystem::path shell_path() +{ + return "/bin/sh"; +} + +inline boost::filesystem::path shell_path(boost::system::error_code &ec) +{ + ec.clear(); + return "/bin/sh"; +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/terminate.hpp b/dep/process/boost/process/posix/terminate.hpp new file mode 100644 index 00000000000..9be087df253 --- /dev/null +++ b/dep/process/boost/process/posix/terminate.hpp @@ -0,0 +1,37 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_TERMINATE_HPP +#define BOOST_PROCESS_POSIX_TERMINATE_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +template +void terminate(const Process &p) +{ + if (::kill(p.pid, SIGKILL) == -1) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("kill(2) failed"); +} + +template +void terminate(const Process &p, boost::system::error_code &ec) +{ + if (::kill(p.pid, SIGKILL) == -1) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); +} + +}}} + +#endif diff --git a/dep/process/boost/process/posix/wait_for_exit.hpp b/dep/process/boost/process/posix/wait_for_exit.hpp new file mode 100644 index 00000000000..d2b946c262a --- /dev/null +++ b/dep/process/boost/process/posix/wait_for_exit.hpp @@ -0,0 +1,52 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_POSIX_WAIT_FOR_EXIT_HPP +#define BOOST_PROCESS_POSIX_WAIT_FOR_EXIT_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace posix { + +template +inline int wait_for_exit(const Process &p) +{ + pid_t ret; + int status; + do + { + ret = ::waitpid(p.pid, &status, 0); + } while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status))); + if (ret == -1) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("waitpid(2) failed"); + return status; +} + +template +inline int wait_for_exit(const Process &p, boost::system::error_code &ec) +{ + pid_t ret; + int status; + do + { + ret = ::waitpid(p.pid, &status, 0); + } while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status))); + if (ret == -1) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); + return status; +} + +}}} + +#endif diff --git a/dep/process/boost/process/search_path.hpp b/dep/process/boost/process/search_path.hpp new file mode 100644 index 00000000000..20bff060b62 --- /dev/null +++ b/dep/process/boost/process/search_path.hpp @@ -0,0 +1,51 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/search_path.hpp + * + * Defines a function to search for an executable in path. + */ + +#ifndef BOOST_PROCESS_SEARCH_PATH_HPP +#define BOOST_PROCESS_SEARCH_PATH_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(search_path) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(search_path) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Searches for an executable in path. + * + * filename must be a basename including the file extension. + * It must not include any directory separators (like a slash). + * On Windows the file extension may be omitted. The function + * will then try the various file extensions for executables on + * Windows to find filename. + * + * path must be a set of directories. Directories must be + * separated by colons on POSIX and by semicolons on Windows. + * If path is empty, the environment variable PATH is used. + * + * \returns the absolute path to the executable filename or an + * empty string if filename isn't found + * + * \throws std::runtime_error if path is empty and no environment + * variable PATH exists + */ +string_type search_path(const string_type &filename, string_type path = ""); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/shell_path.hpp b/dep/process/boost/process/shell_path.hpp new file mode 100644 index 00000000000..92e9f0814b0 --- /dev/null +++ b/dep/process/boost/process/shell_path.hpp @@ -0,0 +1,46 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/shell_path.hpp + * + * Defines a function to return the absolute path to a shell executable. + */ + +#ifndef BOOST_PROCESS_SHELL_PATH_HPP +#define BOOST_PROCESS_SHELL_PATH_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(shell_path) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(shell_path) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Returns the absolute path to a shell executable. + * + * \returns the path to cmd.exe on Windows and /bin/sh on POSIX. + * + * \throws boost::system::system_error in case of an error + */ +boost::filesystem::path shell_path(); + +/** + * Returns the absolute path to a shell executable. + * + * \returns the path to cmd.exe on Windows and /bin/sh on POSIX. + */ +boost::filesystem::path shell_path(boost::system::error_code &ec); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/terminate.hpp b/dep/process/boost/process/terminate.hpp new file mode 100644 index 00000000000..140eba7e8dd --- /dev/null +++ b/dep/process/boost/process/terminate.hpp @@ -0,0 +1,52 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/terminate.hpp + * + * Defines a function to terminate a process. + */ + +#ifndef BOOST_PROCESS_TERMINATE_HPP +#define BOOST_PROCESS_TERMINATE_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(terminate) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(terminate) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Terminates a process. + * + * \warning Call this function only as a last resort. The process + * is terminated immediately and forcefully and has no + * chance to close or clean up resources properly. + * + * \throws boost::system::system_error in case of an error + */ +template +void terminate(const Process &p); + +/** + * Terminates a process. + * + * \warning Call this function only as a last resort. The process + * is terminated immediately and forcefully and has no + * chance to close or clean up resources properly. + */ +template +void terminate(const Process &p, boost::system::error_code &ec); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/wait_for_exit.hpp b/dep/process/boost/process/wait_for_exit.hpp new file mode 100644 index 00000000000..d9b118695d7 --- /dev/null +++ b/dep/process/boost/process/wait_for_exit.hpp @@ -0,0 +1,58 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/** + * \file boost/process/wait_for_exit.hpp + * + * Defines a function to wait for a process to exit. + */ + +#ifndef BOOST_PROCESS_WAIT_FOR_EXIT_HPP +#define BOOST_PROCESS_WAIT_FOR_EXIT_HPP + +#include + +#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(wait_for_exit) +BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(wait_for_exit) + +#if defined(BOOST_PROCESS_DOXYGEN) +namespace boost { namespace process { + +/** + * Waits for a process to exit. + * + * On Window boost::process::wait_for_exit returns the exit code + * of the process. On POSIX the exit status is returned. You must + * use the macro \c WEXITSTATUS (defined in sys/wait.h) to fetch + * the exit code from the exit status. + * + * \note This is a blocking function. + * + * \throws boost::system::system_error in case of an error + */ +template +int_type wait_for_exit(const Process &p); + +/** + * Waits for a process to exit. + * + * On Window boost::process::wait_for_exit returns the exit code + * of the process. On POSIX the exit status is returned. You must + * use the macro \c WEXITSTATUS (defined in sys/wait.h) to fetch + * the exit code from the exit status. + * + * \note This is a blocking function. + */ +template +int_type wait_for_exit(const Process &p, boost::system::error_code &ec); + +}} +#endif + +#endif diff --git a/dep/process/boost/process/windows/child.hpp b/dep/process/boost/process/windows/child.hpp new file mode 100644 index 00000000000..083cd29da0e --- /dev/null +++ b/dep/process/boost/process/windows/child.hpp @@ -0,0 +1,55 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_CHILD_HPP +#define BOOST_PROCESS_WINDOWS_CHILD_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { + +class child +{ +public: + PROCESS_INFORMATION proc_info; + + explicit child(const PROCESS_INFORMATION &pi) : proc_info(pi) {} + + ~child() + { + ::CloseHandle(proc_info.hProcess); + ::CloseHandle(proc_info.hThread); + } + + child(BOOST_RV_REF(child) c) : proc_info(c.proc_info) + { + c.proc_info.hProcess = INVALID_HANDLE_VALUE; + c.proc_info.hThread = INVALID_HANDLE_VALUE; + } + + child &operator=(BOOST_RV_REF(child) c) + { + ::CloseHandle(proc_info.hProcess); + ::CloseHandle(proc_info.hThread); + proc_info = c.proc_info; + c.proc_info.hProcess = INVALID_HANDLE_VALUE; + c.proc_info.hThread = INVALID_HANDLE_VALUE; + return *this; + } + + HANDLE process_handle() const { return proc_info.hProcess; } + +private: + BOOST_MOVABLE_BUT_NOT_COPYABLE(child); +}; + +}}} + +#endif diff --git a/dep/process/boost/process/windows/create_pipe.hpp b/dep/process/boost/process/windows/create_pipe.hpp new file mode 100644 index 00000000000..fe1e49751d8 --- /dev/null +++ b/dep/process/boost/process/windows/create_pipe.hpp @@ -0,0 +1,40 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_CREATE_PIPE_HPP +#define BOOST_PROCESS_WINDOWS_CREATE_PIPE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +inline pipe create_pipe() +{ + HANDLE handles[2]; + if (!::CreatePipe(&handles[0], &handles[1], NULL, 0)) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreatePipe() failed"); + return make_pipe(handles[0], handles[1]); +} + +inline pipe create_pipe(boost::system::error_code &ec) +{ + HANDLE handles[2]; + if (!::CreatePipe(&handles[0], &handles[1], NULL, 0)) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); + return make_pipe(handles[0], handles[1]); +} + +}}} + +#endif diff --git a/dep/process/boost/process/windows/execute.hpp b/dep/process/boost/process/windows/execute.hpp new file mode 100644 index 00000000000..43067521ead --- /dev/null +++ b/dep/process/boost/process/windows/execute.hpp @@ -0,0 +1,82 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_EXECUTE_HPP +#define BOOST_PROCESS_WINDOWS_EXECUTE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +template +child execute(const I0 &i0) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0))); +} + +template +child execute(const I0 &i0, const I1 &i1) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8))); +} + +template +child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9) +{ + return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9))); +} + +}}} + +#endif diff --git a/dep/process/boost/process/windows/executor.hpp b/dep/process/boost/process/windows/executor.hpp new file mode 100644 index 00000000000..1560f30793d --- /dev/null +++ b/dep/process/boost/process/windows/executor.hpp @@ -0,0 +1,130 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_EXECUTOR_HPP +#define BOOST_PROCESS_WINDOWS_EXECUTOR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +struct executor +{ + executor() : exe(0), cmd_line(0), proc_attrs(0), thread_attrs(0), + inherit_handles(FALSE), +#if (_WIN32_WINNT >= 0x0600) + creation_flags(EXTENDED_STARTUPINFO_PRESENT), +#else + creation_flags(0), +#endif + env(0), work_dir(0) +#if (_WIN32_WINNT >= 0x0600) + ,startup_info(startup_info_ex.StartupInfo) +#endif + { +#if (_WIN32_WINNT >= 0x0600) + ZeroMemory(&startup_info_ex, sizeof(STARTUPINFOEX)); + startup_info.cb = sizeof(STARTUPINFOEX); +#else + ZeroMemory(&startup_info, sizeof(STARTUPINFO)); + startup_info.cb = sizeof(STARTUPINFO); +#endif + startup_info.hStdInput = INVALID_HANDLE_VALUE; + startup_info.hStdOutput = INVALID_HANDLE_VALUE; + startup_info.hStdError = INVALID_HANDLE_VALUE; + } + + struct call_on_CreateProcess_setup + { + executor &e_; + + call_on_CreateProcess_setup(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_CreateProcess_setup(e_); + } + }; + + struct call_on_CreateProcess_error + { + executor &e_; + + call_on_CreateProcess_error(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_CreateProcess_error(e_); + } + }; + + struct call_on_CreateProcess_success + { + executor &e_; + + call_on_CreateProcess_success(executor &e) : e_(e) {} + + template + void operator()(Arg &arg) const + { + arg.on_CreateProcess_success(e_); + } + }; + + template + child operator()(const InitializerSequence &seq) + { + boost::fusion::for_each(seq, call_on_CreateProcess_setup(*this)); + + if (!::CreateProcess( + exe, + cmd_line, + proc_attrs, + thread_attrs, + inherit_handles, + creation_flags, + env, + work_dir, + &startup_info, + &proc_info)) + { + boost::fusion::for_each(seq, call_on_CreateProcess_error(*this)); + } + else + { + boost::fusion::for_each(seq, call_on_CreateProcess_success(*this)); + } + + return child(proc_info); + } + + LPCTSTR exe; + LPTSTR cmd_line; + LPSECURITY_ATTRIBUTES proc_attrs; + LPSECURITY_ATTRIBUTES thread_attrs; + BOOL inherit_handles; + DWORD creation_flags; + LPVOID env; + LPCTSTR work_dir; +#if (_WIN32_WINNT >= 0x0600) + STARTUPINFOEX startup_info_ex; + STARTUPINFO &startup_info; +#else + STARTUPINFO startup_info; +#endif + PROCESS_INFORMATION proc_info; +}; + +}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers.hpp b/dep/process/boost/process/windows/initializers.hpp new file mode 100644 index 00000000000..2d7098c034c --- /dev/null +++ b/dep/process/boost/process/windows/initializers.hpp @@ -0,0 +1,33 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/dep/process/boost/process/windows/initializers/bind_stderr.hpp b/dep/process/boost/process/windows/initializers/bind_stderr.hpp new file mode 100644 index 00000000000..de3ee30dc53 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/bind_stderr.hpp @@ -0,0 +1,39 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDERR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDERR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class bind_stderr : public initializer_base +{ +public: + explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink) : sink_(sink) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + ::SetHandleInformation(sink_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + e.startup_info.hStdError = sink_.handle(); + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + e.inherit_handles = true; + } + +private: + boost::iostreams::file_descriptor_sink sink_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/bind_stdin.hpp b/dep/process/boost/process/windows/initializers/bind_stdin.hpp new file mode 100644 index 00000000000..54c942ab639 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/bind_stdin.hpp @@ -0,0 +1,39 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDIN_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDIN_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class bind_stdin : public initializer_base +{ +public: + explicit bind_stdin(const boost::iostreams::file_descriptor_source &source) : source_(source) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + ::SetHandleInformation(source_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + e.startup_info.hStdInput = source_.handle(); + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + e.inherit_handles = true; + } + +private: + boost::iostreams::file_descriptor_source source_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/bind_stdout.hpp b/dep/process/boost/process/windows/initializers/bind_stdout.hpp new file mode 100644 index 00000000000..c72c05f1bfb --- /dev/null +++ b/dep/process/boost/process/windows/initializers/bind_stdout.hpp @@ -0,0 +1,39 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDOUT_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDOUT_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class bind_stdout : public initializer_base +{ +public: + explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink) : sink_(sink) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + ::SetHandleInformation(sink_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + e.startup_info.hStdOutput = sink_.handle(); + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + e.inherit_handles = true; + } + +private: + boost::iostreams::file_descriptor_sink sink_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/close_stderr.hpp b/dep/process/boost/process/windows/initializers/close_stderr.hpp new file mode 100644 index 00000000000..373c097f3ab --- /dev/null +++ b/dep/process/boost/process/windows/initializers/close_stderr.hpp @@ -0,0 +1,31 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDERR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDERR_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class close_stderr : public initializer_base +{ +public: + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.startup_info.hStdError = INVALID_HANDLE_VALUE; + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/close_stdin.hpp b/dep/process/boost/process/windows/initializers/close_stdin.hpp new file mode 100644 index 00000000000..036b0bb4ce9 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/close_stdin.hpp @@ -0,0 +1,31 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDIN_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDIN_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class close_stdin : public initializer_base +{ +public: + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.startup_info.hStdInput = INVALID_HANDLE_VALUE; + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/close_stdout.hpp b/dep/process/boost/process/windows/initializers/close_stdout.hpp new file mode 100644 index 00000000000..b58a6000f9c --- /dev/null +++ b/dep/process/boost/process/windows/initializers/close_stdout.hpp @@ -0,0 +1,31 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDOUT_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDOUT_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class close_stdout : public initializer_base +{ +public: + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.startup_info.hStdOutput = INVALID_HANDLE_VALUE; + e.startup_info.dwFlags |= STARTF_USESTDHANDLES; + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/hide_console.hpp b/dep/process/boost/process/windows/initializers/hide_console.hpp new file mode 100644 index 00000000000..b01aa026f0e --- /dev/null +++ b/dep/process/boost/process/windows/initializers/hide_console.hpp @@ -0,0 +1,31 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_HIDE_CONSOLE_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_HIDE_CONSOLE_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class hide_console : public initializer_base +{ +public: + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.startup_info.dwFlags |= STARTF_USESHOWWINDOW; + e.startup_info.wShowWindow |= SW_HIDE; + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/inherit_env.hpp b/dep/process/boost/process/windows/initializers/inherit_env.hpp new file mode 100644 index 00000000000..a2b2eda00a3 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/inherit_env.hpp @@ -0,0 +1,24 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_INHERIT_ENV_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_INHERIT_ENV_HPP + +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class inherit_env : public initializer_base +{ +public: +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/initializer_base.hpp b/dep/process/boost/process/windows/initializers/initializer_base.hpp new file mode 100644 index 00000000000..b98da7b21b9 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/initializer_base.hpp @@ -0,0 +1,29 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_INITIALIZER_BASE_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_INITIALIZER_BASE_HPP + +namespace boost { namespace process { namespace windows { namespace initializers { + +struct initializer_base +{ + template + void on_CreateProcess_setup(WindowsExecutor&) const {} + + template + void on_CreateProcess_error(WindowsExecutor&) const {} + + template + void on_CreateProcess_success(WindowsExecutor&) const {} +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/on_CreateProcess_error.hpp b/dep/process/boost/process/windows/initializers/on_CreateProcess_error.hpp new file mode 100644 index 00000000000..71eeada0720 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/on_CreateProcess_error.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_ERROR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_ERROR_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class on_CreateProcess_error_ : public initializer_base +{ +public: + explicit on_CreateProcess_error_(Handler handler) : handler_(handler) {} + + template + void on_CreateProcess_error(WindowsExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_CreateProcess_error_ on_CreateProcess_error(Handler handler) +{ + return on_CreateProcess_error_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/on_CreateProcess_setup.hpp b/dep/process/boost/process/windows/initializers/on_CreateProcess_setup.hpp new file mode 100644 index 00000000000..671fc9ac5c2 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/on_CreateProcess_setup.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SETUP_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SETUP_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class on_CreateProcess_setup_ : public initializer_base +{ +public: + explicit on_CreateProcess_setup_(Handler handler) : handler_(handler) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_CreateProcess_setup_ on_CreateProcess_setup(Handler handler) +{ + return on_CreateProcess_setup_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/on_CreateProcess_success.hpp b/dep/process/boost/process/windows/initializers/on_CreateProcess_success.hpp new file mode 100644 index 00000000000..67b3b2bdcf7 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/on_CreateProcess_success.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SUCCESS_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SUCCESS_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class on_CreateProcess_success_ : public initializer_base +{ +public: + explicit on_CreateProcess_success_(Handler handler) : handler_(handler) {} + + template + void on_CreateProcess_sucess(WindowsExecutor &e) const + { + handler_(e); + } + +private: + Handler handler_; +}; + +template +on_CreateProcess_success_ on_CreateProcess_success(Handler handler) +{ + return on_CreateProcess_success_(handler); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/run_exe.hpp b/dep/process/boost/process/windows/initializers/run_exe.hpp new file mode 100644 index 00000000000..bfa2b790b17 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/run_exe.hpp @@ -0,0 +1,69 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_RUN_EXE_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_RUN_EXE_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class run_exe_ : public initializer_base +{ +public: + explicit run_exe_(const String &s) : s_(s) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.exe = s_.c_str(); + } + +private: + String s_; +}; + +#if defined(_UNICODE) || defined(UNICODE) +inline run_exe_ run_exe(const wchar_t *ws) +{ + return run_exe_(ws); +} + +inline run_exe_ run_exe(const std::wstring &ws) +{ + return run_exe_(ws); +} + +inline run_exe_ run_exe(const boost::filesystem::path &p) +{ + return run_exe_(p.wstring()); +} +#else +inline run_exe_ run_exe(const char *s) +{ + return run_exe_(s); +} + +inline run_exe_ run_exe(const std::string &s) +{ + return run_exe_(s); +} + +inline run_exe_ run_exe(const boost::filesystem::path &p) +{ + return run_exe_(p.string()); +} +#endif + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/set_args.hpp b/dep/process/boost/process/windows/initializers/set_args.hpp new file mode 100644 index 00000000000..4b3c5b6249e --- /dev/null +++ b/dep/process/boost/process/windows/initializers/set_args.hpp @@ -0,0 +1,87 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ARGS_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ARGS_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class set_args_ : public initializer_base +{ +private: + typedef typename Range::const_iterator ConstIterator; + typedef typename Range::value_type String; + typedef typename String::value_type Char; + typedef std::basic_ostringstream OStringStream; + +public: + explicit set_args_(const Range &args) + { + ConstIterator it = boost::const_begin(args); + ConstIterator end = boost::const_end(args); + if (it != end) + { + exe_ = *it; + OStringStream os; + for (; it != end; ++it) + { + if (boost::algorithm::contains(*it, + String(1, static_cast(' ')))) + { + os << static_cast('"') << *it << + static_cast('"'); + } + else + { + os << *it; + } + os << static_cast(' '); + } + String s = os.str(); + cmd_line_.reset(new Char[s.size() + 1]); + boost::copy(s, cmd_line_.get()); + cmd_line_[s.size()] = 0; + } + else + { + cmd_line_.reset(new Char[1]()); + } + } + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.cmd_line = cmd_line_.get(); + if (!e.exe && !exe_.empty()) + e.exe = exe_.c_str(); + } + +private: + boost::shared_array cmd_line_; + String exe_; +}; + +template +set_args_ set_args(const Range &range) +{ + return set_args_(range); +} + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/set_cmd_line.hpp b/dep/process/boost/process/windows/initializers/set_cmd_line.hpp new file mode 100644 index 00000000000..a3d9f6f7615 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/set_cmd_line.hpp @@ -0,0 +1,68 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_CMD_LINE_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_CMD_LINE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class set_cmd_line_ : public initializer_base +{ +private: + typedef typename String::value_type Char; + +public: + explicit set_cmd_line_(const String &s) + : cmd_line_(new Char[s.size() + 1]) + { + boost::copy(s, cmd_line_.get()); + cmd_line_[s.size()] = 0; + } + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.cmd_line = cmd_line_.get(); + } + +private: + boost::shared_array cmd_line_; +}; + +#if defined(_UNICODE) || defined(UNICODE) +inline set_cmd_line_ set_cmd_line(const wchar_t *ws) +{ + return set_cmd_line_(ws); +} + +inline set_cmd_line_ set_cmd_line(const std::wstring &ws) +{ + return set_cmd_line_(ws); +} +#else +inline set_cmd_line_ set_cmd_line(const char *s) +{ + return set_cmd_line_(s); +} + +inline set_cmd_line_ set_cmd_line(const std::string &s) +{ + return set_cmd_line_(s); +} +#endif + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/set_env.hpp b/dep/process/boost/process/windows/initializers/set_env.hpp new file mode 100644 index 00000000000..6dfdfc58a48 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/set_env.hpp @@ -0,0 +1,88 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ENV_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ENV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class set_env_ : public initializer_base +{ +private: + typedef typename Range::value_type String; + typedef typename String::value_type Char; + + static std::size_t add_size(std::size_t size, const String &s) + { + return size + s.size() + 1u; + } + + struct copy + { + Char *it_; + + copy(Char *it) : it_(it) {} + + void operator()(const String &s) + { + it_ = boost::copy(s, it_); + *it_ = 0; + ++it_; + } + }; + +public: + set_env_(const Range &envs) + : size_(boost::accumulate(envs, 0, add_size) + 1), + env_(new Char[size_]) + { + boost::for_each(envs, copy(env_.get())); + env_[size_ - 1] = 0; + } + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.env = env_.get(); + if (Unicode) + e.creation_flags |= CREATE_UNICODE_ENVIRONMENT; + } + +private: + std::size_t size_; + boost::shared_array env_; +}; + +#if defined(_UNICODE) || defined(UNICODE) +template +set_env_ set_env(const Range &envs) +{ + return set_env_(envs); +} +#else +template +set_env_ set_env(const Range &envs) +{ + return set_env_(envs); +} +#endif + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/set_on_error.hpp b/dep/process/boost/process/windows/initializers/set_on_error.hpp new file mode 100644 index 00000000000..695ea5904d7 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/set_on_error.hpp @@ -0,0 +1,36 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ON_ERROR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ON_ERROR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class set_on_error : public initializer_base +{ +public: + explicit set_on_error(boost::system::error_code &ec) : ec_(ec) {} + + template + void on_CreateProcess_error(WindowsExecutor&) const + { + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_); + } + +private: + boost::system::error_code &ec_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/show_window.hpp b/dep/process/boost/process/windows/initializers/show_window.hpp new file mode 100644 index 00000000000..3046179205a --- /dev/null +++ b/dep/process/boost/process/windows/initializers/show_window.hpp @@ -0,0 +1,36 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SHOW_WINDOW_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SHOW_WINDOW_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class show_window : public initializer_base +{ +public: + explicit show_window(WORD flags) : flags_(flags) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.startup_info.dwFlags |= STARTF_USESHOWWINDOW; + e.startup_info.wShowWindow |= flags_; + } + +private: + WORD flags_; +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/start_in_dir.hpp b/dep/process/boost/process/windows/initializers/start_in_dir.hpp new file mode 100644 index 00000000000..8dc952abcc0 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/start_in_dir.hpp @@ -0,0 +1,69 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_START_IN_DIR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_START_IN_DIR_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +template +class start_in_dir_ : public initializer_base +{ +public: + explicit start_in_dir_(const String &s) : s_(s) {} + + template + void on_CreateProcess_setup(WindowsExecutor &e) const + { + e.work_dir = s_.c_str(); + } + +private: + String s_; +}; + +#if defined(_UNICODE) || defined(UNICODE) +inline start_in_dir_ start_in_dir(const wchar_t *ws) +{ + return start_in_dir_(ws); +} + +inline start_in_dir_ start_in_dir(const std::wstring &ws) +{ + return start_in_dir_(ws); +} + +inline start_in_dir_ start_in_dir(const boost::filesystem::path &p) +{ + return start_in_dir_(p.wstring()); +} +#else +inline start_in_dir_ start_in_dir(const char *s) +{ + return start_in_dir_(s); +} + +inline start_in_dir_ start_in_dir(const std::string &s) +{ + return start_in_dir_(s); +} + +inline start_in_dir_ start_in_dir(const boost::filesystem::path &p) +{ + return start_in_dir_(p.string()); +} +#endif + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/initializers/throw_on_error.hpp b/dep/process/boost/process/windows/initializers/throw_on_error.hpp new file mode 100644 index 00000000000..044fa004177 --- /dev/null +++ b/dep/process/boost/process/windows/initializers/throw_on_error.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_THROW_ON_ERROR_HPP +#define BOOST_PROCESS_WINDOWS_INITIALIZERS_THROW_ON_ERROR_HPP + +#include +#include + +namespace boost { namespace process { namespace windows { namespace initializers { + +class throw_on_error : public initializer_base +{ +public: + template + void on_CreateProcess_error(WindowsExecutor&) const + { + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreateProcess() failed"); + } +}; + +}}}} + +#endif diff --git a/dep/process/boost/process/windows/pipe.hpp b/dep/process/boost/process/windows/pipe.hpp new file mode 100644 index 00000000000..fd912afcc9e --- /dev/null +++ b/dep/process/boost/process/windows/pipe.hpp @@ -0,0 +1,32 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_PIPE_HPP +#define BOOST_PROCESS_WINDOWS_PIPE_HPP + +#include + +namespace boost { namespace process { namespace windows { + +struct pipe +{ + HANDLE source; + HANDLE sink; + + pipe(HANDLE source, HANDLE sink) : source(source), sink(sink) {} +}; + +inline pipe make_pipe(HANDLE source, HANDLE sink) +{ + return pipe(source, sink); +} + +}}} + +#endif diff --git a/dep/process/boost/process/windows/search_path.hpp b/dep/process/boost/process/windows/search_path.hpp new file mode 100644 index 00000000000..62bb5f27454 --- /dev/null +++ b/dep/process/boost/process/windows/search_path.hpp @@ -0,0 +1,104 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_SEARCH_PATH_HPP +#define BOOST_PROCESS_WINDOWS_SEARCH_PATH_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +#if defined(_UNICODE) || defined(UNICODE) +inline std::wstring search_path(const std::wstring &filename, + std::wstring path = L"") +{ + if (path.empty()) + { + path = ::_wgetenv(L"PATH"); + if (path.empty()) + BOOST_PROCESS_THROW(std::runtime_error( + "Environment variable PATH not found")); + } + + typedef boost::tokenizer, + std::wstring::const_iterator, std::wstring> tokenizer; + boost::char_separator sep(L";"); + tokenizer tok(path, sep); + for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it) + { + boost::filesystem::path p = *it; + p /= filename; + boost::array extensions = + { L"", L".exe", L".com", L".bat" }; + for (boost::array::iterator it2 = extensions.begin(); + it2 != extensions.end(); ++it2) + { + boost::filesystem::path p2 = p; + p2 += *it2; + boost::system::error_code ec; + bool file = boost::filesystem::is_regular_file(p2, ec); + if (!ec && file && + SHGetFileInfoW(p2.c_str(), 0, 0, 0, SHGFI_EXETYPE)) + { + return p2.wstring(); + } + } + } + return L""; +} +#else +inline std::string search_path(const std::string &filename, + std::string path = "") +{ + if (path.empty()) + { + path = ::getenv("PATH"); + if (path.empty()) + BOOST_PROCESS_THROW(std::runtime_error( + "Environment variable PATH not found")); + } + + typedef boost::tokenizer > tokenizer; + boost::char_separator sep(";"); + tokenizer tok(path, sep); + for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it) + { + boost::filesystem::path p = *it; + p /= filename; + boost::array extensions = + { "", ".exe", ".com", ".bat" }; + for (boost::array::iterator it2 = extensions.begin(); + it2 != extensions.end(); ++it2) + { + boost::filesystem::path p2 = p; + p2 += *it2; + boost::system::error_code ec; + bool file = boost::filesystem::is_regular_file(p2, ec); + if (!ec && file && + SHGetFileInfoA(p2.string().c_str(), 0, 0, 0, SHGFI_EXETYPE)) + { + return p2.string(); + } + } + } + return ""; +} +#endif + +}}} + +#endif diff --git a/dep/process/boost/process/windows/shell_path.hpp b/dep/process/boost/process/windows/shell_path.hpp new file mode 100644 index 00000000000..ace15b96e10 --- /dev/null +++ b/dep/process/boost/process/windows/shell_path.hpp @@ -0,0 +1,50 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP +#define BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +inline boost::filesystem::path shell_path() +{ + TCHAR sysdir[MAX_PATH]; + UINT size = ::GetSystemDirectory(sysdir, sizeof(sysdir)); + if (!size) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("GetSystemDirectory() failed"); + boost::filesystem::path p = sysdir; + return p / "cmd.exe"; +} + +inline boost::filesystem::path shell_path(boost::system::error_code &ec) +{ + TCHAR sysdir[MAX_PATH]; + UINT size = ::GetSystemDirectory(sysdir, sizeof(sysdir)); + boost::filesystem::path p; + if (!size) + { + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + } + else + { + ec.clear(); + p = sysdir; + p /= "cmd.exe"; + } + return p; +} + +}}} + +#endif diff --git a/dep/process/boost/process/windows/terminate.hpp b/dep/process/boost/process/windows/terminate.hpp new file mode 100644 index 00000000000..43afe250a6a --- /dev/null +++ b/dep/process/boost/process/windows/terminate.hpp @@ -0,0 +1,38 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_TERMINATE_HPP +#define BOOST_PROCESS_WINDOWS_TERMINATE_HPP + +#include +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +template +void terminate(const Process &p) +{ + if (!::TerminateProcess(p.process_handle(), EXIT_FAILURE)) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("TerminateProcess() failed"); +} + +template +void terminate(const Process &p, boost::system::error_code &ec) +{ + if (!::TerminateProcess(p.process_handle(), EXIT_FAILURE)) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); +} + +}}} + +#endif diff --git a/dep/process/boost/process/windows/wait_for_exit.hpp b/dep/process/boost/process/windows/wait_for_exit.hpp new file mode 100644 index 00000000000..23a8b9a9f18 --- /dev/null +++ b/dep/process/boost/process/windows/wait_for_exit.hpp @@ -0,0 +1,49 @@ +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_WAIT_FOR_EXIT_HPP +#define BOOST_PROCESS_WINDOWS_WAIT_FOR_EXIT_HPP + +#include +#include +#include + +namespace boost { namespace process { namespace windows { + +template +inline DWORD wait_for_exit(const Process &p) +{ + if (::WaitForSingleObject(p.process_handle(), INFINITE) == WAIT_FAILED) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("WaitForSingleObject() failed"); + + DWORD exit_code; + if (!::GetExitCodeProcess(p.process_handle(), &exit_code)) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("GetExitCodeProcess() failed"); + + return exit_code; +} + +template +inline DWORD wait_for_exit(const Process &p, boost::system::error_code &ec) +{ + DWORD exit_code = 1; + + if (::WaitForSingleObject(p.process_handle(), INFINITE) == WAIT_FAILED) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else if (!::GetExitCodeProcess(p.process_handle(), &exit_code)) + BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec); + else + ec.clear(); + + return exit_code; +} + +}}} + +#endif diff --git a/revision.h.in.cmake b/revision.h.in.cmake index f50c8022062..c0eb651489f 100644 --- a/revision.h.in.cmake +++ b/revision.h.in.cmake @@ -3,6 +3,9 @@ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" #define _BRANCH "@rev_branch@" + #define _SOURCE_DIRECTORY "@CMAKE_SOURCE_DIR@" + #define _MYSQL_EXECUTABLE "@MYSQL_EXECUTABLE@" + #define _FULL_DATABASE "TDB_full_6.00_2014_10_19.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2015 TrinityCore" #define VER_FILEVERSION 0,0,0 diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 6fba92991d9..d4bc9246ed2 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -622,3 +622,60 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2014-12-28 23:10:07 + +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +-- Auth database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/auth', 'RELEASED'), +('$/sql/custom/auth', 'RELEASED'), +('$/sql/old/6.x/auth', 'ARCHIVED'); + +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2014_10_04_00_auth.sql', 'C3BC70A6EC381474B7308F442346F1E721176BC6'), +('2014_10_19_00_auth.sql', '7472B490A4F86C9D3DA609CDD3197499CB80C87C'), +('2014_10_26_00_auth.sql', '75CC67ADE2A3B2E54FD57D6B0DCAA8FE50F4EE35'), +('2014_11_03_00_auth.sql', '5948C9F286CF0FEA8E241785C0259FF36B73BDC5'), +('2014_11_04_00_auth.sql', '3AFC68B2375C2A417DDEA94583C53AFF83DE50DF'), +('2014_11_09_00_auth.sql', 'B8DD1A7047C0FDDB80344B239343EC33BF1A0D97'), +('2014_11_10_00_auth.sql', '8FBA737A1D3FF4631A1E662A5B500A8BD304EC63'), +('2014_11_10_00_auth_from_335.sql', '0E3CB119442D09DD88E967015319BBC8DAFBBFE0'), +('2014_11_10_01_auth.sql', '327E77A1DA3546D5275AB249915DD57EDD6FDD3D'), +('2014_11_23_00_auth.sql', '0BBEB3EB3AED0FEF277A062819B6B2C00084A742'), +('2014_11_25_00_auth.sql', '4F45CDB26BDBB3EE83F1988E3D7818C5926ADC02'), +('2014_12_05_00_auth.sql', '6A7BBCEF43111C73A2D2C3CCB6911BE50DE7DD94'), +('2014_12_10_00_auth.sql', '821703A96D80F9080074852B5A46E2909C9562EA'), +('2014_12_19_00_auth.sql', '44D8E12FFF327AD07878FBDF8D9C16B6B7DCB122'), +('2014_12_20_00_auth.sql', '4DAA02AE285C02AE6C82EA2C8B97AC71990F1085'), +('2014_12_25_00_auth.sql', '61411930F482BC73FC7FD2C370C811E944F5FF92'), +('2014_12_27_00_auth.sql', 'CE2E5D2CD82E79C25294539ADED27A1429105B43'), +('2014_12_28_00_auth.sql', '0A913217610E76AFF119C27259737BBC523090E6'), +('2015_02_22_00_auth.sql', '21CCCF8B01252E16CA3D6C9E3E8DAA4C9B28ED6E'), +('2015_03_01_00_auth.sql', '911881E273207FF6182D1FDAC8C85FFAE8F1C852'), +('2015_03_10_00_auth.sql', '2CC8502C11412EFEB5C11BE166761A8754A59009'), +('2015_03_20_00_auth.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_auth.sql', '5CCEDF20C8189FB1E8DF064A9F0DDC342841FBF0'), +('2015_03_20_02_auth.sql', ''); diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index b37dd5dffac..69c367a56c8 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2986,3 +2986,58 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2015-01-27 22:41:44 + +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +-- Characters database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/characters', 'RELEASED'), +('$/sql/custom/characters', 'RELEASED'), +('$/sql/old/6.x/characters', 'ARCHIVED'); + +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2014_10_20_00_characters.sql', 'A5882DA0979CF4DAE33DA011EBAA006C24BE7230'), +('2014_10_23_00_characters.sql', 'E2AC4758133EE19B7F08464A445802154D1261C8'), +('2014_10_23_01_characters.sql', '20029E6323D9773B32C34D84FFED1711CC60F09F'), +('2014_10_23_02_characters.sql', '8A7A16886EE71E7ACDDB3DDA6D0ECAC2FD2FDCA8'), +('2014_10_24_00_characters.sql', 'D008FE81AE844FCA686439D6ECC5108FB0DD1EB9'), +('2014_10_25_00_characters.sql', 'A39C7BE46686B54776BDAB9D7A882D91EDEC51A4'), +('2014_10_26_00_characters.sql', 'C787954CC35FE34B4101FDE6527F14C027F4947C'), +('2014_11_12_00_characters.sql', 'B160BB2313F1BD5F3B076A5A9279DC10D4796E34'), +('2014_12_23_00_characters.sql', '3D9D648B2387B357F4BD090B33F80682F7924882'), +('2014_12_28_00_characters.sql', '5362922FF4483A336311D73082A5727309CD9219'), +('2014_12_31_00_characters.sql', '498DDF2DD936CF156D74A8208DC93DCE9FCAB5AA'), +('2015_01_02_00_characters.sql', 'E5940BE836F253982E07930120422E598D08BDE1'), +('2015_01_10_00_characters.sql', '30796056C8623699B2FE1BF626A19D38262E9284'), +('2015_01_16_00_characters.sql', '96642760A54C8D799AAFE438049A63AA521656F2'), +('2015_01_27_00_characters.sql', 'EB710E3EB9F2CAFD84AB62CDC84E898403A80A4F'), +('2015_02_13_00_characters.sql', '405BEB4ED207DC6076442A37EE2AFB1F21E274A0'), +('2015_02_13_01_characters.sql', '35F582D4F33BF55D1685A1BA89273ED895FD09C5'), +('2015_02_17_00_characters.sql', '8D21FC5A55BF8B55D6DCDCE5F02CF2B640230E94'), +('2015_03_10_00_characters.sql', 'E565B89B145C340067742DFF2DEF1B74F5F1BD4E'), +('2015_03_20_00_characters.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_characters.sql', '20BD68468C57FCF7E665B4DA185DCD52FACE8B3F'), +('2015_03_20_02_characters.sql', ''); diff --git a/sql/base/dev/hotfixes_database.sql b/sql/base/dev/hotfixes_database.sql deleted file mode 100644 index 0d5a5d2f23c..00000000000 --- a/sql/base/dev/hotfixes_database.sql +++ /dev/null @@ -1,18 +0,0 @@ --- MySQL dump 10.13 Distrib 5.6.9-rc, for Win64 (x86_64) --- --- Host: localhost Database: hotfixes --- ------------------------------------------------------ --- Server version 5.6.9-rc - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- Dump completed on 2014-10-19 23:50:46 diff --git a/sql/base/hotfixes_database.sql b/sql/base/hotfixes_database.sql new file mode 100644 index 00000000000..61ec102c295 --- /dev/null +++ b/sql/base/hotfixes_database.sql @@ -0,0 +1,56 @@ +-- MySQL dump 10.13 Distrib 5.6.9-rc, for Win64 (x86_64) +-- +-- Host: localhost Database: hotfixes +-- ------------------------------------------------------ +-- Server version 5.6.9-rc + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- Dump completed on 2014-10-19 23:50:46 + +-- Workaround for the update system +-- As long as no full hotfix db exists + +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +-- Hotfixes database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/hotfixes', 'RELEASED'), +('$/sql/custom/hotfixes', 'RELEASED'), +('$/sql/old/6.x/hotfixes', 'ARCHIVED'); + +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2015_03_20_00_hotfixes.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_hotfixes.sql', 'A79521F16AE82F0D7487495D0BF7A726D81F250D'); diff --git a/sql/custom/auth/.gitignore b/sql/custom/auth/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/sql/custom/auth/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/sql/custom/characters/.gitignore b/sql/custom/characters/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/sql/custom/characters/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/sql/custom/hotfixes/.gitignore b/sql/custom/hotfixes/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/sql/custom/hotfixes/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/sql/custom/world/.gitignore b/sql/custom/world/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/sql/custom/world/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/sql/old/6.x/auth/CREATE_SUBDIRECTORIES_HERE b/sql/old/6.x/auth/CREATE_SUBDIRECTORIES_HERE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sql/old/6.x/characters/CREATE_SUBDIRECTORIES_HERE b/sql/old/6.x/characters/CREATE_SUBDIRECTORIES_HERE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sql/old/6.x/hotfixes/CREATE_SUBDIRECTORIES_HERE b/sql/old/6.x/hotfixes/CREATE_SUBDIRECTORIES_HERE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sql/old/6.x/world/CREATE_SUBDIRECTORIES_HERE b/sql/old/6.x/world/CREATE_SUBDIRECTORIES_HERE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sql/updates/auth/2015_03_20_00_auth.sql b/sql/updates/auth/2015_03_20_00_auth.sql new file mode 100644 index 00000000000..05c120274da --- /dev/null +++ b/sql/updates/auth/2015_03_20_00_auth.sql @@ -0,0 +1,23 @@ +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; diff --git a/sql/updates/auth/2015_03_20_01_auth.sql b/sql/updates/auth/2015_03_20_01_auth.sql new file mode 100644 index 00000000000..ecee16a2274 --- /dev/null +++ b/sql/updates/auth/2015_03_20_01_auth.sql @@ -0,0 +1,6 @@ +-- Auth database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/auth', 'RELEASED'), +('$/sql/custom/auth', 'RELEASED'), +('$/sql/old/6.x/auth', 'ARCHIVED'); diff --git a/sql/updates/auth/2015_03_20_02_auth.sql b/sql/updates/auth/2015_03_20_02_auth.sql new file mode 100644 index 00000000000..12427489f01 --- /dev/null +++ b/sql/updates/auth/2015_03_20_02_auth.sql @@ -0,0 +1,25 @@ +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2014_10_04_00_auth.sql', 'C3BC70A6EC381474B7308F442346F1E721176BC6'), +('2014_10_19_00_auth.sql', '7472B490A4F86C9D3DA609CDD3197499CB80C87C'), +('2014_10_26_00_auth.sql', '75CC67ADE2A3B2E54FD57D6B0DCAA8FE50F4EE35'), +('2014_11_03_00_auth.sql', '5948C9F286CF0FEA8E241785C0259FF36B73BDC5'), +('2014_11_04_00_auth.sql', '3AFC68B2375C2A417DDEA94583C53AFF83DE50DF'), +('2014_11_09_00_auth.sql', 'B8DD1A7047C0FDDB80344B239343EC33BF1A0D97'), +('2014_11_10_00_auth.sql', '8FBA737A1D3FF4631A1E662A5B500A8BD304EC63'), +('2014_11_10_00_auth_from_335.sql', '0E3CB119442D09DD88E967015319BBC8DAFBBFE0'), +('2014_11_10_01_auth.sql', '327E77A1DA3546D5275AB249915DD57EDD6FDD3D'), +('2014_11_23_00_auth.sql', '0BBEB3EB3AED0FEF277A062819B6B2C00084A742'), +('2014_11_25_00_auth.sql', '4F45CDB26BDBB3EE83F1988E3D7818C5926ADC02'), +('2014_12_05_00_auth.sql', '6A7BBCEF43111C73A2D2C3CCB6911BE50DE7DD94'), +('2014_12_10_00_auth.sql', '821703A96D80F9080074852B5A46E2909C9562EA'), +('2014_12_19_00_auth.sql', '44D8E12FFF327AD07878FBDF8D9C16B6B7DCB122'), +('2014_12_20_00_auth.sql', '4DAA02AE285C02AE6C82EA2C8B97AC71990F1085'), +('2014_12_25_00_auth.sql', '61411930F482BC73FC7FD2C370C811E944F5FF92'), +('2014_12_27_00_auth.sql', 'CE2E5D2CD82E79C25294539ADED27A1429105B43'), +('2014_12_28_00_auth.sql', '0A913217610E76AFF119C27259737BBC523090E6'), +('2015_02_22_00_auth.sql', '21CCCF8B01252E16CA3D6C9E3E8DAA4C9B28ED6E'), +('2015_03_01_00_auth.sql', '911881E273207FF6182D1FDAC8C85FFAE8F1C852'), +('2015_03_10_00_auth.sql', '2CC8502C11412EFEB5C11BE166761A8754A59009'), +('2015_03_20_00_auth.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_auth.sql', '5CCEDF20C8189FB1E8DF064A9F0DDC342841FBF0'), +('2015_03_20_02_auth.sql', ''); diff --git a/sql/updates/characters/2015_03_20_00_characters.sql b/sql/updates/characters/2015_03_20_00_characters.sql new file mode 100644 index 00000000000..05c120274da --- /dev/null +++ b/sql/updates/characters/2015_03_20_00_characters.sql @@ -0,0 +1,23 @@ +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; diff --git a/sql/updates/characters/2015_03_20_01_characters.sql b/sql/updates/characters/2015_03_20_01_characters.sql new file mode 100644 index 00000000000..69c8767e239 --- /dev/null +++ b/sql/updates/characters/2015_03_20_01_characters.sql @@ -0,0 +1,6 @@ +-- Characters database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/characters', 'RELEASED'), +('$/sql/custom/characters', 'RELEASED'), +('$/sql/old/6.x/characters', 'ARCHIVED'); diff --git a/sql/updates/characters/2015_03_20_02_characters.sql b/sql/updates/characters/2015_03_20_02_characters.sql new file mode 100644 index 00000000000..32f7ecffb26 --- /dev/null +++ b/sql/updates/characters/2015_03_20_02_characters.sql @@ -0,0 +1,23 @@ +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2014_10_20_00_characters.sql', 'A5882DA0979CF4DAE33DA011EBAA006C24BE7230'), +('2014_10_23_00_characters.sql', 'E2AC4758133EE19B7F08464A445802154D1261C8'), +('2014_10_23_01_characters.sql', '20029E6323D9773B32C34D84FFED1711CC60F09F'), +('2014_10_23_02_characters.sql', '8A7A16886EE71E7ACDDB3DDA6D0ECAC2FD2FDCA8'), +('2014_10_24_00_characters.sql', 'D008FE81AE844FCA686439D6ECC5108FB0DD1EB9'), +('2014_10_25_00_characters.sql', 'A39C7BE46686B54776BDAB9D7A882D91EDEC51A4'), +('2014_10_26_00_characters.sql', 'C787954CC35FE34B4101FDE6527F14C027F4947C'), +('2014_11_12_00_characters.sql', 'B160BB2313F1BD5F3B076A5A9279DC10D4796E34'), +('2014_12_23_00_characters.sql', '3D9D648B2387B357F4BD090B33F80682F7924882'), +('2014_12_28_00_characters.sql', '5362922FF4483A336311D73082A5727309CD9219'), +('2014_12_31_00_characters.sql', '498DDF2DD936CF156D74A8208DC93DCE9FCAB5AA'), +('2015_01_02_00_characters.sql', 'E5940BE836F253982E07930120422E598D08BDE1'), +('2015_01_10_00_characters.sql', '30796056C8623699B2FE1BF626A19D38262E9284'), +('2015_01_16_00_characters.sql', '96642760A54C8D799AAFE438049A63AA521656F2'), +('2015_01_27_00_characters.sql', 'EB710E3EB9F2CAFD84AB62CDC84E898403A80A4F'), +('2015_02_13_00_characters.sql', '405BEB4ED207DC6076442A37EE2AFB1F21E274A0'), +('2015_02_13_01_characters.sql', '35F582D4F33BF55D1685A1BA89273ED895FD09C5'), +('2015_02_17_00_characters.sql', '8D21FC5A55BF8B55D6DCDCE5F02CF2B640230E94'), +('2015_03_10_00_characters.sql', 'E565B89B145C340067742DFF2DEF1B74F5F1BD4E'), +('2015_03_20_00_characters.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_characters.sql', '20BD68468C57FCF7E665B4DA185DCD52FACE8B3F'), +('2015_03_20_02_characters.sql', ''); diff --git a/sql/updates/hotfixes/2015_03_20_00_hotfixes.sql b/sql/updates/hotfixes/2015_03_20_00_hotfixes.sql new file mode 100644 index 00000000000..05c120274da --- /dev/null +++ b/sql/updates/hotfixes/2015_03_20_00_hotfixes.sql @@ -0,0 +1,23 @@ +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; diff --git a/sql/updates/hotfixes/2015_03_20_01_hotfixes.sql b/sql/updates/hotfixes/2015_03_20_01_hotfixes.sql new file mode 100644 index 00000000000..a56bf038472 --- /dev/null +++ b/sql/updates/hotfixes/2015_03_20_01_hotfixes.sql @@ -0,0 +1,6 @@ +-- Hotfixes database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/hotfixes', 'RELEASED'), +('$/sql/custom/hotfixes', 'RELEASED'), +('$/sql/old/6.x/hotfixes', 'ARCHIVED'); diff --git a/sql/updates/hotfixes/2015_03_20_02_hotfixes.sql b/sql/updates/hotfixes/2015_03_20_02_hotfixes.sql new file mode 100644 index 00000000000..87b5da36aec --- /dev/null +++ b/sql/updates/hotfixes/2015_03_20_02_hotfixes.sql @@ -0,0 +1,18 @@ +INSERT IGNORE INTO `updates` (`name`, `hash`) VALUES +('2014_10_19_01_hotfixes_area_poi.sql', 'BEE7AD2717D833074AAB0B7E50D17312D0018DEC'), +('2014_10_19_02_hotfixes_area_poi_state.sql', 'D70F413FF0EFFAFACF3B8A9B26D118F3D107E097'), +('2014_10_19_03_hotfixes_creature_difficulty.sql', 'F9FD065AC1A409580AE6E3C01BF8F74E45D31205'), +('2014_10_19_04_hotfixes_creature.sql', '0A7FD859535F648633449E5351F00257AE202838'), +('2014_10_19_05_hotfixes_broadcast_text.sql', '0A82925C0B0BC6BB3A4E2F7DDB40A410C24FFE15'), +('2014_10_19_06_hotfixes_broadcast_text.sql', '29982469F34CB06B6F413009DD761F361E56B3A1'), +('2014_10_20_00_hotfixes_gameobjects.sql', 'C9DCBE4A88074273CBB64FE568DEFCD2EF27DB8A'), +('2014_10_24_00_hotfixes_taxi_path_node.sql', 'F038CFD6E79649B6F7734F070BF2466505847E94'), +('2014_10_24_01_hotfixes_broadcast_text.sql', 'B1CA1B188092B17418D759903E066E0E6FA27420'), +('2014_12_25_00_hotfixes_locale_broadcast_text.sql', '7F5C494F33B216EBAD6A6C065A923CC71234A599'), +('2014_12_26_00_hotfixes_hotfix_data.sql', 'ACED65D62DDD9D56E182C6FD6E8001A2AD605118'), +('2015_02_22_00_hotfixes.sql', 'E15FB22A995AB26A0A0BC61EDE3D0258C394F8B3'), +('2015_03_04_00_hotfixes.sql', '0DC68F95CE1E6E808B9B2751617384CFCFD727D6'), +('2015_03_08_00_hotfixes.sql', '8287470D148051AFBCC7EECEAACBE87ABC65A09C'), +('2015_03_20_00_hotfixes.sql', 'B761760804EA73BD297F296C5C1919687DF7191C'), +('2015_03_20_01_hotfixes.sql', 'A79521F16AE82F0D7487495D0BF7A726D81F250D'), +('2015_03_20_02_hotfixes.sql', ''); diff --git a/sql/updates/world/2015_03_20_04_world.sql b/sql/updates/world/2015_03_20_04_world.sql new file mode 100644 index 00000000000..05c120274da --- /dev/null +++ b/sql/updates/world/2015_03_20_04_world.sql @@ -0,0 +1,23 @@ +-- Updates base tables +DROP TABLE IF EXISTS `updates`; +CREATE TABLE `updates` ( + `name` VARCHAR(200) NOT NULL COMMENT 'filename with extension of the update.', + `hash` CHAR(40) NULL DEFAULT '' COMMENT 'sha1 hash of the sql file.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if an update is released or archived.', + `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp when the query was applied.', + `speed` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'time the query takes to apply in ms.', + PRIMARY KEY (`name`) +) +COMMENT='List of all applied updates in this database.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; + +DROP TABLE IF EXISTS `updates_include`; +CREATE TABLE `updates_include` ( + `path` VARCHAR(200) NOT NULL COMMENT 'directory to include. $ means relative to the source directory.', + `state` ENUM('RELEASED','ARCHIVED') NOT NULL DEFAULT 'RELEASED' COMMENT 'defines if the directory contains released or archived updates.', + PRIMARY KEY (`path`) +) +COMMENT='List of directories where we want to include sql updates.' +COLLATE='utf8_general_ci' +ENGINE=MyISAM; diff --git a/sql/updates/world/2015_03_20_05_world.sql b/sql/updates/world/2015_03_20_05_world.sql new file mode 100644 index 00000000000..018e1929c34 --- /dev/null +++ b/sql/updates/world/2015_03_20_05_world.sql @@ -0,0 +1,6 @@ +-- World database update data +TRUNCATE TABLE `updates_include`; +INSERT INTO `updates_include` (`path`, `state`) VALUES +('$/sql/updates/world', 'RELEASED'), +('$/sql/custom/world', 'RELEASED'), +('$/sql/old/6.x/world', 'ARCHIVED'); diff --git a/sql/updates/world/2015_03_20_06_world.sql b/sql/updates/world/2015_03_20_06_world.sql new file mode 100644 index 00000000000..692381573eb --- /dev/null +++ b/sql/updates/world/2015_03_20_06_world.sql @@ -0,0 +1,170 @@ +INSERT IGNORE INTO `updates` (`name`, `hash`, `state`) VALUES +('2014_10_19_00_world.sql', 'C9D12A22A30EAA0E602D5DEF7E72BF2F18BC8546', 'ARCHIVED'), +('2014_10_19_01_world.sql', '140B2E47A3B997C03CE00B29E963900643FFB820', 'ARCHIVED'), +('2014_10_19_01_world_from_335.sql', '76D19F7888A41B1B4AB4A5F366AE98057F066128', 'ARCHIVED'), +('2014_10_19_02_world.sql', '58AB6AAAFC6FED71B66DF6A8DF279DB195BD0E2F', 'ARCHIVED'), +('2014_10_20_00_world.sql', 'BD3D440770748809709C002C3DD4FFD7399E045A', 'ARCHIVED'), +('2014_10_20_00_world_from_335.sql', 'E74390D42EF46218FE189C22A2A68BC454293F30', 'ARCHIVED'), +('2014_10_21_00_world.sql', '0E29A91E897F5EF08BFD09893475B483084F9BB9', 'ARCHIVED'), +('2014_10_22_00_world.sql', '73246FCC28EFA348C2345EDB092053A3D4AE2ECF', 'ARCHIVED'), +('2014_10_22_00_world_from_335.sql', '5C5268C959A22284F6E9E05D873EA153BFBBD835', 'ARCHIVED'), +('2014_10_22_01_world.sql', 'A93FE6F9BDA6D8DDD06303B1CF2D546ABAC31B00', 'ARCHIVED'), +('2014_10_23_00_world.sql', 'C4CE350F917717F646C074294DC21DFD4A531358', 'ARCHIVED'), +('2014_10_23_01_world.sql', 'A1B8C1E18FD43AE8D1A9A0E00C91804DA5391F33', 'ARCHIVED'), +('2014_10_24_01_world_from_335.sql', '5A6EFA81F56575F85B27709944371C3E0A75D5D6', 'ARCHIVED'), +('2014_10_24_02_world.sql', '7AADECF3AB832E8E7662917E5E42E8ED0B911EF9', 'ARCHIVED'), +('2014_10_24_03_world.sql', '1A3BE9C3443254E8040700014CD0553C60079C3E', 'ARCHIVED'), +('2014_10_24_04_world.sql', '31D594C935B0BDCD85381FCE710A08724C367988', 'ARCHIVED'), +('2014_10_25_00_world.sql', '9F251D021F9F15F33D60998C50779BE25566B7DF', 'ARCHIVED'), +('2014_10_26_00_world.sql', '171319C2ACDB3DB8B93C34C8FD8AF8741CA5FBCB', 'ARCHIVED'), +('2014_10_26_01_world.sql', 'E10E2EB04D4B2C332BB5EFEFE04F54FA3471B699', 'ARCHIVED'), +('2014_10_26_02_world.sql', '61DD9CCFBE84A87433EDBACF9657C9222D5DEC21', 'ARCHIVED'), +('2014_10_26_03_world.sql', '6CD3E46FB34BB74D563E98A8F0E6C3D158651CF5', 'ARCHIVED'), +('2014_10_26_04_world.sql', '664B0B4EC3338289B6CA60EEE999D8363D4E4A58', 'ARCHIVED'), +('2014_10_26_05_world.sql', '769D4D8E652A7E30B819633AAD01154BCDA73A63', 'ARCHIVED'), +('2014_10_26_06_world_from_335.sql', 'FA22609D1B1D0B56760595FEA7445B0724A44EE6', 'ARCHIVED'), +('2014_10_27_00_world.sql', '431C68103E11C4A7579EF62DC4CD27D254C4E47A', 'ARCHIVED'), +('2014_10_27_01_world.sql', '735AD9C0307926D7CF6AC6845FF27B67650CD935', 'ARCHIVED'), +('2014_10_27_02_world.sql', '3DAEB7EC510D924B37BFAC7D8CA06B8E38D60FEA', 'ARCHIVED'), +('2014_10_28_00_world.sql', 'C59E8BCC1A58FB150B08A6D2F4003E5EC151E696', 'ARCHIVED'), +('2014_10_29_00_world.sql', 'E7A909C7DC8B50DCFC2E737909540041A89AEE11', 'ARCHIVED'), +('2014_10_29_01_world.sql', 'F478D2AE25B9C36E3456DD35884357063556AA36', 'ARCHIVED'), +('2014_10_30_00_world.sql', '46D284FE1E2847CE99FE707ECC0BDAB4C9F7EE06', 'ARCHIVED'), +('2014_10_30_01_world.sql', 'B1C5B27B6D4984F7BBB40388E92DD46FB5E8BFF0', 'ARCHIVED'), +('2014_10_30_02_world.sql', '6F0FFB389D698B8AFFA723EF55895C6CF2CBF7D3', 'ARCHIVED'), +('2014_10_31_00_world.sql', '6406626D2883AEF64DEA38E2D88A71A46915B5B6', 'ARCHIVED'), +('2014_10_31_01_world.sql', 'D397CEFFE883BB910FEDCE5EA5EDFB537FB2370A', 'ARCHIVED'), +('2014_10_31_02_world.sql', '215FB85430078FE0AFB771F34B5CEC85D6D4C22A', 'ARCHIVED'), +('2014_10_31_03_world.sql', 'A9BE071C624ABF152BAE5A97452CC505CE100D98', 'ARCHIVED'), +('2014_11_01_00_world.sql', 'D05FB5907D59AE2520A8658064A1DFC3D256256C', 'ARCHIVED'), +('2014_11_02_00_world.sql', 'AC4CBDC7BB6A51927841EF2BD98045CCD56C6AED', 'ARCHIVED'), +('2014_11_02_01_world.sql', '48DC7D245D7A7019B3333BA8F598AB566A321EE4', 'ARCHIVED'), +('2014_11_02_02_world.sql', '856AE4A3990B38A68155845C6D68F28F4B075C41', 'ARCHIVED'), +('2014_11_04_00_world.sql', '517BE655C4F39EAAA3025F843B29A0F276559FEF', 'ARCHIVED'), +('2014_11_07_00_world.sql', '16A0E153EDE2AB8C63A3BA6656AD71BB237FBCF3', 'ARCHIVED'), +('2014_11_07_01_world.sql', '5DCE2E3A55185587AD2DF83D5FB146C7A7D794A3', 'ARCHIVED'), +('2014_11_08_00_world.sql', 'B3C5B811A1C4805EDE7D11740187048A79A2369A', 'ARCHIVED'), +('2014_11_08_01_world.sql', '0C1F022696DF96302AB62B4A215FC37FAD66FA35', 'ARCHIVED'), +('2014_11_08_02_world.sql', '136936E2E16955DCD4B0EEA34AA3D22B6852A031', 'ARCHIVED'), +('2014_11_10_00_world.sql', '13B0D432ABC18E32531C1C97ECC51AA45EC506C7', 'ARCHIVED'), +('2014_11_10_01_world.sql', 'B9FFFED95D327392EA5CB264F6712BAC766C84BD', 'ARCHIVED'), +('2014_11_10_02_world.sql', 'A8830AD02DD7DF119721A979E165ED3259ED420B', 'ARCHIVED'), +('2014_11_10_03_world.sql', '8734F326B496D24871E16809D167F055B10D6F93', 'ARCHIVED'), +('2014_11_10_04_world.sql', 'F22AB772400FB35B1BFF6F58534CA681BF769281', 'ARCHIVED'), +('2014_11_10_05_world.sql', '4DC43402104F8296FA992C40916036B76F35560C', 'ARCHIVED'), +('2014_11_16_00_world.sql', 'BEBE47FC0D0E499FB6DBED310985BD9516F2935B', 'ARCHIVED'), +('2014_11_16_01_world.sql', 'C036EC4786AF8D5E01F6A681B3B9F1953FE0F5B0', 'ARCHIVED'), +('2014_11_16_02_world.sql', '4F16F69F0AAAA23C0254D4B89CA3AC3FDEC6DA03', 'ARCHIVED'), +('2014_11_16_03_world.sql', '178BA69418C7784475F36518CEE6D3C0233A3A07', 'ARCHIVED'), +('2014_11_16_04_world.sql', '0F14EE0A04BB2C3E393265082C2B7600236B2F14', 'ARCHIVED'), +('2014_11_16_05_world.sql', 'F6F0D8A12F64CAE47530F77E53B31FE9BA685CB3', 'ARCHIVED'), +('2014_11_16_06_world.sql', 'FF7C64269FD4C26EF6FB79D1EE5774E13C3C20D1', 'ARCHIVED'), +('2014_11_19_00_world.sql', '6E1D3D0451297EAE3A85903D4901E824BB4B5E50', 'ARCHIVED'), +('2014_11_19_01_world.sql', '2E545A1875301B2622B59BEF0473E90BA56EC4FD', 'ARCHIVED'), +('2014_11_20_00_world.sql', '2C0E3B63F1572F584C8E0B134FA925814ACDFE95', 'ARCHIVED'), +('2014_11_20_01_world.sql', '2FC08035F0F09783E228788781D5D492452803F7', 'ARCHIVED'), +('2014_11_20_02_world.sql', 'BF817119E9F568CDD5BEA712FA5DAABE008DA9F7', 'ARCHIVED'), +('2014_11_30_00_world.sql', 'F70897BD3E34C87320A2E3E6C72C66C6877A13FB', 'ARCHIVED'), +('2014_12_01_00_world.sql', 'B370BBB22E09C233ABB2CB3999E2BDD9A49A35A1', 'ARCHIVED'), +('2014_12_04_00_world.sql', 'C22F9C77CEF8805FFCB950BB7038D1EF12D49731', 'ARCHIVED'), +('2014_12_04_01_world.sql', 'D8353D92E679FABEE7B1F978B5394F5A18F7D40F', 'ARCHIVED'), +('2014_12_12_00_world.sql', '3E31732550055B7EB72443C30EA2ED975862215D', 'ARCHIVED'), +('2014_12_12_01_world.sql', 'D52B5EF4374EE67FE77D3C1AF004E42E1425DB10', 'ARCHIVED'), +('2014_12_12_02_world.sql', 'F0E9DDCF540B58123811993D09F61A2EFA34BC8D', 'ARCHIVED'), +('2014_12_12_03_world.sql', 'BFB07C36367BD9A198BB9CC34103EC0C401A09E8', 'ARCHIVED'), +('2014_12_13_00_world.sql', '394CF64309B1BACD7BDF1A6BF7D88DE2A335FFEE', 'ARCHIVED'), +('2014_12_15_00_world.sql', '88FF35DC8B665070E96249CA01AA079DBE995BBB', 'ARCHIVED'), +('2014_12_17_00_world.sql', '545A3022BB1D85E8FCF9BC1086D5C3864BF1F0CA', 'ARCHIVED'), +('2014_12_19_00_world.sql', 'AF594EB0D80B3DEC01686597DF369BC34D7398E8', 'ARCHIVED'), +('2014_12_19_01_world.sql', '557FF34D129C6758A1CE66AAD7A1A3516631D36D', 'ARCHIVED'), +('2014_12_21_00_world.sql', '4F07D137F7628A7DABED5FDD8EDB1B1A83086C0B', 'ARCHIVED'), +('2014_12_24_00_world.sql', 'BCD9B5C90A35CA1BA9ACCC31B053DCFDD8B714B0', 'ARCHIVED'), +('2014_12_25_00_world.sql', '925F10E1D8D69502293D2EEDE2DFC3D448D23724', 'ARCHIVED'), +('2014_12_25_01_world.sql', 'E4BB18FEC17307D04EA1E314DD36D770242C049B', 'ARCHIVED'), +('2014_12_26_00_world.sql', '0829D8347CB6BFFE08E0F5DF82F46CA071566E50', 'ARCHIVED'), +('2014_12_26_01_world.sql', 'B5FDA0031AFCB729C6079FB7D9DE81E8768A8F14', 'ARCHIVED'), +('2014_12_26_02_world.sql', 'BDC397D2FCB3E737F6520ACEDB6836C88E0B84A5', 'ARCHIVED'), +('2014_12_26_03_world.sql', '89E0C5196DA72793FFA26F259BD602066CBBC31E', 'ARCHIVED'), +('2014_12_26_04_world.sql', '58564849E75F397C8E1C744692191ADE39DFA514', 'ARCHIVED'), +('2014_12_26_05_world.sql', 'D370DC75186601FCBABB63845922B294099DA13B', 'ARCHIVED'), +('2014_12_26_06_world.sql', 'BE8F3B85AB5F89EF081B984A2E4B66B3D88BB9E9', 'ARCHIVED'), +('2014_12_26_07_world.sql', '69792C539312FB965DEA2206D129314E6B411445', 'ARCHIVED'), +('2014_12_27_00_world.sql', 'C58A8454E3D39A2021C8D82BCCB621EE992E0ACF', 'ARCHIVED'), +('2014_12_27_01_world.sql', '841BF49D1D54E7C8BBD3AAD8E233E0A592AF903E', 'ARCHIVED'), +('2014_12_27_02_world.sql', '9440E74C6E2D07B50F747895E285C5AA3D6CE3D3', 'ARCHIVED'), +('2014_12_27_03_world.sql', '4BB55FF64EDD594B0062E7056666D1E1B5A559B9', 'ARCHIVED'), +('2014_12_27_04_world.sql', '7C8BFB2FE5F58288E98C6395B1D7952BA0D923A0', 'ARCHIVED'), +('2014_12_27_05_world.sql', '7FC53862CD96381DE5C15C404FE25935E1AC603D', 'ARCHIVED'), +('2014_12_27_06_world.sql', 'EDB26E7292183B8867BD3D22941B3A21B350A18C', 'ARCHIVED'), +('2014_12_27_07_world.sql', 'B9455E80DEF0ADADE466632AC6206F43B8CF98EE', 'ARCHIVED'), +('2014_12_27_08_world.sql', '135C58B097B834FF4D195C9B13E9C462E5A12070', 'ARCHIVED'), +('2014_12_28_00_world.sql', '855E107ADD7D3078B2ED37D77BE8CDCD2E76D9E5', 'ARCHIVED'), +('2014_12_28_01_world.sql', '46ED66ED9F997555CFFF0ABF48712D4B54A015AF', 'ARCHIVED'), +('2014_12_28_02_world.sql', '8DE39EDA6246CF885B04BBE3C403A984A7947EB7', 'ARCHIVED'), +('2014_12_28_03_world.sql', '53E8B3A24AEB4467C5765FFF2B99CB646CC77319', 'ARCHIVED'), +('2014_12_28_04_world.sql', '67B7936CA2DB03E64380E61C520FE808EC900687', 'ARCHIVED'), +('2014_12_28_05_world.sql', '28542CF3F4EFCAF60E96B61740A7755CE4189FD9', 'ARCHIVED'), +('2014_12_28_06_world.sql', '277DFC82FE17489C519001A778ABE17F0FBCC605', 'ARCHIVED'), +('2014_12_28_07_world.sql', '717CF0E7F4795A972096EDFECCAAB561FBD8E987', 'ARCHIVED'), +('2014_12_29_00_world.sql', 'EF70B832664A0822CEA30EF51B4BEEDF185EC53D', 'ARCHIVED'), +('2014_12_30_00_world.sql', '468E05F2FB5B73647F77DDF375C1D10B5B5F35B1', 'ARCHIVED'), +('2015_01_10_00_world.sql', '9F93ABE80EBAA370971F61C094713CC73448DD74', 'ARCHIVED'), +('2015_01_10_01_world.sql', 'EDDA230907DE93B2E23171DBE757A8831F3EF0B3', 'ARCHIVED'), +('2015_01_10_02_world.sql', 'C6CC35B2021CA60C0BF43D3C88FCD323FF0D39F8', 'ARCHIVED'), +('2015_01_10_03_world.sql', '135690CAC7B6F786F00EBB8F5B385B815CFE9BFD', 'ARCHIVED'), +('2015_01_10_04_world.sql', 'F6098B3B1E2ED9484A15FE27E5ABE4960EFA3A28', 'ARCHIVED'), +('2015_01_10_05_world.sql', '9ADBEE777B28618822269D5D5923056D86194867', 'ARCHIVED'), +('2015_01_10_06_world.sql', 'D3CB658D8C880BF5988E31D2789DC1188AF12244', 'ARCHIVED'), +('2015_01_10_07_world.sql', '11FC9708637F44455A1EEB2D920652C11AF73204', 'ARCHIVED'), +('2015_01_11_01_world.sql', '880F9053836285B014E4F85787BB17B035ACA2BD', 'ARCHIVED'), +('2015_01_11_02_world.sql', '652501E5CC18ABAD377AF825667ACC91D07EA9AB', 'ARCHIVED'), +('2015_01_11_03_world.sql', '1D3AB865CC7C6241E43053B85B7289100F112A1E', 'ARCHIVED'), +('2015_01_12_00_world.sql', '6D97DF64ED2BA6668E1BBD20869B5D00A83AB6DC', 'ARCHIVED'), +('2015_01_15_00_world.sql', '9E1CB22E3F128A6597842DCA85E4A08C8E6A3B00', 'ARCHIVED'), +('2015_01_16_00_world.sql', '81959173F25898F3EDFC94A9BD40800B7459434D', 'ARCHIVED'), +('2015_01_18_00_world.sql', '7CA65728C59A00BECFAFC5585A79ED4B4AF5FAA3', 'ARCHIVED'), +('2015_01_30_00_world.sql', '0200615B833CB70E82C9B6D50BA6ED6F37C5A046', 'ARCHIVED'), +('2015_01_30_01_world.sql', '56DC1B47EE659D5B2C0740A3710B6BA9168C0A8D', 'ARCHIVED'), +('2015_02_02_00_world.sql', '3210E3CD12FCEE5E505D293113A0B77071FAA41B', 'ARCHIVED'), +('2015_02_02_00_world_from_335.sql', '4A7F644212D0BC1D8B4BDC7E27BA70BBBCF5C1A8', 'ARCHIVED'), +('2015_02_02_01_world.sql', '56FFF84EC62A9A8647C94B535EB6A0A2BAA4EECA', 'ARCHIVED'), +('2015_02_06_00_world.sql', '8D965E6D688C50DEB197E4B5B6D3F911264FF00B', 'ARCHIVED'), +('2015_02_08_00_world.sql', 'B64B75BC708A959CB370557949671CB75BBB87D9', 'ARCHIVED'), +('2015_02_11_00_world.sql', '50B5E9DAFC4BF3260DF78DA4D9A874728C11D589', 'ARCHIVED'), +('2015_02_12_00_world.sql', 'AA1E0BFE3C23ABAECE17E151EE9F74C86FDB32C2', 'ARCHIVED'), +('2015_02_13_00_world.sql', '4A552FFBB0218FB2E7E54429DD27F9F6B3C71DBA', 'ARCHIVED'), +('2015_02_18_00_world.sql', '9224197FD3427974D942FEBCCEDE7ABD40300E23', 'ARCHIVED'), +('2015_02_19_00_world.sql', '4E9ED1DC0DF1FD173CD15FA35A79353E08455A30', 'ARCHIVED'), +('2015_02_20_00_world.sql', '52BA5B5A6F386B852E1A115F2C39B66108314A5F', 'ARCHIVED'), +('2015_02_20_01_world.sql', '1C0C6A74212690BB07BA50524A8BB54D3AEC7708', 'ARCHIVED'), +('2015_02_20_02_world.sql', '77DE8E0108E079741E0C3CED01AB4FD60260C57A', 'ARCHIVED'), +('2015_02_22_00_world.sql', '8CC806EC21F9F194CE06DC80F0C8F5A4509EFBDA', 'ARCHIVED'), +('2015_02_22_01_world.sql', 'A2AD10247D226951FEE769F3872194F0E1D9C44A', 'ARCHIVED'), +('2015_03_07_00_world.sql', '9DA807070CA63F4342884DF65C7FE409EEEBAE49', 'ARCHIVED'), +('2015_03_07_01_world.sql', '60835178B525B1E2A842A7AB660AD7B6F0832063', 'ARCHIVED'), +('2015_03_07_02_world.sql', '3FBA2EDD2A3641A697CA71D0E0C5E716A057C13E', 'ARCHIVED'), +('2015_03_07_03_world.sql', '560D71607A4E444B5C51D7E2B333D2064AD55D75', 'ARCHIVED'), +('2015_03_10_00_world.sql', 'E9B5D25DF80B70998336A580E419AF3E78266597', 'ARCHIVED'), +('2015_03_16_00_world.sql', 'E386644A485C16DDA4EE83415808BB6C77DC1E87', 'ARCHIVED'), +('2015_03_16_01_world.sql', 'D8018D2645F6A21308F7AB2EA12F09474B5BFF46', 'ARCHIVED'), +('2015_03_16_02_world.sql', '68914E093312389F0AADEDFEF0BD190117965AC4', 'ARCHIVED'), +('2015_03_16_03_world.sql', '673267031A5450A7C010B28D99E4CCC3A90B778D', 'ARCHIVED'), +('2015_03_16_04_world.sql', '74275F00F6C5168870F7A01CEF19DD3D06572734', 'ARCHIVED'), +('2015_03_16_05_world.sql', '6E44CFA09EF45C7FA2D63F0679F2B216B620D7C7', 'ARCHIVED'), +('2015_03_16_06_world.sql', '44C2A4C393AB3E5401FBD122784E6E56B28942B6', 'ARCHIVED'), +('2015_03_16_07_world.sql', '83D3171C249FA95CB2576EABE7EB469F34DEAB2D', 'ARCHIVED'), +('2015_03_16_08_world.sql', '96C9E201D6F5F896C96A06E94228F1067C19D7CE', 'ARCHIVED'), +('2015_03_16_09_world.sql', 'AE99495134C2AA1762047853A48193E1E2B7E240', 'ARCHIVED'), +('2015_03_16_10_world.sql', '6166BEE0E14FE9F15777F041747230AF546ED99E', 'ARCHIVED'), +('2015_03_17_00_world.sql', 'F71FE9758B3AFFD80E391209A743D43B04E6F93A', 'ARCHIVED'), +('2015_03_17_02_world.sql', '6212A1CF186600907CBAE1000B9D6AF2026B6E7D', 'ARCHIVED'), +('2015_03_18_00_world.sql', '1103C059C8FE207DAC6F3E1D629852968EB6F917', 'ARCHIVED'), +('2015_03_18_01_world.sql', '3BC3E66ECFABCCDCFF43ABAFBE4381AD0ED4228A', 'ARCHIVED'), +('2015_03_19_00_world.sql', '45B0A3D93365CE324AD25C72554B13AE47356F43', 'ARCHIVED'), +('2015_03_20_00_world.sql', '8E7C56D7C5F6FC85C291BEEFCEDF036431A399E9', 'ARCHIVED'), +('2015_03_20_01_world.sql', '618093A729BC0FE4FC141AF79F702C28D370E70B', 'ARCHIVED'), +('2015_03_20_02_world.sql', 'A0FF748366FEA70998B6F9639355C67EBCA95572', 'ARCHIVED'), +('2015_03_20_03_world.sql', '062DA1A1DE0186948FD9A8958BD6D7EA8CE5507D', 'ARCHIVED'), +('2015_03_20_04_world.sql', 'B761760804EA73BD297F296C5C1919687DF7191C', 'ARCHIVED'), +('2015_03_20_05_world.sql', '8481BE9B805704C97D2D8D54272F1E443184B3B2', 'ARCHIVED'), +('2015_03_20_06_world.sql', '', 'ARCHIVED'); diff --git a/src/server/bnetserver/CMakeLists.txt b/src/server/bnetserver/CMakeLists.txt index c9f83cc528d..4ea4f697cf7 100644 --- a/src/server/bnetserver/CMakeLists.txt +++ b/src/server/bnetserver/CMakeLists.txt @@ -47,6 +47,7 @@ include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zmqpp + ${CMAKE_SOURCE_DIR}/dep/process ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/shared/Database @@ -58,6 +59,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Realm ${CMAKE_SOURCE_DIR}/src/server/shared/Threading + ${CMAKE_SOURCE_DIR}/src/server/shared/Updater ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_SOURCE_DIR}/src/server/ipc ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp index 5f4f63287e5..678e24c4682 100644 --- a/src/server/bnetserver/Main.cpp +++ b/src/server/bnetserver/Main.cpp @@ -36,6 +36,7 @@ #include "SystemConfig.h" #include "Util.h" #include "ZmqContext.h" +#include "DatabaseLoader.h" #include #include #include @@ -162,32 +163,13 @@ bool StartDB() { MySQL::Library_Init(); - std::string dbstring = sConfigMgr->GetStringDefault("LoginDatabaseInfo", ""); - if (dbstring.empty()) - { - TC_LOG_ERROR("server.bnetserver", "Database not specified"); - return false; - } - - int32 worker_threads = sConfigMgr->GetIntDefault("LoginDatabase.WorkerThreads", 1); - if (worker_threads < 1 || worker_threads > 32) - { - TC_LOG_ERROR("server.bnetserver", "Improper value specified for LoginDatabase.WorkerThreads, defaulting to 1."); - worker_threads = 1; - } + // Load databases + DatabaseLoader loader("server.bnetserver", DatabaseLoader::DATABASE_NONE); + loader + .AddDatabase(LoginDatabase, "Login"); - int32 synch_threads = sConfigMgr->GetIntDefault("LoginDatabase.SynchThreads", 1); - if (synch_threads < 1 || synch_threads > 32) - { - TC_LOG_ERROR("server.bnetserver", "Improper value specified for LoginDatabase.SynchThreads, defaulting to 1."); - synch_threads = 1; - } - - if (!LoginDatabase.Open(dbstring, uint8(worker_threads), uint8(synch_threads))) - { - TC_LOG_ERROR("server.bnetserver", "Cannot connect to database"); + if (!loader.Load()) return false; - } TC_LOG_INFO("server.bnetserver", "Started auth database connection pool."); sLog->SetRealmId(0); // Enables DB appenders when realm is set. diff --git a/src/server/bnetserver/bnetserver.conf.dist b/src/server/bnetserver/bnetserver.conf.dist index 462bb0cd075..804ce51ef2a 100644 --- a/src/server/bnetserver/bnetserver.conf.dist +++ b/src/server/bnetserver/bnetserver.conf.dist @@ -9,6 +9,7 @@ # EXAMPLE CONFIG # AUTH SERVER SETTINGS # MYSQL SETTINGS +# UPDATE SETTINGS # LOGGING SYSTEM SETTINGS # ################################################################################################### @@ -164,6 +165,86 @@ Wrong.Password.Login.Logging = 0 # ################################################################################################### +################################################################################################### +# UPDATE SETTINGS +# +# Updates.EnableDatabases +# Description: A mask that describes which databases shall be updated. +# +# Following flags are available +# DATABASE_LOGIN = 1, // Auth database +# +# Default: 0 - (All Disabled) +# 1 - (All Enabled) + +Updates.EnableDatabases = 0 + +# +# Updates.SourcePath +# Description: The path to your TrinityCore source directory. +# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +Updates.SourcePath = "" + +# +# Updates.SourcePath +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +Updates.MySqlCLIPath = "" + +# +# Updates.AutoSetup +# Description: Auto populate empty databases. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AutoSetup = 1 + +# +# Updates.Redundancy +# Description: Perform data redundancy checks through hashing +# to detect changes on sql updates and reapply it. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.Redundancy = 1 + +# +# Updates.ArchivedRedundancy +# Description: Check hashes of archived updates (slows down startup). +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Updates.ArchivedRedundancy = 0 + +# +# Updates.AllowRehash +# Description: Inserts the current file hash in the database if it is left empty. +# Useful if you want to mark a file as applied but you don't know its hash. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AllowRehash = 1 + +# +# Updates.CleanDeadRef +# Description: Cleans dead/ orphaned references that occure if a update was deleted or renamed and edited. +# Disable this if you want to know if the database is in a possible "dirty state". +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.CleanDeadRef = 1 + +# +################################################################################################### + ################################################################################################### # # LOGGING SYSTEM SETTINGS @@ -255,6 +336,7 @@ Logger.root=3,Console Bnet Logger.realmlist=3,Console Bnet Logger.session=3,Console Bnet Logger.session.packets=3,Console Bnet +Logger.sql.updates=3,Console Bnet # ################################################################################################### diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index ab54efab1fd..55792856eb4 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -131,6 +131,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Realm ${CMAKE_SOURCE_DIR}/src/server/shared/Threading + ${CMAKE_SOURCE_DIR}/src/server/shared/Updater ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_SOURCE_DIR}/src/server/ipc ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 13026b56fc2..79d3cea0868 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -64,6 +64,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Threading + ${CMAKE_SOURCE_DIR}/src/server/shared/Updater ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_SOURCE_DIR}/src/server/ipc ${CMAKE_SOURCE_DIR}/src/server/collision diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index b6ac8b03099..657b3fde349 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -22,6 +22,7 @@ file(GLOB_RECURSE sources_Networking Networking/*.cpp Networking/*.h) file(GLOB_RECURSE sources_Packets Packets/*.cpp Packets/*.h) file(GLOB_RECURSE sources_Realm Realm/*.cpp Realm/*.h) file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) +file(GLOB_RECURSE sources_Updater Updater/*.cpp Updater/*.h) file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) file(GLOB sources_localdir *.cpp *.h) @@ -53,6 +54,7 @@ set(shared_STAT_SRCS ${sources_Packets} ${sources_Realm} ${sources_Threading} + ${sources_Updater} ${sources_Utilities} ${sources_localdir} ) @@ -63,6 +65,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/utf8cpp + ${CMAKE_SOURCE_DIR}/dep/process ${CMAKE_SOURCE_DIR}/src/server ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Configuration @@ -77,6 +80,7 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Realm ${CMAKE_CURRENT_SOURCE_DIR}/Threading ${CMAKE_CURRENT_SOURCE_DIR}/Utilities + ${CMAKE_CURRENT_SOURCE_DIR}/Updater ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} diff --git a/src/server/shared/Database/DatabaseLoader.cpp b/src/server/shared/Database/DatabaseLoader.cpp new file mode 100644 index 00000000000..25c400fdfa8 --- /dev/null +++ b/src/server/shared/Database/DatabaseLoader.cpp @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "DatabaseLoader.h" +#include "DBUpdater.h" +#include "Config.h" + +#include + +DatabaseLoader::DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask) + : _logger(logger), _autoSetup(sConfigMgr->GetBoolDefault("Updates.AutoSetup", true)), + _updateFlags(sConfigMgr->GetIntDefault("Updates.EnableDatabases", defaultUpdateMask)) +{ +} + +template +DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::string const& name) +{ + bool const updatesEnabledForThis = DBUpdater::IsEnabled(_updateFlags); + + _open.push(std::make_pair([this, name, updatesEnabledForThis, &pool]() -> bool + { + std::string const dbString = sConfigMgr->GetStringDefault(name + "DatabaseInfo", ""); + if (dbString.empty()) + { + TC_LOG_ERROR(_logger.c_str(), "Database %s not specified in configuration file!", name.c_str()); + return false; + } + + uint8 const asyncThreads = uint8(sConfigMgr->GetIntDefault(name + "Database.WorkerThreads", 1)); + if (asyncThreads < 1 || asyncThreads > 32) + { + TC_LOG_ERROR(_logger.c_str(), "%s database: invalid number of worker threads specified. " + "Please pick a value between 1 and 32.", name.c_str()); + return false; + } + + uint8 const synchThreads = uint8(sConfigMgr->GetIntDefault(name + "Database.SynchThreads", 1)); + + pool.SetConnectionInfo(dbString, asyncThreads, synchThreads); + if (uint32 error = pool.Open()) + { + // Database does not exist + if ((error == ER_BAD_DB_ERROR) && updatesEnabledForThis && _autoSetup) + { + // Try to create the database and connect again if auto setup is enabled + if (DBUpdater::Create(pool) && (!pool.Open())) + error = 0; + } + + // If the error wasn't handled quit + if (error) + { + TC_LOG_ERROR("sql.driver", "\nDatabasePool %s NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile " + "for specific errors. Read wiki at http://collab.kpsn.org/display/tc/TrinityCore+Home", name.c_str()); + + return false; + } + } + return true; + }, + [&pool]() + { + pool.Close(); + })); + + // Populate and update only if updates are enabled for this pool + if (updatesEnabledForThis) + { + _populate.push([this, name, &pool]() -> bool + { + if (!DBUpdater::Populate(pool)) + { + TC_LOG_ERROR(_logger.c_str(), "Could not populate the %s database, see log for details.", name.c_str()); + return false; + } + return true; + }); + + _update.push([this, name, &pool]() -> bool + { + if (!DBUpdater::Update(pool)) + { + TC_LOG_ERROR(_logger.c_str(), "Could not update the %s database, see log for details.", name.c_str()); + return false; + } + return true; + }); + } + + _prepare.push([this, name, &pool]() -> bool + { + if (!pool.PrepareStatements()) + { + TC_LOG_ERROR(_logger.c_str(), "Could not prepare statements of the %s database, see log for details.", name.c_str()); + return false; + } + return true; + }); + + return *this; +} + +bool DatabaseLoader::Load() +{ + if (!OpenDatabases()) + return false; + + if (!PopulateDatabases()) + return false; + + if (!UpdateDatabases()) + return false; + + if (!PrepareStatements()) + return false; + + return true; +} + +bool DatabaseLoader::OpenDatabases() +{ + while (!_open.empty()) + { + std::pair> const load = _open.top(); + if (load.first()) + _close.push(load.second); + else + { + // Close all loaded databases + while (!_close.empty()) + { + _close.top()(); + _close.pop(); + } + return false; + } + + _open.pop(); + } + return true; +} + +// Processes the elements of the given stack until a predicate returned false. +bool DatabaseLoader::Process(std::stack& stack) +{ + while (!stack.empty()) + { + if (!stack.top()()) + return false; + + stack.pop(); + } + return true; +} + +bool DatabaseLoader::PopulateDatabases() +{ + return Process(_populate); +} + +bool DatabaseLoader::UpdateDatabases() +{ + return Process(_update); +} + +bool DatabaseLoader::PrepareStatements() +{ + return Process(_prepare); +} + +template +DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::string const& name); +template +DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::string const& name); +template +DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::string const& name); +template +DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::string const& name); diff --git a/src/server/shared/Database/DatabaseLoader.h b/src/server/shared/Database/DatabaseLoader.h new file mode 100644 index 00000000000..0d31ef1686c --- /dev/null +++ b/src/server/shared/Database/DatabaseLoader.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef DatabaseLoader_h__ +#define DatabaseLoader_h__ + +#include "DatabaseWorkerPool.h" +#include "DatabaseEnv.h" + +#include +#include + +// A helper class to initiate all database worker pools, +// handles updating, delays preparing of statements and cleans up on failure. +class DatabaseLoader +{ +public: + DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask); + + // Register a database to the loader (lazy implemented) + template + DatabaseLoader& AddDatabase(DatabaseWorkerPool& pool, std::string const& name); + + // Load all databases + bool Load(); + + enum DatabaseTypeFlags + { + DATABASE_NONE = 0, + + DATABASE_LOGIN = 1, + DATABASE_CHARACTER = 2, + DATABASE_WORLD = 4, + DATABASE_HOTFIX = 8, + + DATABASE_MASK_ALL = DATABASE_LOGIN | DATABASE_CHARACTER | DATABASE_WORLD | DATABASE_HOTFIX + }; + +private: + bool OpenDatabases(); + bool PopulateDatabases(); + bool UpdateDatabases(); + bool PrepareStatements(); + + using Predicate = std::function; + + static bool Process(std::stack& stack); + + bool const _autoSetup; + uint32 const _updateFlags; + std::string const _logger; + + std::stack>> _open; + std::stack> _close; + std::stack _populate, _update, _prepare; +}; + +#endif // DatabaseLoader_h__ diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index f1c6a7acbf5..fa142c9020c 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -30,6 +30,7 @@ #include "AdhocStatement.h" #include +#include #define MIN_MYSQL_SERVER_VERSION 50100u #define MIN_MYSQL_CLIENT_VERSION 50100u @@ -57,9 +58,9 @@ class DatabaseWorkerPool public: /* Activity state */ - DatabaseWorkerPool() : _connectionInfo(NULL) + DatabaseWorkerPool() : _connectionInfo(nullptr), _queue(new ProducerConsumerQueue()), + _async_threads(0), _synch_threads(0) { - _queue = new ProducerConsumerQueue(); memset(_connectionCount, 0, sizeof(_connectionCount)); _connections.resize(IDX_SIZE); @@ -70,31 +71,37 @@ class DatabaseWorkerPool ~DatabaseWorkerPool() { _queue->Cancel(); + } - delete _queue; + void SetConnectionInfo(std::string const& infoString, uint8 const asyncThreads, uint8 const synchThreads) + { + _connectionInfo.reset(new MySQLConnectionInfo(infoString)); - delete _connectionInfo; + _async_threads = asyncThreads; + _synch_threads = synchThreads; } - bool Open(const std::string& infoString, uint8 async_threads, uint8 synch_threads) + uint32 Open() { - _connectionInfo = new MySQLConnectionInfo(infoString); + WPFatal(_connectionInfo.get(), "Connection info was not set!"); TC_LOG_INFO("sql.driver", "Opening DatabasePool '%s'. Asynchronous connections: %u, synchronous connections: %u.", - GetDatabaseName(), async_threads, synch_threads); + GetDatabaseName(), _async_threads, _synch_threads); - bool res = OpenConnections(IDX_ASYNC, async_threads); + uint32 error = OpenConnections(IDX_ASYNC, _async_threads); - if (!res) - return res; + if (error) + return error; - res = OpenConnections(IDX_SYNCH, synch_threads); + error = OpenConnections(IDX_SYNCH, _synch_threads); - if (res) + if (!error) + { TC_LOG_INFO("sql.driver", "DatabasePool '%s' opened successfully. %u total connections running.", GetDatabaseName(), (_connectionCount[IDX_SYNCH] + _connectionCount[IDX_ASYNC])); + } - return res; + return error; } void Close() @@ -120,6 +127,32 @@ class DatabaseWorkerPool TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); } + //! Prepares all prepared statements + bool PrepareStatements() + { + for (uint8 i = 0; i < IDX_SIZE; ++i) + for (uint32 c = 0; c < _connectionCount[i]; ++c) + { + T* t = _connections[i][c]; + t->LockIfReady(); + if (!t->PrepareStatements()) + { + t->Unlock(); + Close(); + return false; + } + else + t->Unlock(); + } + + return true; + } + + inline MySQLConnectionInfo const* GetConnectionInfo() const + { + return _connectionInfo.get(); + } + /** Delayed one-way statement methods. */ @@ -461,7 +494,7 @@ class DatabaseWorkerPool } private: - bool OpenConnections(InternalIndex type, uint8 numConnections) + uint32 OpenConnections(InternalIndex type, uint8 numConnections) { _connections[type].resize(numConnections); for (uint8 i = 0; i < numConnections; ++i) @@ -469,7 +502,7 @@ class DatabaseWorkerPool T* t; if (type == IDX_ASYNC) - t = new T(_queue, *_connectionInfo); + t = new T(_queue.get(), *_connectionInfo); else if (type == IDX_SYNCH) t = new T(*_connectionInfo); else @@ -478,35 +511,32 @@ class DatabaseWorkerPool _connections[type][i] = t; ++_connectionCount[type]; - bool res = t->Open(); + uint32 error = t->Open(); - if (res) + if (!error) { if (mysql_get_server_version(t->GetHandle()) < MIN_MYSQL_SERVER_VERSION) { TC_LOG_ERROR("sql.driver", "TrinityCore does not support MySQL versions below 5.1"); - res = false; + error = 1; } } // Failed to open a connection or invalid version, abort and cleanup - if (!res) + if (error) { - TC_LOG_ERROR("sql.driver", "DatabasePool %s NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile " - "for specific errors. Read wiki at http://collab.kpsn.org/display/tc/TrinityCore+Home", GetDatabaseName()); - while (_connectionCount[type] != 0) { T* t = _connections[type][i--]; delete t; --_connectionCount[type]; } - - return false; + return error; } } - return true; + // Everything is fine + return 0; } unsigned long EscapeString(char *to, const char *from, unsigned long length) @@ -546,10 +576,13 @@ class DatabaseWorkerPool return _connectionInfo->database.c_str(); } - ProducerConsumerQueue* _queue; //! Queue shared by async worker threads. - std::vector< std::vector > _connections; - uint32 _connectionCount[2]; //! Counter of MySQL connections; - MySQLConnectionInfo* _connectionInfo; + //! Queue shared by async worker threads. + std::unique_ptr> _queue; + std::vector> _connections; + //! Counter of MySQL connections; + uint32 _connectionCount[IDX_SIZE]; + std::unique_ptr _connectionInfo; + uint8 _async_threads, _synch_threads; }; #endif diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp index 1a9f973d47b..1fa3f01a5e1 100644 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/shared/Database/MySQLConnection.cpp @@ -72,7 +72,7 @@ void MySQLConnection::Close() delete this; } -bool MySQLConnection::Open() +uint32 MySQLConnection::Open() { MYSQL *mysqlInit; mysqlInit = mysql_init(NULL); @@ -137,13 +137,13 @@ bool MySQLConnection::Open() // set connection properties to UTF8 to properly handle locales for different // server configs - core sends data in UTF8, so MySQL must expect UTF8 too mysql_set_character_set(m_Mysql, "utf8"); - return PrepareStatements(); + return 0; } else { - TC_LOG_ERROR("sql.sql", "Could not connect to MySQL database at %s: %s\n", m_connectionInfo.host.c_str(), mysql_error(mysqlInit)); + TC_LOG_ERROR("sql.sql", "Could not connect to MySQL database at %s: %s", m_connectionInfo.host.c_str(), mysql_error(mysqlInit)); mysql_close(mysqlInit); - return false; + return mysql_errno(mysqlInit); } } diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h index d486f5b4679..78d8d2fb5dd 100644 --- a/src/server/shared/Database/MySQLConnection.h +++ b/src/server/shared/Database/MySQLConnection.h @@ -72,9 +72,11 @@ class MySQLConnection MySQLConnection(ProducerConsumerQueue* queue, MySQLConnectionInfo& connInfo); //! Constructor for asynchronous connections. virtual ~MySQLConnection(); - virtual bool Open(); + virtual uint32 Open(); void Close(); + bool PrepareStatements(); + public: bool Execute(const char* sql); bool Execute(PreparedStatement* stmt); @@ -111,7 +113,6 @@ class MySQLConnection MySQLPreparedStatement* GetPreparedStatement(uint32 index); void PrepareStatement(uint32 index, const char* sql, ConnectionFlags flags); - bool PrepareStatements(); virtual void DoPrepareStatements() = 0; protected: diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/shared/Updater/DBUpdater.cpp new file mode 100644 index 00000000000..68c8b76e3f7 --- /dev/null +++ b/src/server/shared/Updater/DBUpdater.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "DBUpdater.h" +#include "Log.h" +#include "revision.h" +#include "UpdateFetcher.h" +#include "DatabaseLoader.h" +#include "Config.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace boost::process; +using namespace boost::process::initializers; +using namespace boost::iostreams; + +template +std::string DBUpdater::GetSourceDirectory() +{ + std::string const entry = sConfigMgr->GetStringDefault("Updates.SourcePath", ""); + if (!entry.empty()) + return entry; + else + return _SOURCE_DIRECTORY; +} + +template +std::string DBUpdater::GetMySqlCli() +{ + std::string const entry = sConfigMgr->GetStringDefault("Updates.MySqlCLIPath", ""); + if (!entry.empty()) + return entry; + else + return _MYSQL_EXECUTABLE; +} + +// Auth Database +template<> +std::string DBUpdater::GetConfigEntry() +{ + return "Updates.Auth"; +} + +template<> +std::string DBUpdater::GetTableName() +{ + return "Auth"; +} + +template<> +std::string DBUpdater::GetBaseFile() +{ + return DBUpdater::GetSourceDirectory() + "/sql/base/auth_database.sql"; +} + +template<> +bool DBUpdater::IsEnabled(uint32 const updateMask) +{ + // This way silences warnings under msvc + return (updateMask & DatabaseLoader::DATABASE_LOGIN) ? true : false; +} + +// World Database +template<> +std::string DBUpdater::GetConfigEntry() +{ + return "Updates.World"; +} + +template<> +std::string DBUpdater::GetTableName() +{ + return "World"; +} + +template<> +std::string DBUpdater::GetBaseFile() +{ + return _FULL_DATABASE; +} + +template<> +bool DBUpdater::IsEnabled(uint32 const updateMask) +{ + // This way silences warnings under msvc + return (updateMask & DatabaseLoader::DATABASE_WORLD) ? true : false; +} + +template<> +BaseLocation DBUpdater::GetBaseLocationType() +{ + return LOCATION_DOWNLOAD; +} + +// Character Database +template<> +std::string DBUpdater::GetConfigEntry() +{ + return "Updates.Character"; +} + +template<> +std::string DBUpdater::GetTableName() +{ + return "Character"; +} + +template<> +std::string DBUpdater::GetBaseFile() +{ + return DBUpdater::GetSourceDirectory() + "/sql/base/characters_database.sql"; +} + +template<> +bool DBUpdater::IsEnabled(uint32 const updateMask) +{ + // This way silences warnings under msvc + return (updateMask & DatabaseLoader::DATABASE_CHARACTER) ? true : false; +} + +// Hotfix Database +template<> +std::string DBUpdater::GetConfigEntry() +{ + return "Updates.Hotfix"; +} + +template<> +std::string DBUpdater::GetTableName() +{ + return "Hotfixes"; +} + +template<> +std::string DBUpdater::GetBaseFile() +{ + return DBUpdater::GetSourceDirectory() + "/sql/base/hotfixes_database.sql"; +} + +template<> +bool DBUpdater::IsEnabled(uint32 const updateMask) +{ + // This way silences warnings under msvc + return (updateMask & DatabaseLoader::DATABASE_HOTFIX) ? true : false; +} + +// All +template +BaseLocation DBUpdater::GetBaseLocationType() +{ + return LOCATION_REPOSITORY; +} + +template +bool DBUpdater::CheckExecutable() +{ + DBUpdater::Path const exe(DBUpdater::GetMySqlCli()); + if (!exists(exe)) + { + // Check for mysql in path + std::vector args = {"--version"}; + uint32 ret; + try + { + child c = execute(run_exe("mysql"), set_args(args), throw_on_error(), close_stdout()); + ret = wait_for_exit(c); + } + catch (boost::system::system_error&) + { + ret = EXIT_FAILURE; + } + + if (ret == EXIT_FAILURE) + { + TC_LOG_FATAL("sql.updates", "Didn't find executeable mysql binary at \'%s\', correct the path in the *.conf (\"Updates.MySqlCLIPath\").", + absolute(exe).generic_string().c_str()); + + return false; + } + } + return true; +} + +template +bool DBUpdater::Create(DatabaseWorkerPool& pool) +{ + TC_LOG_INFO("sql.updates", "Database \"%s\" does not exist, do you want to create it? [yes (default) / no]: ", + pool.GetConnectionInfo()->database.c_str()); + + std::string answer; + std::getline(std::cin, answer); + if (!answer.empty() && !(answer.substr(0, 1) == "y")) + return false; + + TC_LOG_INFO("sql.updates", "Creating database \"%s\"...", pool.GetConnectionInfo()->database.c_str()); + + // Path of temp file + static Path const temp("create_table.sql"); + + // Create temporary query to use external mysql cli + std::ofstream file(temp.generic_string()); + if (!file.is_open()) + { + TC_LOG_FATAL("sql.updates", "Failed to create temporary query file \"%s\"!", temp.generic_string().c_str()); + return false; + } + + file << "CREATE DATABASE `" << pool.GetConnectionInfo()->database << "` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci\n\n"; + + file.close(); + + try + { + DBUpdater::ApplyFile(pool, pool.GetConnectionInfo()->host, pool.GetConnectionInfo()->user, pool.GetConnectionInfo()->password, + pool.GetConnectionInfo()->port_or_socket, "", temp); + } + catch (UpdateException&) + { + TC_LOG_FATAL("sql.updates", "Failed to create database %s! Has the user `CREATE` priviliges?", pool.GetConnectionInfo()->database.c_str()); + boost::filesystem::remove(temp); + return false; + } + + TC_LOG_INFO("sql.updates", "Done."); + boost::filesystem::remove(temp); + return true; +} + +template +bool DBUpdater::Update(DatabaseWorkerPool& pool) +{ + if (!DBUpdater::CheckExecutable()) + return false; + + TC_LOG_INFO("sql.updates", "Updating %s database...", DBUpdater::GetTableName().c_str()); + + Path const sourceDirectory(GetSourceDirectory()); + + if (!is_directory(sourceDirectory)) + { + TC_LOG_ERROR("sql.updates", "DBUpdater: Given source directory %s does not exist, skipped!", sourceDirectory.generic_string().c_str()); + return false; + } + + UpdateFetcher updateFetcher(sourceDirectory, [&](std::string const& query) { DBUpdater::Apply(pool, query); }, + [&](Path const& file) { DBUpdater::ApplyFile(pool, file); }, + [&](std::string const& query) -> QueryResult { return DBUpdater::Retrieve(pool, query); }); + + uint32 const count = updateFetcher.Update( + sConfigMgr->GetBoolDefault("Updates.Redundancy", true), + sConfigMgr->GetBoolDefault("Updates.AllowRehash", true), + sConfigMgr->GetBoolDefault("Updates.ArchivedRedundancy", false), + sConfigMgr->GetBoolDefault("Updates.CleanDeadRef", true)); + + if (!count) + TC_LOG_INFO("sql.updates", ">> %s database is up-to-date!", DBUpdater::GetTableName().c_str()); + else + TC_LOG_INFO("sql.updates", ">> Applied %d %s.", count, count == 1 ? "query" : "queries"); + + return true; +} + +template +bool DBUpdater::Populate(DatabaseWorkerPool& pool) +{ + { + QueryResult const result = Retrieve(pool, "SHOW TABLES"); + if (result && (result->GetRowCount() > 0)) + return true; + } + + if (!DBUpdater::CheckExecutable()) + return false; + + TC_LOG_INFO("sql.updates", "Database %s is empty, auto populating it...", DBUpdater::GetTableName().c_str()); + + std::string const p = DBUpdater::GetBaseFile(); + if (p.empty()) + { + TC_LOG_INFO("sql.updates", ">> No base file provided, skipped!"); + return true; + } + + Path const base(p); + if (!exists(base)) + { + switch (DBUpdater::GetBaseLocationType()) + { + case LOCATION_REPOSITORY: + { + TC_LOG_ERROR("sql.updates", ">> Base file \"%s\" is missing, try to clone the source again.", + base.generic_string().c_str(), base.filename().generic_string().c_str()); + + break; + } + case LOCATION_DOWNLOAD: + { + TC_LOG_ERROR("sql.updates", ">> File \"%s\" is missing, download it from \"http://www.trinitycore.org/f/files/category/1-database/\"" \ + " and place it in your server directory.", base.filename().generic_string().c_str()); + break; + } + } + return false; + } + + // Update database + TC_LOG_INFO("sql.updates", ">> Applying \'%s\'...", base.generic_string().c_str()); + ApplyFile(pool, base); + + TC_LOG_INFO("sql.updates", ">> Done!"); + return true; +} + +template +QueryResult DBUpdater::Retrieve(DatabaseWorkerPool& pool, std::string const& query) +{ + return pool.PQuery(query.c_str()); +} + +template +void DBUpdater::Apply(DatabaseWorkerPool& pool, std::string const& query) +{ + pool.DirectExecute(query.c_str()); +} + +template +void DBUpdater::ApplyFile(DatabaseWorkerPool& pool, Path const& path) +{ + DBUpdater::ApplyFile(pool, pool.GetConnectionInfo()->host, pool.GetConnectionInfo()->user, pool.GetConnectionInfo()->password, + pool.GetConnectionInfo()->port_or_socket, pool.GetConnectionInfo()->database, path); +} + +template +void DBUpdater::ApplyFile(DatabaseWorkerPool& pool, std::string const& host, std::string const& user, + std::string const& password, std::string const& port_or_socket, std::string const& database, Path const& path) +{ + std::vector args; + args.reserve(7); + + // CLI Client connection info + args.push_back("-h" + host); + args.push_back("-u" + user); + args.push_back("-p" + password); + args.push_back("-P" + port_or_socket); + + // Set the default charset to utf8 + args.push_back("--default-character-set=utf8"); + + // Set max allowed packet to 1 GB + args.push_back("--max-allowed-packet=1GB"); + + // Database + if (!database.empty()) + args.push_back(database); + + // ToDo: use the existing query in memory as virtual file if possible + file_descriptor_source source(path); + + uint32 ret; + try + { + child c = execute(run_exe(DBUpdater::GetMySqlCli().empty() ? "mysql" : + boost::filesystem::absolute(DBUpdater::GetMySqlCli()).generic_string()), + set_args(args), bind_stdin(source), throw_on_error()); + + ret = wait_for_exit(c); + } + catch (boost::system::system_error&) + { + ret = EXIT_FAILURE; + } + + source.close(); + + if (ret != EXIT_SUCCESS) + { + TC_LOG_FATAL("sql.updates", "Applying of file \'%s\' to database \'%s\' failed!" \ + " If you are an user pull the latest revision from the repository. If you are a developer fix your sql query.", + path.generic_string().c_str(), pool.GetConnectionInfo()->database.c_str()); + + throw UpdateException("update failed"); + } +} + +template class DBUpdater; +template class DBUpdater; +template class DBUpdater; +template class DBUpdater; diff --git a/src/server/shared/Updater/DBUpdater.h b/src/server/shared/Updater/DBUpdater.h new file mode 100644 index 00000000000..0caf8a438fb --- /dev/null +++ b/src/server/shared/Updater/DBUpdater.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef DBUpdater_h__ +#define DBUpdater_h__ + +#include "DatabaseEnv.h" + +#include +#include + +class UpdateException : public std::exception +{ +public: + UpdateException(std::string const& msg) : _msg(msg) { } + ~UpdateException() throw() { } + + char const* what() const throw() override { return _msg.c_str(); } + +private: + std::string const _msg; +}; + +enum BaseLocation +{ + LOCATION_REPOSITORY, + LOCATION_DOWNLOAD +}; + +template +class DBUpdater +{ +public: + using Path = boost::filesystem::path; + + static std::string GetSourceDirectory(); + + static inline std::string GetConfigEntry(); + + static inline std::string GetTableName(); + + static std::string GetBaseFile(); + + static bool IsEnabled(uint32 const updateMask); + + static BaseLocation GetBaseLocationType(); + + static bool Create(DatabaseWorkerPool& pool); + + static bool Update(DatabaseWorkerPool& pool); + + static bool Populate(DatabaseWorkerPool& pool); + +private: + static std::string GetMySqlCli(); + static bool CheckExecutable(); + + static QueryResult Retrieve(DatabaseWorkerPool& pool, std::string const& query); + static void Apply(DatabaseWorkerPool& pool, std::string const& query); + static void ApplyFile(DatabaseWorkerPool& pool, Path const& path); + static void ApplyFile(DatabaseWorkerPool& pool, std::string const& host, std::string const& user, + std::string const& password, std::string const& port_or_socket, std::string const& database, Path const& path); +}; + +#endif // DBUpdater_h__ diff --git a/src/server/shared/Updater/UpdateFetcher.cpp b/src/server/shared/Updater/UpdateFetcher.cpp new file mode 100644 index 00000000000..8084c6ba37f --- /dev/null +++ b/src/server/shared/Updater/UpdateFetcher.cpp @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "UpdateFetcher.h" +#include "Log.h" +#include "Util.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace boost::filesystem; + +UpdateFetcher::UpdateFetcher(Path const& sourceDirectory, + std::function const& apply, + std::function const& applyFile, + std::function const& retrieve) : + _sourceDirectory(sourceDirectory), _apply(apply), _applyFile(applyFile), + _retrieve(retrieve) +{ +} + +UpdateFetcher::LocaleFileStorage UpdateFetcher::GetFileList() const +{ + LocaleFileStorage files; + DirectoryStorage directories = ReceiveIncludedDirectories(); + for (auto const& entry : directories) + FillFileListRecursively(entry.path, files, entry.state, 1); + + return files; +} + +void UpdateFetcher::FillFileListRecursively(Path const& path, LocaleFileStorage& storage, State const state, uint32 const depth) const +{ + static uint32 const MAX_DEPTH = 10; + static directory_iterator const end; + + for (directory_iterator itr(path); itr != end; ++itr) + { + if (is_directory(itr->path())) + { + if (depth < MAX_DEPTH) + FillFileListRecursively(itr->path(), storage, state, depth + 1); + } + else if (itr->path().extension() == ".sql") + { + TC_LOG_TRACE("sql.updates", "Added locale file \"%s\".", itr->path().filename().generic_string().c_str()); + + LocaleFileEntry const entry = { itr->path(), state }; + + // Check for doubled filenames + // Since elements are only compared through their filenames this is ok + if (storage.find(entry) != storage.end()) + { + TC_LOG_FATAL("sql.updates", "Duplicated filename occurred \"%s\", since updates are ordered " \ + "through its filename every name needs to be unique!", itr->path().generic_string().c_str()); + + throw UpdateException("Updating failed, see the log for details."); + } + + storage.insert(entry); + } + } +} + +UpdateFetcher::DirectoryStorage UpdateFetcher::ReceiveIncludedDirectories() const +{ + DirectoryStorage directories; + + QueryResult const result = _retrieve("SELECT `path`, `state` FROM `updates_include`"); + if (!result) + return directories; + + do + { + Field* fields = result->Fetch(); + + std::string path = fields[0].GetString(); + if (path.substr(0, 1) == "$") + path = _sourceDirectory.generic_string() + path.substr(1); + + Path const p(path); + + if (!is_directory(p)) + { + TC_LOG_ERROR("sql.updates", "DBUpdater: Given update include directory \"%s\" isn't existing, skipped!", p.generic_string().c_str()); + continue; + } + + DirectoryEntry const entry = { p, AppliedFileEntry::StateConvert(fields[1].GetString()) }; + directories.push_back(entry); + + TC_LOG_TRACE("sql.updates", "Added applied file \"%s\" from remote.", p.filename().generic_string().c_str()); + + } while (result->NextRow()); + + return directories; +} + +UpdateFetcher::AppliedFileStorage UpdateFetcher::ReceiveAppliedFiles() const +{ + AppliedFileStorage map; + + QueryResult result = _retrieve("SELECT `name`, `hash`, `state`, `timestamp` FROM `updates` ORDER BY `name` ASC"); + if (!result) + return map; + + do + { + Field* fields = result->Fetch(); + + AppliedFileEntry const entry = { fields[0].GetString(), fields[1].GetString(), + AppliedFileEntry::StateConvert(fields[2].GetString()), fields[3].GetUInt32() }; + + map.insert(std::make_pair(entry.name, entry)); + } + while (result->NextRow()); + + return map; +} + +UpdateFetcher::SQLUpdate UpdateFetcher::ReadSQLUpdate(boost::filesystem::path const& file) const +{ + std::ifstream in(file.c_str()); + WPFatal(in.is_open(), "Could not read an update file."); + + auto const start_pos = in.tellg(); + in.ignore(std::numeric_limits::max()); + auto const char_count = in.gcount(); + in.seekg(start_pos); + + SQLUpdate const update(new std::string(char_count, char{})); + + in.read(&(*update)[0], update->size()); + in.close(); + return update; +} + +uint32 UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, bool const cleanDeadReferences) const +{ + LocaleFileStorage const available = GetFileList(); + AppliedFileStorage applied = ReceiveAppliedFiles(); + + // Fill hash to name cache + HashToFileNameStorage hashToName; + for (auto entry : applied) + hashToName.insert(std::make_pair(entry.second.hash, entry.first)); + + uint32 importedUpdates = 0; + + for (auto const& availableQuery : available) + { + TC_LOG_DEBUG("sql.updates", "Checking update \"%s\"...", availableQuery.first.filename().generic_string().c_str()); + + AppliedFileStorage::const_iterator iter = applied.find(availableQuery.first.filename().string()); + if (iter != applied.end()) + { + // If redundancy is disabled skip it since the update is already applied. + if (!redundancyChecks) + { + TC_LOG_DEBUG("sql.updates", ">> Update is already applied, skipping redundancy checks."); + applied.erase(iter); + continue; + } + + // If the update is in an archived directory and is marked as archived in our database skip redundancy checks (archived updates never change). + if (!archivedRedundancy && (iter->second.state == ARCHIVED) && (availableQuery.second == ARCHIVED)) + { + TC_LOG_DEBUG("sql.updates", ">> Update is archived and marked as archived in database, skipping redundancy checks."); + applied.erase(iter); + continue; + } + } + + // Read update from file + SQLUpdate const update = ReadSQLUpdate(availableQuery.first); + + // Calculate hash + std::string const hash = CalculateHash(update); + + UpdateMode mode = MODE_APPLY; + + // Update is not in our applied list + if (iter == applied.end()) + { + // Catch renames (different filename but same hash) + HashToFileNameStorage::const_iterator const hashIter = hashToName.find(hash); + if (hashIter != hashToName.end()) + { + // Check if the original file was removed if not we've got a problem. + LocaleFileStorage::const_iterator localeIter; + // Push localeIter forward + for (localeIter = available.begin(); (localeIter != available.end()) && + (localeIter->first.filename().string() != hashIter->second); ++localeIter); + + // Conflict! + if (localeIter != available.end()) + { + TC_LOG_WARN("sql.updates", ">> Seems like update \"%s\" \'%s\' was renamed, but the old file is still there! " \ + "Trade it as a new file! (Probably its an unmodified copy of file \"%s\")", + availableQuery.first.filename().string().c_str(), hash.substr(0, 7).c_str(), + localeIter->first.filename().string().c_str()); + } + // Its save to trade the file as renamed here + else + { + TC_LOG_INFO("sql.updates", ">> Renaming update \"%s\" to \"%s\" \'%s\'.", + hashIter->second.c_str(), availableQuery.first.filename().string().c_str(), hash.substr(0, 7).c_str()); + + RenameEntry(hashIter->second, availableQuery.first.filename().string()); + applied.erase(hashIter->second); + continue; + } + } + // Apply the update if it was never seen before. + else + { + TC_LOG_INFO("sql.updates", ">> Applying update \"%s\" \'%s\'...", + availableQuery.first.filename().string().c_str(), hash.substr(0, 7).c_str()); + } + } + // Rehash the update entry if it is contained in our database but with an empty hash. + else if (allowRehash && iter->second.hash.empty()) + { + mode = MODE_REHASH; + + TC_LOG_INFO("sql.updates", ">> Re-hashing update \"%s\" \'%s\'...", availableQuery.first.filename().string().c_str(), + hash.substr(0, 7).c_str()); + } + else + { + // If the hash of the files differs from the one stored in our database reapply the update (because it was changed). + if (iter->second.hash != hash) + { + TC_LOG_INFO("sql.updates", ">> Reapplying update \"%s\" \'%s\' -> \'%s\' (it changed)...", availableQuery.first.filename().string().c_str(), + iter->second.hash.substr(0, 7).c_str(), hash.substr(0, 7).c_str()); + } + else + { + // If the file wasn't changed and just moved update its state if necessary. + if (iter->second.state != availableQuery.second) + { + TC_LOG_DEBUG("sql.updates", ">> Updating state of \"%s\" to \'%s\'...", + availableQuery.first.filename().string().c_str(), AppliedFileEntry::StateConvert(availableQuery.second).c_str()); + + UpdateState(availableQuery.first.filename().string(), availableQuery.second); + } + + TC_LOG_DEBUG("sql.updates", ">> Update is already applied and is matching hash \'%s\'.", hash.substr(0, 7).c_str()); + + applied.erase(iter); + continue; + } + } + + uint32 speed = 0; + AppliedFileEntry const file = { availableQuery.first.filename().string(), hash, availableQuery.second, 0 }; + + switch (mode) + { + case MODE_APPLY: + speed = Apply(availableQuery.first); + /*no break*/ + case MODE_REHASH: + UpdateEntry(file, speed); + break; + } + + if (iter != applied.end()) + applied.erase(iter); + + if (mode == MODE_APPLY) + ++importedUpdates; + } + + for (auto const& entry : applied) + { + TC_LOG_WARN("sql.updates", ">> File \'%s\' was applied to the database but is missing in" \ + " your update directory now!%s", entry.first.c_str(), cleanDeadReferences ? " Deleting orphaned entry..." : ""); + } + + if (cleanDeadReferences) + CleanUp(applied); + + return importedUpdates; +} + +std::string UpdateFetcher::CalculateHash(SQLUpdate const& query) const +{ + // Calculate a Sha1 hash based on query content. + unsigned char digest[SHA_DIGEST_LENGTH]; + SHA1((unsigned char*)query->c_str(), query->length(), (unsigned char*)&digest); + + return ByteArrayToHexStr(digest, SHA_DIGEST_LENGTH); +} + +uint32 UpdateFetcher::Apply(Path const& path) const +{ + using Time = std::chrono::high_resolution_clock; + using ms = std::chrono::milliseconds; + + // Benchmark query speed + auto const begin = Time::now(); + + // Update database + _applyFile(path); + + // Return time the query took to apply + return std::chrono::duration_cast(Time::now() - begin).count(); +} + +void UpdateFetcher::UpdateEntry(AppliedFileEntry const& entry, uint32 const speed) const +{ + std::string const update = "REPLACE INTO `updates` (`name`, `hash`, `state`, `speed`) VALUES (\"" + + entry.name + "\", \"" + entry.hash + "\", \'" + entry.GetStateAsString() + "\', " + std::to_string(speed) + ")"; + + // Update database + _apply(update); +} + +void UpdateFetcher::RenameEntry(std::string const& from, std::string const& to) const +{ + // Delete target if it exists + { + std::string const update = "DELETE FROM `updates` WHERE `name`=\"" + to + "\""; + + // Update database + _apply(update); + } + + // Rename + { + std::string const update = "UPDATE `updates` SET `name`=\"" + to + "\" WHERE `name`=\"" + from + "\""; + + // Update database + _apply(update); + } +} + +void UpdateFetcher::CleanUp(AppliedFileStorage const& storage) const +{ + if (storage.empty()) + return; + + std::stringstream update; + size_t remaining = storage.size(); + + update << "DELETE FROM `updates` WHERE `name` IN("; + + for (auto const& entry : storage) + { + update << "\"" << entry.first << "\""; + if ((--remaining) > 0) + update << ", "; + } + + update << ")"; + + // Update database + _apply(update.str()); +} + +void UpdateFetcher::UpdateState(std::string const& name, State const state) const +{ + std::string const update = "UPDATE `updates` SET `state`=\'" + AppliedFileEntry::StateConvert(state) + "\' WHERE `name`=\"" + name + "\""; + + // Update database + _apply(update); +} diff --git a/src/server/shared/Updater/UpdateFetcher.h b/src/server/shared/Updater/UpdateFetcher.h new file mode 100644 index 00000000000..b348eecf4e1 --- /dev/null +++ b/src/server/shared/Updater/UpdateFetcher.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2008-2015 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef UpdateFetcher_h__ +#define UpdateFetcher_h__ + +#include + +#include +#include +#include +#include +#include + +class UpdateFetcher +{ + using Path = boost::filesystem::path; + +public: + UpdateFetcher(Path const& updateDirectory, + std::function const& apply, + std::function const& applyFile, + std::function const& retrieve); + + uint32 Update(bool const redundancyChecks, bool const allowRehash, + bool const archivedRedundancy, bool const cleanDeadReferences) const; + +private: + enum UpdateMode + { + MODE_APPLY, + MODE_REHASH + }; + + enum State + { + RELEASED, + ARCHIVED + }; + + struct AppliedFileEntry + { + std::string const name; + + std::string const hash; + + State const state; + + uint32 const timestamp; + + static inline State StateConvert(std::string const& state) + { + return (state == "RELEASED") ? RELEASED : ARCHIVED; + } + + static inline std::string StateConvert(State const state) + { + return (state == RELEASED) ? "RELEASED" : "ARCHIVED"; + } + + std::string GetStateAsString() const + { + return StateConvert(state); + } + }; + + struct DirectoryEntry + { + Path const path; + + State const state; + }; + + using LocaleFileEntry = std::pair; + + struct PathCompare + { + inline bool operator() (LocaleFileEntry const& left, LocaleFileEntry const& right) const + { + return left.first.filename().string() < right.first.filename().string(); + } + }; + + using LocaleFileStorage = boost::container::flat_set; + using HashToFileNameStorage = std::unordered_map; + using AppliedFileStorage = std::unordered_map; + using DirectoryStorage = std::vector; + using SQLUpdate = std::shared_ptr; + + LocaleFileStorage GetFileList() const; + void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, State const state, uint32 const depth) const; + + DirectoryStorage ReceiveIncludedDirectories() const; + AppliedFileStorage ReceiveAppliedFiles() const; + + SQLUpdate ReadSQLUpdate(Path const& file) const; + std::string CalculateHash(SQLUpdate const& query) const; + + uint32 Apply(Path const& path) const; + + void UpdateEntry(AppliedFileEntry const& entry, uint32 const speed = 0) const; + void RenameEntry(std::string const& from, std::string const& to) const; + void CleanUp(AppliedFileStorage const& storage) const; + + void UpdateState(std::string const& name, State const state) const; + + Path const _sourceDirectory; + + std::function const _apply; + std::function const _applyFile; + std::function const _retrieve; +}; + +#endif // UpdateFetcher_h__ diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index 683c4de8eb8..63da20df2c7 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -49,6 +49,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zmqpp + ${CMAKE_SOURCE_DIR}/dep/process ${CMAKE_SOURCE_DIR}/src/server/collision ${CMAKE_SOURCE_DIR}/src/server/collision/Management ${CMAKE_SOURCE_DIR}/src/server/collision/Models @@ -65,6 +66,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Threading + ${CMAKE_SOURCE_DIR}/src/server/shared/Updater ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_SOURCE_DIR}/src/server/ipc ${CMAKE_SOURCE_DIR}/src/server/game diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 15d08a903b9..032c8428445 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -44,6 +44,7 @@ #include "WorldSocketMgr.h" #include "BattlenetServerManager.h" #include "Realm/Realm.h" +#include "DatabaseLoader.h" #include #include #include @@ -520,105 +521,16 @@ bool StartDB() { MySQL::Library_Init(); - std::string dbString; - uint8 asyncThreads, synchThreads; + // Load databases + DatabaseLoader loader("server.worldserver", DatabaseLoader::DATABASE_MASK_ALL); + loader + .AddDatabase(HotfixDatabase, "Hotfix") + .AddDatabase(WorldDatabase, "World") + .AddDatabase(CharacterDatabase, "Character") + .AddDatabase(LoginDatabase, "Login"); - dbString = sConfigMgr->GetStringDefault("WorldDatabaseInfo", ""); - if (dbString.empty()) - { - TC_LOG_ERROR("server.worldserver", "World database not specified in configuration file"); - return false; - } - - asyncThreads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.WorkerThreads", 1)); - if (asyncThreads < 1 || asyncThreads > 32) - { - TC_LOG_ERROR("server.worldserver", "World database: invalid number of worker threads specified. " - "Please pick a value between 1 and 32."); - return false; - } - - synchThreads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.SynchThreads", 1)); - ///- Initialize the world database - if (!WorldDatabase.Open(dbString, asyncThreads, synchThreads)) - { - TC_LOG_ERROR("server.worldserver", "Cannot connect to world database %s", dbString.c_str()); - return false; - } - - ///- Get character database info from configuration file - dbString = sConfigMgr->GetStringDefault("CharacterDatabaseInfo", ""); - if (dbString.empty()) - { - TC_LOG_ERROR("server.worldserver", "Character database not specified in configuration file"); - return false; - } - - asyncThreads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.WorkerThreads", 1)); - if (asyncThreads < 1 || asyncThreads > 32) - { - TC_LOG_ERROR("server.worldserver", "Character database: invalid number of worker threads specified. " - "Please pick a value between 1 and 32."); - return false; - } - - synchThreads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.SynchThreads", 2)); - - ///- Initialize the Character database - if (!CharacterDatabase.Open(dbString, asyncThreads, synchThreads)) - { - TC_LOG_ERROR("server.worldserver", "Cannot connect to Character database %s", dbString.c_str()); - return false; - } - - ///- Get hotfixes database info from configuration file - dbString = sConfigMgr->GetStringDefault("HotfixDatabaseInfo", ""); - if (dbString.empty()) - { - TC_LOG_ERROR("server.worldserver", "Hotfixes database not specified in configuration file"); - return false; - } - - asyncThreads = uint8(sConfigMgr->GetIntDefault("HotfixDatabase.WorkerThreads", 1)); - if (asyncThreads < 1 || asyncThreads > 32) - { - TC_LOG_ERROR("server.worldserver", "Hotfixes database: invalid number of worker threads specified. " - "Please pick a value between 1 and 32."); - return false; - } - - synchThreads = uint8(sConfigMgr->GetIntDefault("HotfixDatabase.SynchThreads", 2)); - - ///- Initialize the hotfixes database - if (!HotfixDatabase.Open(dbString, asyncThreads, synchThreads)) - { - TC_LOG_ERROR("server.worldserver", "Cannot connect to the hotfix database %s", dbString.c_str()); - return false; - } - - ///- Get login database info from configuration file - dbString = sConfigMgr->GetStringDefault("LoginDatabaseInfo", ""); - if (dbString.empty()) - { - TC_LOG_ERROR("server.worldserver", "Login database not specified in configuration file"); - return false; - } - - asyncThreads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.WorkerThreads", 1)); - if (asyncThreads < 1 || asyncThreads > 32) - { - TC_LOG_ERROR("server.worldserver", "Login database: invalid number of worker threads specified. " - "Please pick a value between 1 and 32."); - return false; - } - - synchThreads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.SynchThreads", 1)); - ///- Initialise the login database - if (!LoginDatabase.Open(dbString, asyncThreads, synchThreads)) - { - TC_LOG_ERROR("server.worldserver", "Cannot connect to login database %s", dbString.c_str()); + if (!loader.Load()) return false; - } ///- Get the realm Id from the configuration file realmHandle.Index = sConfigMgr->GetIntDefault("RealmID", 0); @@ -628,6 +540,7 @@ bool StartDB() return false; } + // Realm Handles QueryResult realmIdQuery = LoginDatabase.PQuery("SELECT `Region`,`Battlegroup` FROM `realmlist` WHERE `id`=%u", realmHandle.Index); if (!realmIdQuery) { diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 86d9dac2946..4254061e2fa 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -11,6 +11,7 @@ # PERFORMANCE SETTINGS # SERVER LOGGING # SERVER SETTINGS +# UPDATE SETTINGS # WARDEN SETTINGS # PLAYER INTERACTION # CREATURE SETTINGS @@ -1129,6 +1130,90 @@ FeatureSystem.CharacterUndelete.Cooldown = 2592000 # ################################################################################################### +################################################################################################### +# UPDATE SETTINGS +# +# Updates.EnableDatabases +# Description: A mask that describes which databases shall be updated. +# +# Following flags are available +# DATABASE_LOGIN = 1, // Auth database +# DATABASE_CHARACTER = 2, // Character database +# DATABASE_WORLD = 4, // World database +# DATABASE_HOTFIX = 8, // Hotfixes database +# +# Default: 15 - (All enabled) +# 4 - (Enable world only) +# 0 - (All Disabled) + +Updates.EnableDatabases = 15 + +# +# Updates.SourcePath +# Description: The path to your TrinityCore source directory. +# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +Updates.SourcePath = "" + +# +# Updates.SourcePath +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +Updates.MySqlCLIPath = "" + +# +# Updates.AutoSetup +# Description: Auto populate empty databases. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AutoSetup = 1 + +# +# Updates.Redundancy +# Description: Perform data redundancy checks through hashing +# to detect changes on sql updates and reapply it. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.Redundancy = 1 + +# +# Updates.ArchivedRedundancy +# Description: Check hashes of archived updates (slows down startup). +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Updates.ArchivedRedundancy = 0 + +# +# Updates.AllowRehash +# Description: Inserts the current file hash in the database if it is left empty. +# Useful if you want to mark a file as applied but you don't know its hash. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AllowRehash = 1 + +# +# Updates.CleanDeadRef +# Description: Cleans dead/ orphaned references that occure if a update was deleted or renamed and edited. +# Disable this if you want to know if the database is in a possible "dirty state". +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.CleanDeadRef = 1 + +# +################################################################################################### + ################################################################################################### # WARDEN SETTINGS # @@ -3224,6 +3309,7 @@ Logger.root=5,Console Server Logger.server=3,Console Server Logger.commands.gm=3,Console GM Logger.sql.sql=5,Console DBErrors +Logger.sql.updates=3,Console Server #Logger.achievement=3,Console Server #Logger.ahbot=3,Console Server -- cgit v1.2.3 From ee3a111756799c54a2d9f983c4e0a587c5add72a Mon Sep 17 00:00:00 2001 From: Rat Date: Sat, 21 Mar 2015 21:54:56 +0100 Subject: Core/Spells: updated spelleffect, auraeffect, spelltarget enums to 6.1, should fix most of the spell crashes --- src/server/game/Miscellaneous/SharedDefines.h | 28 ++++++++++++++++++++++- src/server/game/Spells/Auras/SpellAuraDefines.h | 7 +++++- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 5 ++++ 3 files changed, 38 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 5142eebbaa2..0f01ba2dfae 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1252,7 +1252,13 @@ enum SpellEffectName SPELL_EFFECT_242 = 242, SPELL_EFFECT_243 = 243, SPELL_EFFECT_244 = 244, - TOTAL_SPELL_EFFECTS = 245, + SPELL_EFFECT_245 = 245, + SPELL_EFFECT_246 = 246, + SPELL_EFFECT_247 = 247, + SPELL_EFFECT_248 = 248, + SPELL_EFFECT_249 = 249, + SPELL_EFFECT_250 = 250, + TOTAL_SPELL_EFFECTS = 251, }; enum SpellCastResult // 19702 @@ -1984,6 +1990,26 @@ enum Targets TARGET_UNK_125 = 125, TARGET_UNK_126 = 126, TARGET_UNK_127 = 127, + TARGET_UNK_128 = 128, + TARGET_UNK_129 = 129, + TARGET_UNK_130 = 130, + TARGET_UNK_131 = 131, + TARGET_UNK_132 = 132, + TARGET_UNK_133 = 133, + TARGET_UNK_134 = 134, + TARGET_UNK_135 = 135, + TARGET_UNK_136 = 136, + TARGET_UNK_137 = 137, + TARGET_UNK_138 = 138, + TARGET_UNK_139 = 139, + TARGET_UNK_140 = 140, + TARGET_UNK_141 = 141, + TARGET_UNK_142 = 142, + TARGET_UNK_143 = 143, + TARGET_UNK_144 = 144, + TARGET_UNK_145 = 145, + TARGET_UNK_146 = 146, + TARGET_UNK_147 = 147, TOTAL_SPELL_TARGETS }; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 112893fbc75..7e60ac9b5da 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -535,7 +535,12 @@ enum AuraType SPELL_AURA_476 = 476, SPELL_AURA_477 = 477, SPELL_AURA_478 = 478, - TOTAL_AURAS = 479 // 6.0.3 + SPELL_AURA_479 = 479, + SPELL_AURA_480 = 480, + SPELL_AURA_481 = 481, + SPELL_AURA_482 = 482, + SPELL_AURA_483 = 483, + TOTAL_AURAS = 484 }; enum AuraObjectType diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index dd90e10f7bb..e35b1a0a6b1 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -539,6 +539,11 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //476 &AuraEffect::HandleNULL, //477 &AuraEffect::HandleNULL, //478 + &AuraEffect::HandleNULL, //479 + &AuraEffect::HandleNULL, //480 + &AuraEffect::HandleNULL, //481 + &AuraEffect::HandleNULL, //482 + &AuraEffect::HandleNULL, //483 }; AuraEffect::AuraEffect(Aura* base, uint32 effIndex, int32 *baseAmount, Unit* caster) : -- cgit v1.2.3 From 3fef9dcd66a49732946df8993582ecc9e677ed76 Mon Sep 17 00:00:00 2001 From: Rat Date: Sat, 21 Mar 2015 22:00:46 +0100 Subject: Core/Spells: updated spelleffect array to 6.1 --- src/server/game/Spells/SpellEffects.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/server/game') diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index a5afe74728f..d464e305462 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -317,6 +317,12 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //242 SPELL_EFFECT_242 &Spell::EffectNULL, //243 SPELL_EFFECT_243 &Spell::EffectNULL, //244 SPELL_EFFECT_244 + &Spell::EffectNULL, //244 SPELL_EFFECT_245 + &Spell::EffectNULL, //244 SPELL_EFFECT_246 + &Spell::EffectNULL, //244 SPELL_EFFECT_247 + &Spell::EffectNULL, //244 SPELL_EFFECT_248 + &Spell::EffectNULL, //244 SPELL_EFFECT_249 + &Spell::EffectNULL, //244 SPELL_EFFECT_250 }; void Spell::EffectNULL(SpellEffIndex /*effIndex*/) -- cgit v1.2.3 From b4ec8ef339addf8ec39b6e2aa01ce664857735e0 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 21 Mar 2015 23:41:46 +0100 Subject: Core/GameObjects: Updated GameObjectTemplate::Data fields --- src/server/game/Entities/GameObject/GameObject.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/server/game') diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index d5d53df48c1..42b19771387 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -470,6 +470,7 @@ struct GameObjectTemplate { uint32 chairheight; // 0 chairheight, int, Min value: 0, Max value: 2, Default value: 1 int32 HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0 + uint32 SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0 } barberChair; // 33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING struct @@ -587,6 +588,8 @@ struct GameObjectTemplate { int32 mapID; // 0 mapID, References: Map, NoValue = -1 int32 namedset; // 1 named set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + uint32 Primarydoodadset; // 2 Primary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + uint32 Secondarydoodadset; // 3 Secondary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 } phaseableMO; // 44 GAMEOBJECT_TYPE_GARRISON_MONUMENT struct -- cgit v1.2.3 From 3799d454b36ef55148280311e8f096e877d12be8 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 21 Mar 2015 23:57:49 +0100 Subject: Scripts/Ulduar: Fix some Flame Leviathan issues Fix some Flame Leviathan issues: - Fix boss evading all the time due to bad Doors check - Opened "Lightning Door" to other bosses only after boss dies - Eject players from the vehicles when boss dies, make them untargetable and despawn them after 5 minutes (adjust the time to the blizzlike time of choice) (cherry picked from commit d888e4c7ad5ce48eb1f550b3e142dad16c026d0c) --- src/server/game/Instances/InstanceScript.cpp | 6 +++ src/server/game/Instances/InstanceScript.h | 8 +++- .../Northrend/Ulduar/Ulduar/instance_ulduar.cpp | 53 ++++++++++++++++++++++ .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 1 + 4 files changed, 66 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index b8f95b9407c..5da79a0a898 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -191,6 +191,12 @@ void InstanceScript::UpdateDoorState(GameObject* door) door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); } +BossInfo* InstanceScript::GetBossInfo(uint32 id) +{ + ASSERT(id < bosses.size()); + return &bosses[id]; +} + void InstanceScript::AddObject(Creature* obj, bool add) { ObjectInfoMap::const_iterator j = _creatureInfo.find(obj->GetEntry()); diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index acd511a402b..8c34e37976c 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -261,12 +261,16 @@ class InstanceScript : public ZoneScript void AddObject(GameObject* obj, bool add); void AddObject(WorldObject* obj, uint32 type, bool add); - void AddDoor(GameObject* door, bool add); + virtual void AddDoor(GameObject* door, bool add); void AddMinion(Creature* minion, bool add); - void UpdateDoorState(GameObject* door); + virtual void UpdateDoorState(GameObject* door); void UpdateMinionState(Creature* minion, EncounterState state); + // Exposes private data that should never be modified unless exceptional cases. + // Pay very much attention at how the returned BossInfo data is modified to avoid issues. + BossInfo* GetBossInfo(uint32 id); + // Instance Load and Save bool ReadSaveDataHeaders(std::istringstream& data); void ReadSaveDataBossStates(std::istringstream& data); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 56148480e11..32d3b35f35c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -16,6 +16,7 @@ */ #include "InstanceScript.h" +#include "Vehicle.h" #include "Player.h" #include "ScriptedCreature.h" #include "ScriptMgr.h" @@ -91,6 +92,7 @@ class instance_ulduar : public InstanceMapScript // Creatures ObjectGuid LeviathanGUID; + GuidVector LeviathanVehicleGUIDs; ObjectGuid IgnisGUID; ObjectGuid RazorscaleGUID; ObjectGuid RazorscaleController; @@ -217,6 +219,11 @@ class instance_ulduar : public InstanceMapScript case NPC_LEVIATHAN: LeviathanGUID = creature->GetGUID(); break; + case NPC_SALVAGED_DEMOLISHER: + case NPC_SALVAGED_SIEGE_ENGINE: + case NPC_SALVAGED_CHOPPER: + LeviathanVehicleGUIDs.push_back(creature->GetGUID()); + break; case NPC_IGNIS: IgnisGUID = creature->GetGUID(); break; @@ -682,6 +689,24 @@ class instance_ulduar : public InstanceMapScript switch (type) { case BOSS_LEVIATHAN: + if (state == DONE) + { + // Eject all players from vehicles and make them untargetable. + // They will be despawned after a while + for (auto const& vehicleGuid : LeviathanVehicleGUIDs) + { + if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid)) + { + if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) + { + vehicle->RemoveAllPassengers(); + vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); + } + } + } + } + break; case BOSS_IGNIS: case BOSS_RAZORSCALE: case BOSS_XT002: @@ -1143,6 +1168,34 @@ class instance_ulduar : public InstanceMapScript } } + void UpdateDoorState(GameObject* door) override + { + // Leviathan doors are set to DOOR_TYPE_ROOM except the one it uses to enter the room + // which has to be set to DOOR_TYPE_PASSAGE + if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f) + door->SetGoState(GetBossState(BOSS_LEVIATHAN) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); + else + InstanceScript::UpdateDoorState(door); + } + + void AddDoor(GameObject* door, bool add) override + { + // Leviathan doors are South except the one it uses to enter the room + // which is North and should not be used for boundary checks in BossAI::CheckBoundary() + if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f) + { + if (add) + GetBossInfo(BOSS_LEVIATHAN)->door[DOOR_TYPE_PASSAGE].insert(door->GetGUID()); + else + GetBossInfo(BOSS_LEVIATHAN)->door[DOOR_TYPE_PASSAGE].erase(door->GetGUID()); + + if (add) + UpdateDoorState(door); + } + else + InstanceScript::AddDoor(door, add); + } + private: EventMap _events; uint32 _algalonTimer; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index ddf293dd8b8..d40fb698658 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -54,6 +54,7 @@ enum UlduarNPCs NPC_LEVIATHAN = 33113, NPC_SALVAGED_DEMOLISHER = 33109, NPC_SALVAGED_SIEGE_ENGINE = 33060, + NPC_SALVAGED_CHOPPER = 33062, NPC_IGNIS = 33118, NPC_RAZORSCALE = 33186, NPC_RAZORSCALE_CONTROLLER = 33233, -- cgit v1.2.3 From 87afdc7101ed869ab3a742b9a63d6e8cf436d7c5 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 22 Mar 2015 12:40:02 +0100 Subject: Core/PacketIO: Restored missing code in Player::SendEquipError --- src/server/game/Entities/Item/Item.h | 6 +++- src/server/game/Entities/Player/Player.cpp | 46 +++++++++++++++++++------- src/server/game/Server/Packets/ItemPackets.cpp | 13 ++++++-- 3 files changed, 50 insertions(+), 15 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 8514643cfad..810bbdac704 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -119,8 +119,9 @@ enum InventoryResult EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, // You can't do that while in an arena match EQUIP_ERR_TRADE_BOUND_ITEM = 79, // You can't trade a soulbound item. EQUIP_ERR_CANT_EQUIP_RATING = 80, // You don't have the personal, team, or battleground rating required to buy that item - EQUIP_ERR_NO_OUTPUT = 81, + EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM = 81, EQUIP_ERR_NOT_SAME_ACCOUNT = 82, // Account-bound items can only be given to your own characters. + EQUIP_ERR_NO_OUTPUT = 83, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 84, // You can only carry %d %s EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 85, // You can only equip %d |4item:items in the %s category EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 86, // Your level is too high to use that item @@ -131,6 +132,9 @@ enum InventoryResult EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL = 91, // Your inventory is full. Your satchel has been delivered to your mailbox. EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 92, // Your level is too low to use that item EQUIP_ERR_CANT_BUY_QUANTITY = 93, // You can't buy the specified quantity of that item. + EQUIP_ERR_ITEM_IS_BATTLE_PAY_LOCKED = 94, // Your purchased item is still waiting to be unlocked + EQUIP_ERR_REAGENT_BANK_FULL = 95, // Your reagent bank is full + EQUIP_ERR_REAGENT_BANK_LOCKED = 96 }; enum BuyResult diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0f5a36e14b4..98945400ded 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -12898,21 +12898,43 @@ void Player::SendEquipError(InventoryResult msg, Item* item1 /*= nullptr*/, Item WorldPackets::Item::InventoryChangeFailure failure; failure.BagResult = msg; - if (item1) + if (msg != EQUIP_ERR_OK) { - failure.Item[0] = item1->GetGUID(); - failure.Level = uint32(item1->GetRequiredLevel()); - } + if (item1) + failure.Item[0] = item1->GetGUID(); + + if (item2) + failure.Item[1] = item2->GetGUID(); - if (item2) - failure.Item[1] = item2->GetGUID(); + failure.ContainerBSlot = 0; // bag equip slot, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 - /// @todo: fill remaining values: - /// ContainerBSlot - /// SrcContainer - /// DstContainer - /// SrcSlot - /// LimitCategory + switch (msg) + { + case EQUIP_ERR_CANT_EQUIP_LEVEL_I: + case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: + { + failure.Level = uint32(item1 ? item1->GetRequiredLevel() : 0); + break; + } + case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one... + { + //failure.SrcContainer + //failure.SrcSlot + //failure.DstContainer + break; + } + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: + { + ItemTemplate const* proto = item1 ? item1->GetTemplate() : sObjectMgr->GetItemTemplate(itemId); + failure.LimitCategory = proto ? proto->GetItemLimitCategory() : 0; + break; + } + default: + break; + } + } SendDirectMessage(failure.Write()); } diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index e9a0c213aee..57620737190 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -208,7 +208,7 @@ WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() _worldPacket << int8(BagResult); _worldPacket << Item[0]; _worldPacket << Item[1]; - _worldPacket << uint8(ContainerBSlot); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 + _worldPacket << uint8(ContainerBSlot); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_WRONG_BAG_TYPE_2 switch (BagResult) { @@ -216,7 +216,16 @@ WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: _worldPacket << int32(Level); break; - /// @todo: add more cases + case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: + _worldPacket << SrcContainer; + _worldPacket << int32(SrcSlot); + _worldPacket << DstContainer; + break; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: + _worldPacket << int32(LimitCategory); + break; default: break; } -- cgit v1.2.3 From 695970df3b9b3bf9d71b5605e22e334dd24cfca8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 22 Mar 2015 13:13:18 +0100 Subject: Core/PacketIO: Updated IsInstanceOnlyOpcode --- src/server/game/Server/Protocol/Opcodes.h | 178 ++---------------------------- 1 file changed, 12 insertions(+), 166 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 819fe08ead7..9a40da19a23 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1075,12 +1075,12 @@ enum OpcodeServer : uint32 SMSG_DISPLAY_TOAST = 0x17DA, SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0xBADD, SMSG_DROP_NEW_CONNECTION = 0xBADD, - SMSG_DUEL_COMPLETE = 0xBADD, + SMSG_DUEL_COMPLETE = 0x1531, SMSG_DUEL_COUNTDOWN = 0x1B1A, - SMSG_DUEL_IN_BOUNDS = 0xBADD, - SMSG_DUEL_OUT_OF_BOUNDS = 0xBADD, + SMSG_DUEL_IN_BOUNDS = 0x13A3, + SMSG_DUEL_OUT_OF_BOUNDS = 0x15F4, SMSG_DUEL_REQUESTED = 0x0983, - SMSG_DUEL_WINNER = 0xBADD, + SMSG_DUEL_WINNER = 0x1519, SMSG_DUMP_RIDE_TICKETS_RESPONSE = 0xBADD, SMSG_DURABILITY_DAMAGE_DEATH = 0x1BCA, SMSG_DYNAMIC_DROP_ROLL_RESULT = 0xBADD, @@ -1372,7 +1372,7 @@ enum OpcodeServer : uint32 SMSG_MODIFY_COOLDOWN = 0x15EA, SMSG_MONEY_NOTIFY = 0xBADD, SMSG_MOTD = 0x12FB, - SMSG_MOUNT_RESULT = 0xBADD, + SMSG_MOUNT_RESULT = 0x1BAC, SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0xBADD, SMSG_MOVE_CHARACTER_CHEAT_FAILURE = 0xBADD, SMSG_MOVE_CHARACTER_CHEAT_SUCCESS = 0xBADD, @@ -1839,173 +1839,19 @@ enum OpcodeServer : uint32 inline bool IsInstanceOnlyOpcode(uint32 opcode) { - // TODO: Use names when known switch (opcode) { - /*case SMSG_MOUNT_RESULT: // Client - case SMSG_DUEL_OUT_OF_BOUNDS: // Client - case SMSG_DUEL_IN_BOUNDS: // Client - case 0x0549: // Client - case 0x055A: // Client - case 0x055C: // Client - case 0x057A: // Client - case 0x057C: // Client - case 0x05C9: // Client - case 0x05CA: // Client - case 0x05D9: // Client - case 0x05DA: // Client - case 0x05DC: // Client - case 0x05E9: // Client - case 0x05F9: // Client - case 0x05FC: // Client - case 0x074B: // Client - case 0x074C: // Client - case 0x075B: // Client - case 0x075C: // Client - case 0x076C: // Client - case 0x07CB: // Client - case 0x07CC: // Client - case 0x07DB: // Client - case 0x07DC: // Client - case 0x07EC: // Client + case SMSG_QUESTGIVER_STATUS: // ClientQuest case SMSG_DUEL_REQUESTED: // Client + case SMSG_DUEL_IN_BOUNDS: // Client + case SMSG_QUERY_TIME_RESPONSE: // Client case SMSG_DUEL_WINNER: // Client - case 0x0F0F: // ClientSpell - case 0x0F10: // ClientSpell - case 0x0F30: // ClientSpell - case 0x0F3B: // ClientSpell - case 0x0F8B: // ClientSpell - case 0x0F8C: // ClientSpell - case 0x0F90: // ClientSpell - case 0x0F9F: // ClientSpell - case 0x0FA0: // ClientSpell - case SMSG_ATTACKSTOP: // Client case SMSG_DUEL_COMPLETE: // Client - case 0x154B: // Client - case 0x154C: // Client - case 0x155A: // Client - case 0x155B: // Client - case 0x155C: // Client - case SMSG_QUESTGIVER_STATUS: // ClientQuest - case 0x156B: // Client - case 0x1579: // Client - case 0x157B: // Client - case 0x15CB: // Client - case 0x15CC: // Client - case 0x15DB: // Client - case 0x15DC: // Client - case 0x15EB: // Client - case 0x15FB: // Client - case 0x1710: // ClientSpell - case 0x1720: // ClientSpell - case 0x172B: // ClientSpell - case 0x172C: // ClientSpell - case 0x172F: // ClientSpell - case 0x1730: // ClientSpell - case 0x173C: // ClientSpell - case 0x178B: // ClientSpell - case 0x178C: // ClientSpell - case 0x178F: // ClientSpell - case 0x1790: // ClientSpell - case 0x179B: // ClientSpell - case 0x179F: // ClientSpell + case SMSG_DUEL_OUT_OF_BOUNDS: // Client + case SMSG_ATTACKSTOP: // Client case SMSG_ATTACKSTART: // Client - case 0x1D82: // ClientQuest - case 0x1D83: // ClientQuest - case 0x1D84: // ClientQuest - case 0x1D86: // ClientQuest - case 0x1D91: // ClientQuest - case 0x1D92: // ClientQuest - case 0x1D94: // ClientQuest - case 0x1D96: // ClientQuest - case 0x1D97: // ClientQuest - case 0x1DA1: // ClientQuest - case 0x1DA2: // ClientQuest - case 0x1DA3: // ClientQuest - case 0x1DA4: // ClientQuest - case 0x1DA5: // ClientQuest - case 0x1DA7: // ClientQuest - case SMSG_QUERY_TIME_RESPONSE: // Client - case 0x1DC4: // ClientQuest - case 0x1DC8: // ClientQuest - case 0x1DD1: // ClientQuest - case 0x1DD2: // ClientQuest - case 0x1DD3: // ClientQuest - case 0x1DD4: // ClientQuest - case 0x1DD6: // ClientQuest - case 0x1DE1: // ClientQuest - case 0x1DE2: // ClientQuest - case 0x1DE3: // ClientQuest - case 0x1DE4: // ClientQuest - case 0x1DE5: // ClientQuest - case 0x1DE7: // ClientQuest - case 0x1F04: // ClientQuest - case 0x1F08: // ClientQuest - case 0x1F10: // ClientSpell - case 0x1F11: // ClientQuest - case 0x1F12: // ClientQuest - case 0x1F13: // ClientQuest - case 0x1F14: // ClientQuest - case 0x1F16: // ClientQuest - case 0x1F20: // ClientSpell - case 0x1F21: // ClientQuest - case 0x1F22: // ClientQuest - case 0x1F23: // ClientQuest - case 0x1F24: // ClientQuest - case 0x1F25: // ClientQuest - case 0x1F27: // ClientQuest - case 0x1F2B: // ClientSpell - case 0x1F2C: // ClientSpell - case 0x1F2F: // ClientSpell - case 0x1F30: // ClientSpell - case 0x1F3C: // ClientSpell - case 0x1F41: // ClientQuest - case 0x1F42: // ClientQuest - case 0x1F44: // ClientQuest - case 0x1F46: // ClientQuest - case 0x1F47: // ClientQuest - case 0x1F48: // ClientQuest - case 0x1F52: // ClientQuest - case 0x1F53: // ClientQuest - case 0x1F55: // ClientQuest - case 0x1F57: // ClientQuest - case 0x1F61: // ClientQuest - case 0x1F63: // ClientQuest - case 0x1F64: // ClientQuest - case 0x1F65: // ClientQuest - case 0x1F67: // ClientQuest - case 0x1F84: // ClientQuest - case 0x1F87: // ClientQuest - case 0x1F8B: // ClientSpell - case 0x1F8C: // ClientSpell - case 0x1F8F: // ClientSpell - case 0x1F90: // ClientSpell - case 0x1F91: // ClientQuest - case 0x1F95: // ClientQuest - case 0x1F96: // ClientQuest - case 0x1F97: // ClientQuest - case 0x1F9B: // ClientSpell - case 0x1F9F: // ClientSpell - case 0x1FA1: // ClientQuest - case 0x1FA2: // ClientQuest - case 0x1FA3: // ClientQuest - case 0x1FA4: // ClientQuest - case 0x1FA5: // ClientQuest - case 0x1FA7: // ClientQuest - case 0x1FC4: // ClientQuest - case 0x1FC8: // ClientQuest - case 0x1FD1: // ClientQuest - case 0x1FD2: // ClientQuest - case 0x1FD3: // ClientQuest - case 0x1FD4: // ClientQuest - case 0x1FD6: // ClientQuest - case 0x1FE1: // ClientQuest - case 0x1FE2: // ClientQuest - case 0x1FE3: // ClientQuest - case 0x1FE4: // ClientQuest - case 0x1FE5: // ClientQuest - case 0x1FE7: // ClientQuest - return true;*/ + case SMSG_MOUNT_RESULT: // Client + return true; default: return false; } -- cgit v1.2.3 From cc4d79495f98006f77c68792b946a412f5e86714 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 22 Mar 2015 13:47:55 +0100 Subject: Core/Misc: Warning fixes --- src/server/game/AI/SmartScripts/SmartScript.cpp | 2 +- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 2 +- src/server/game/DataStores/DB2Structure.h | 2 +- src/server/game/Entities/Creature/Creature.cpp | 4 +- src/server/game/Entities/Pet/Pet.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 4 +- src/server/game/Handlers/BlackMarketHandler.cpp | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Handlers/GuildHandler.cpp | 2 +- src/server/game/Handlers/LFGHandler.cpp | 2 +- src/server/game/Handlers/MiscHandler.cpp | 4 +- src/server/game/Handlers/MovementHandler.cpp | 2 - src/server/game/Handlers/NPCHandler.cpp | 24 ++++----- src/server/game/Handlers/PetHandler.cpp | 62 +++++++--------------- src/server/game/Handlers/PetitionsHandler.cpp | 3 +- src/server/game/Handlers/SpellHandler.cpp | 2 +- src/server/game/Quests/QuestDef.cpp | 2 +- src/server/game/Server/Packets/NPCPackets.h | 4 +- src/server/game/Server/Protocol/Opcodes.cpp | 1 - src/server/game/Server/Protocol/Opcodes.h | 1 - src/server/game/Server/WorldSession.h | 3 +- src/server/game/Spells/Auras/SpellAuras.cpp | 4 +- src/server/game/Spells/Auras/SpellAuras.h | 2 +- src/server/game/Support/SupportMgr.cpp | 38 ++++++------- src/server/scripts/Commands/cs_learn.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 2 +- src/server/scripts/Commands/cs_modify.cpp | 2 +- .../Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp | 2 +- src/server/scripts/Spells/spell_mage.cpp | 2 +- src/server/shared/Updater/UpdateFetcher.h | 19 ++++--- src/server/shared/Utilities/ServiceWin32.cpp | 2 +- src/server/worldserver/Main.cpp | 2 +- 32 files changed, 89 insertions(+), 120 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index b80e861c4df..08025fd1de1 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -497,7 +497,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (cost.Power == POWER_HEALTH) { - if (me->GetHealth() <= cost.Amount) + if (me->GetHealth() <= uint32(cost.Amount)) { hasPower = false; break; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 587e1fca023..6ea09711667 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -550,7 +550,7 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player if (itemSubClass != 0xffffffff && proto->GetSubClass() != itemSubClass) continue; - if (inventoryType != 0xffffffff && proto->GetInventoryType() != inventoryType) + if (inventoryType != 0xffffffff && proto->GetInventoryType() != InventoryType(inventoryType)) continue; if (quality != 0xffffffff && proto->GetQuality() != quality) diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index e52acc0e2c3..9aab120cc63 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -135,7 +135,7 @@ struct ItemEffectEntry uint32 OrderIndex; // 2 uint32 SpellID; // 3 uint32 Trigger; // 4 - uint32 Charges; // 5 + int32 Charges; // 5 int32 Cooldown; // 6 uint32 Category; // 7 int32 CategoryCooldown; // 8 diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index f5c7b42292e..11c88d4922e 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1724,7 +1724,7 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* victim) std::vector costs = spellInfo->CalcPowerCost(this, SpellSchoolMask(spellInfo->SchoolMask)); auto m = std::find_if(costs.begin(), costs.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_MANA; }); if (m != costs.end()) - if (m->Amount > (uint32)GetPower(POWER_MANA)) + if (m->Amount > GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(false); @@ -1772,7 +1772,7 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim) std::vector costs = spellInfo->CalcPowerCost(this, SpellSchoolMask(spellInfo->SchoolMask)); auto m = std::find_if(costs.begin(), costs.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_MANA; }); if (m != costs.end()) - if (m->Amount > (uint32)GetPower(POWER_MANA)) + if (m->Amount > GetPower(POWER_MANA)) continue; float range = spellInfo->GetMaxRange(true); diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index f0c4250ff1e..83d2ad1874c 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1626,7 +1626,7 @@ bool Pet::resetTalents() return true; } -void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* onlinePet /*= NULL*/) +void Pet::resetTalentsForAllPetsOf(Player* /*owner*/, Pet* /*onlinePet*/ /*= NULL*/) { /* TODO: 6.x remove pet talents // not need after this call diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e93c176969f..08e8180bb3f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6130,7 +6130,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Used in case when access to whole aura is needed // All procs should be handled like this... -bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 /*procEx*/, uint32 cooldown, bool * handled) +bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura, SpellInfo const* /*procSpell*/, uint32 /*procFlag*/, uint32 /*procEx*/, uint32 cooldown, bool * handled) { SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo(); @@ -16445,7 +16445,7 @@ bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplicat { if (AuraApplication* aurApp = existingAurEff->GetBase()->GetApplicationOfTarget(GetGUID())) { - bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType, GetMap()->GetDifficultyID()); + bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType); uint32 removedAuras = m_removedAurasCount; RemoveAura(aurApp); if (hasMoreThanOneEffect || m_removedAurasCount > removedAuras + 1) diff --git a/src/server/game/Handlers/BlackMarketHandler.cpp b/src/server/game/Handlers/BlackMarketHandler.cpp index 0520d1e18f3..f2b549c58c3 100644 --- a/src/server/game/Handlers/BlackMarketHandler.cpp +++ b/src/server/game/Handlers/BlackMarketHandler.cpp @@ -37,7 +37,7 @@ void WorldSession::HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketO SendBlackMarketOpenResult(packet.Guid, unit); } -void WorldSession::SendBlackMarketOpenResult(ObjectGuid guid, Creature* auctioneer) +void WorldSession::SendBlackMarketOpenResult(ObjectGuid guid, Creature* /*auctioneer*/) { WorldPackets::BlackMarket::BlackMarketOpenResult packet; packet.Guid = guid; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 7a63d38f4fa..34c50cac180 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1394,7 +1394,7 @@ void WorldSession::HandleAlterAppearance(WorldPacket& recvData) return; } - if (_player->GetStandState() != UNIT_STAND_STATE_SIT_LOW_CHAIR + go->GetGOInfo()->barberChair.chairheight) + if (_player->GetStandState() != UnitStandStateType(UNIT_STAND_STATE_SIT_LOW_CHAIR + go->GetGOInfo()->barberChair.chairheight)) { SendBarberShopResult(BARBER_SHOP_RESULT_NOT_ON_CHAIR); return; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 2f5c1602a9f..679f1f08dc9 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -390,7 +390,7 @@ void WorldSession::HandleDeclineGuildInvites(WorldPackets::Guild::DeclineGuildIn GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_AUTO_DECLINE_GUILD, packet.Allow); } -void WorldSession::HandleRequestGuildRewardsList(WorldPackets::Guild::RequestGuildRewardsList& packet) +void WorldSession::HandleRequestGuildRewardsList(WorldPackets::Guild::RequestGuildRewardsList& /*packet*/) { if (sGuildMgr->GetGuildById(_player->GetGuildId())) { diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index bf1e808d5d0..b291ffb0c9e 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -72,7 +72,7 @@ void BuildQuestReward(WorldPacket& data, Quest const* quest, Player* player) { if (uint32 itemId = quest->RewardItemId[i]) { - ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId); + //ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId); data << uint32(itemId); data << uint32(/*item ? item->DisplayInfoID :*/ 0); data << uint32(quest->RewardItemCount[i]); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 13b60d571d3..675f68cd90f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -63,7 +63,7 @@ #include "AchievementPackets.h" #include "WhoPackets.h" -void WorldSession::HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet) +void WorldSession::HandleRepopRequest(WorldPackets::Misc::RepopRequest& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_REPOP_REQUEST Message"); @@ -545,7 +545,7 @@ void WorldSession::HandleBugReportOpcode(WorldPacket& recvData) CharacterDatabase.Execute(stmt); } -void WorldSession::HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet) +void WorldSession::HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RECLAIM_CORPSE"); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index f40527b66d7..c703e02a95c 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -369,8 +369,6 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov plrMover->UpdateFallInformationIfNeed(movementInfo, opcode); - AreaTableEntry const* zone = GetAreaEntryByAreaID(plrMover->GetAreaId()); - if (movementInfo.pos.GetPositionZ() < MAX_MAP_DEPTH) { if (!(plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player))) diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 48e752b5d0b..999b71d69a3 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -120,10 +120,8 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) // reputation discount float fDiscountMod = _player->GetReputationPriceDiscount(unit); - bool can_learn_primary_prof = GetPlayer()->GetFreePrimaryProfessionPoints() > 0; - packet.Spells.resize(trainer_spells->spellList.size()); - uint32 count = 0; + packet.Spells.reserve(trainer_spells->spellList.size()); for (TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr) { TrainerSpell const* tSpell = &itr->second; @@ -143,12 +141,13 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank()) primary_prof_first_rank = true; } + if (!valid) continue; TrainerSpellState state = _player->GetTrainerSpellState(tSpell); - WorldPackets::NPC::TrainerListSpell& spell = packet.Spells[count]; + WorldPackets::NPC::TrainerListSpell spell; spell.SpellID = tSpell->SpellID; spell.MoneyCost = floor(tSpell->MoneyCost * fDiscountMod); spell.ReqSkillLine = tSpell->ReqSkillLine; @@ -157,39 +156,34 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) spell.Usable = (state == TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state); uint8 maxReq = 0; - /// @todo Update this when new spell system is ready - /*for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_TRAINERSPELL_ABILITY_REQS; ++i) { if (!tSpell->ReqAbility[i]) continue; + if (uint32 prevSpellId = sSpellMgr->GetPrevSpellInChain(tSpell->ReqAbility[i])) { spell.ReqAbility[maxReq] = prevSpellId; ++maxReq; } + if (maxReq == 2) break; + SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(tSpell->ReqAbility[i]); for (SpellsRequiringSpellMap::const_iterator itr2 = spellsRequired.first; itr2 != spellsRequired.second && maxReq < 3; ++itr2) { spell.ReqAbility[maxReq] = itr2->second; ++maxReq; } + if (maxReq == 2) break; - }*/ - while (maxReq < MAX_TRAINERSPELL_ABILITY_REQS) - { - spell.ReqAbility[maxReq] = 0; - ++maxReq; } - ++count; + packet.Spells.push_back(spell); } - // Shrink to actual data size - packet.Spells.resize(count); - SendPacket(packet.Write()); } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 280055f8337..c7e98e75dfa 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -33,6 +33,7 @@ #include "SpellHistory.h" #include "SpellInfo.h" #include "Player.h" +#include "SpellPackets.h" void WorldSession::HandleDismissCritter(WorldPacket& recvData) { @@ -751,54 +752,41 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) charmInfo->SetSpellAutocast(spellInfo, state != 0); } -void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& castRequest) +void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& petCastSpell) { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_CAST_SPELL"); - /* - ObjectGuid guid; - uint8 castCount; - uint32 spellId; - uint8 castFlags; - - recvPacket >> guid >> castCount >> spellId >> castFlags; - - TC_LOG_DEBUG("network", "WORLD: CMSG_PET_CAST_SPELL, %s, castCount: %u, spellId %u, castFlags %u", guid.ToString().c_str(), castCount, spellId, castFlags); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(petCastSpell.Cast.SpellID); + if (!spellInfo) + { + TC_LOG_ERROR("network", "WORLD: unknown PET spell id %i", petCastSpell.Cast.SpellID); + return; + } // This opcode is also sent from charmed and possessed units (players and creatures) if (!_player->GetGuardianPet() && !_player->GetCharm()) return; - Unit* caster = ObjectAccessor::GetUnit(*_player, guid); + Unit* caster = ObjectAccessor::GetUnit(*_player, petCastSpell.PetGUID); if (!caster || (caster != _player->GetGuardianPet() && caster != _player->GetCharm())) { - TC_LOG_ERROR("network", "HandlePetCastSpellOpcode: %s isn't pet of player %s (%s).", guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); - return; - } - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - TC_LOG_ERROR("network", "WORLD: unknown PET spell id %i", spellId); + TC_LOG_ERROR("network", "HandlePetCastSpellOpcode: %s isn't pet of player %s (%s).", petCastSpell.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); return; } // do not cast not learned spells - if (!caster->HasSpell(spellId) || spellInfo->IsPassive()) + if (!caster->HasSpell(spellInfo->Id) || spellInfo->IsPassive()) return; - SpellCastTargets targets; - targets.Read(recvPacket, caster); - HandleClientCastFlags(recvPacket, castFlags, targets); + SpellCastTargets targets(caster, petCastSpell.Cast); caster->ClearUnitState(UNIT_STATE_FOLLOW); Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); - spell->m_cast_count = castCount; // probably pending spell cast + spell->m_cast_count = petCastSpell.Cast.CastID; + spell->m_misc.Data = petCastSpell.Cast.Misc; spell->m_targets = targets; SpellCastResult result = spell->CheckPetCast(NULL); - if (result == SPELL_CAST_OK) { if (Creature* creature = caster->ToCreature()) @@ -810,22 +798,22 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& if (pet->getPetType() == SUMMON_PET && (urand(0, 100) < 10)) pet->SendPetTalk(PET_TALK_SPECIAL_SPELL); else - pet->SendPetAIReaction(guid); + pet->SendPetAIReaction(petCastSpell.PetGUID); } } - spell->prepare(&(spell->m_targets)); + spell->prepare(&targets); } else { spell->SendPetCastResult(result); - if (!caster->GetSpellHistory()->HasCooldown(spellId)) - caster->GetSpellHistory()->ResetCooldown(spellId, true); + if (!caster->GetSpellHistory()->HasCooldown(spellInfo->Id)) + caster->GetSpellHistory()->ResetCooldown(spellInfo->Id, true); spell->finish(false); delete spell; - }*/ + } } void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName) @@ -840,15 +828,3 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec SendPacket(&data); } - -void WorldSession::HandlePetLearnTalent(WorldPacket& recvData) -{ - /* TODO: 6.x remove pet talents (add pet specializations) - - ObjectGuid guid; - uint32 talentId, requestedRank; - recvData >> guid >> talentId >> requestedRank; - - _player->LearnPetTalent(guid, talentId, requestedRank); - _player->SendTalentsInfoData(true);*/ -} diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index 6dd8d95bbf6..97935d5837e 100644 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -241,7 +241,6 @@ void WorldSession::HandlePetitionRenameGuild(WorldPackets::Petition::PetitionRen TC_LOG_DEBUG("network", "Received CMSG_PETITION_RENAME_GUILD"); TC_LOG_DEBUG("network", "Received opcode CMSG_PETITION_RENAME_GUILD"); - uint8 type = 0; Item* item = _player->GetItemByGuid(packet.PetitionGuid); if (!item) return; @@ -292,7 +291,7 @@ void WorldSession::HandleSignPetition(WorldPackets::Petition::SignPetition& pack Field* fields = result->Fetch(); ObjectGuid ownerGuid = ObjectGuid::Create(fields[0].GetUInt64()); - uint64 signs = fields[1].GetUInt64(); + //uint64 signs = fields[1].GetUInt64(); if (ownerGuid == _player->GetGUID()) return; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index e9eccb6b634..1cbfd7057b7 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -337,7 +337,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& canc if (spellInfo->IsChanneled()) { if (Spell* curSpell = _player->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) - if (curSpell->GetSpellInfo()->Id == cancelAura.SpellID) + if (curSpell->GetSpellInfo()->Id == uint32(cancelAura.SpellID)) _player->InterruptSpell(CURRENT_CHANNELED_SPELL); return; } diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index cd5b79c95c3..da0830734e5 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -334,7 +334,7 @@ bool Quest::IsAllowedInRaid(Difficulty difficulty) const return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_RAID); } -uint32 Quest::CalculateHonorGain(uint8 level) const +uint32 Quest::CalculateHonorGain(uint8 /*level*/) const { uint32 honor = 0; diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index b4c7a377187..849013fb5d8 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -59,7 +59,7 @@ namespace WorldPackets int32 QuestLevel = 0; bool Repeatable = false; std::string QuestTitle; - int32 QuestFlags[2]; + int32 QuestFlags[2] = { }; }; class GossipMessage final : public ServerPacket @@ -130,7 +130,7 @@ namespace WorldPackets int32 MoneyCost = 0; int32 ReqSkillLine = 0; int32 ReqSkillRank = 0; - int32 ReqAbility[MAX_TRAINERSPELL_ABILITY_REQS]; + int32 ReqAbility[MAX_TRAINERSPELL_ABILITY_REQS] = { }; uint8 Usable = 0; uint8 ReqLevel = 0; }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 467e56fb1f1..5d7c18db742 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -638,7 +638,6 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode ); DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_CACHE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 9a40da19a23..498a2db708d 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -546,7 +546,6 @@ enum OpcodeClient : uint32 CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0xBADD, CMSG_PET_CANCEL_AURA = 0xBADD, CMSG_PET_CAST_SPELL = 0xBADD, - CMSG_PET_LEARN_TALENT = 0xBADD, CMSG_PET_NAME_CACHE = 0xBADD, CMSG_PET_NAME_QUERY = 0x0CCB, CMSG_PET_RENAME = 0x1333, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 61c27ff57d8..e1ad57bbc77 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1178,8 +1178,7 @@ class WorldSession void HandlePetRename(WorldPacket& recvData); void HandlePetCancelAuraOpcode(WorldPacket& recvPacket); void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket); - void HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& castRequest); - void HandlePetLearnTalent(WorldPacket& recvPacket); + void HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& petCastSpell); void HandleSetActionBarToggles(WorldPackets::Character::SetActionBarToggles& packet); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 0af38131740..e85d38ee30c 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1003,11 +1003,11 @@ void Aura::RefreshSpellMods() player->RestoreAllSpellMods(0, this); } -bool Aura::HasMoreThanOneEffectForType(AuraType auraType, uint32 difficulty) const +bool Aura::HasMoreThanOneEffectForType(AuraType auraType) const { uint32 count = 0; for (SpellEffectInfo const* effect : GetSpellEffectInfos()) - if (effect && HasEffect(effect->EffectIndex) && AuraType(effect->ApplyAuraName) == auraType) + if (effect && HasEffect(effect->EffectIndex) && AuraType(effect->ApplyAuraName) == auraType) ++count; return count > 1; diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 77ef04009b8..acc9de2587d 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -183,7 +183,7 @@ class Aura uint8 GetCasterLevel() const { return m_casterLevel; } - bool HasMoreThanOneEffectForType(AuraType auraType, uint32 difficulty) const; + bool HasMoreThanOneEffectForType(AuraType auraType) const; bool IsArea() const; bool IsPassive() const; bool IsDeathPersistent() const; diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 773dd5d9676..f7a85a91faa 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -34,26 +34,26 @@ void Ticket::TeleportTo(Player* player) const player->TeleportTo(_mapId, _pos.x, _pos.y, _pos.z, 0.0f, 0); } -std::string Ticket::FormatViewMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const +std::string Ticket::FormatViewMessageString(ChatHandler& handler, char const* closedName, char const* assignedToName, char const* unassignedName, char const* deletedName, char const* /*completedName*/) const { std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); - if (szClosedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETCLOSED, szClosedName); - if (szAssignedToName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, szAssignedToName); - if (szUnassignedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName); - if (szDeletedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName); + if (closedName) + ss << handler.PGetParseString(LANG_COMMAND_TICKETCLOSED, closedName); + if (assignedToName) + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, assignedToName); + if (unassignedName) + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, unassignedName); + if (deletedName) + ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, deletedName); return ss.str(); } GmTicket::GmTicket() : _lastModifiedTime(0), _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false), _needResponse(false), _needMoreHelp(false) { } GmTicket::GmTicket(Player* player) : Ticket(player), _lastModifiedTime(time(nullptr)), _completed(false), _escalatedStatus(TICKET_UNASSIGNED), -_viewed(false), _needResponse(false), _needMoreHelp(false) +_viewed(false), _needResponse(false), _needMoreHelp(false) { _id = sSupportMgr->GenerateGmTicketId(); } @@ -71,9 +71,9 @@ void GmTicket::SetUnassigned() _assignedTo.Clear(); switch (_escalatedStatus) { - case TICKET_ASSIGNED: _escalatedStatus = TICKET_UNASSIGNED; + case TICKET_ASSIGNED: _escalatedStatus = TICKET_UNASSIGNED; break; - case TICKET_ESCALATED_ASSIGNED: _escalatedStatus = TICKET_IN_ESCALATION_QUEUE; + case TICKET_ESCALATED_ASSIGNED: _escalatedStatus = TICKET_IN_ESCALATION_QUEUE; break; case TICKET_UNASSIGNED: case TICKET_IN_ESCALATION_QUEUE: @@ -246,7 +246,7 @@ void BugTicket::LoadFromDB(Field* fields) _closedBy.SetRawValue(0, uint64(closedBy)); else _closedBy = ObjectGuid::Create(uint64(closedBy)); - + uint64 assignedTo = fields[++idx].GetUInt64(); if (assignedTo == 0) _assignedTo = ObjectGuid::Empty; @@ -330,7 +330,7 @@ void ComplaintTicket::LoadFromDB(Field* fields) int32 reportLineIndex = fields[++idx].GetInt32(); if (reportLineIndex != -1) _chatLog.ReportLineIndex.Set(reportLineIndex); - + int64 closedBy = fields[++idx].GetInt64(); if (closedBy == 0) _closedBy = ObjectGuid::Empty; @@ -344,7 +344,7 @@ void ComplaintTicket::LoadFromDB(Field* fields) _assignedTo = ObjectGuid::Empty; else _assignedTo = ObjectGuid::Create(assignedTo); - + _comment = fields[++idx].GetString(); } @@ -373,7 +373,7 @@ void ComplaintTicket::SaveToDB(SQLTransaction& trans) const stmt->setUInt8(++idx, _complaintType); if (_chatLog.ReportLineIndex.HasValue) stmt->setInt32(++idx, _chatLog.ReportLineIndex.Value); - else + else stmt->setInt32(++idx, -1); // empty ReportLineIndex stmt->setInt64(++idx, _closedBy.GetCounter()); stmt->setUInt64(++idx, _assignedTo.GetCounter()); @@ -393,7 +393,7 @@ void ComplaintTicket::SaveToDB(SQLTransaction& trans) const trans->Append(stmt); ++lineIndex; } - + if (!isInTransaction) CharacterDatabase.CommitTransaction(trans); } @@ -517,7 +517,7 @@ std::string SuggestionTicket::FormatViewMessageString(ChatHandler& handler, bool return ss.str(); } -SupportMgr::SupportMgr() : _lastGmTicketId(0), _lastBugId(0), _lastComplaintId(0), _lastSuggestionId(0), _openGmTicketCount(0), +SupportMgr::SupportMgr() : _lastGmTicketId(0), _lastBugId(0), _lastComplaintId(0), _lastSuggestionId(0), _openGmTicketCount(0), _openBugTicketCount(0), _openComplaintTicketCount(0), _openSuggestionTicketCount(0) { } SupportMgr::~SupportMgr() @@ -701,7 +701,7 @@ void SupportMgr::LoadComplaintTickets() uint32 count = 0; PreparedStatement* chatLogStmt; PreparedQueryResult chatLogResult; - do + do { Field* fields = result->Fetch(); ComplaintTicket* complaint = new ComplaintTicket(); diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 7a34ba55110..d41c9c5d2c2 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -211,7 +211,7 @@ public: return true; } - static bool HandleLearnAllMyPetTalentsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllMyPetTalentsCommand(ChatHandler* /*handler*/, char const* /*args*/) { /* TODO: 6.x remove pet talents Player* player = handler->GetSession()->GetPlayer(); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index cf1bc4fbb0e..8e646629e91 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2613,7 +2613,7 @@ public: return true; } - static bool HandleAurasCommand(ChatHandler* handler, char const* args) + static bool HandleAurasCommand(ChatHandler* handler, char const* /*args*/) { Unit* target = handler->GetSession()->GetPlayer()->GetSelectedUnit(); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index c22edf52dd3..e6fa8037d3f 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -418,7 +418,7 @@ public: } //Edit Player TP - static bool HandleModifyTalentCommand (ChatHandler* handler, const char* args) + static bool HandleModifyTalentCommand(ChatHandler* /*handler*/, const char* /*args*/) { /* TODO: 6.x remove this if (!*args) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index f31a79f46d5..134783ccf07 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1128,7 +1128,7 @@ class npc_ominous_cloud : public CreatureScript void UpdateAI(uint32 /*diff*/) override { } - void DoAction(int32 action) override + void DoAction(int32 /*action*/) override { me->GetMotionMaster()->MoveCirclePath(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY(), me->GetPositionZ() + 5.0f, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), true, 16); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 8105f7de5ff..91ef240a1a3 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -548,7 +548,7 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader } } - void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/) { /*Unit* target = GetTarget(); if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) diff --git a/src/server/shared/Updater/UpdateFetcher.h b/src/server/shared/Updater/UpdateFetcher.h index f545c232a94..48a94444aa6 100644 --- a/src/server/shared/Updater/UpdateFetcher.h +++ b/src/server/shared/Updater/UpdateFetcher.h @@ -27,7 +27,7 @@ class UpdateFetcher { - using Path = boost::filesystem::path; + typedef boost::filesystem::path Path; public: UpdateFetcher(Path const& updateDirectory, @@ -53,6 +53,9 @@ private: struct AppliedFileEntry { + AppliedFileEntry(std::string const& name_, std::string const& hash_, State state_, uint64 timestamp_) + : name(name_), hash(hash_), state(state_), timestamp(timestamp_) { } + std::string const name; std::string const hash; @@ -79,12 +82,14 @@ private: struct DirectoryEntry { + DirectoryEntry(Path const& path_, State state_) : path(path_), state(state_) { } + Path const path; State const state; }; - using LocaleFileEntry = std::pair; + typedef std::pair LocaleFileEntry; struct PathCompare { @@ -94,11 +99,11 @@ private: } }; - using LocaleFileStorage = std::set; - using HashToFileNameStorage = std::unordered_map; - using AppliedFileStorage = std::unordered_map; - using DirectoryStorage = std::vector; - using SQLUpdate = std::shared_ptr; + typedef std::set LocaleFileStorage; + typedef std::unordered_map HashToFileNameStorage; + typedef std::unordered_map AppliedFileStorage; + typedef std::vector DirectoryStorage; + typedef std::shared_ptr SQLUpdate; LocaleFileStorage GetFileList() const; void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, State const state, uint32 const depth) const; diff --git a/src/server/shared/Utilities/ServiceWin32.cpp b/src/server/shared/Utilities/ServiceWin32.cpp index c73949fc6a3..3e5e416b1a3 100644 --- a/src/server/shared/Utilities/ServiceWin32.cpp +++ b/src/server/shared/Utilities/ServiceWin32.cpp @@ -255,7 +255,7 @@ bool WinServiceRun() if (!StartServiceCtrlDispatcher(serviceTable)) { - TC_LOG_ERROR("server.worldserver", "StartService Failed. Error [%u]", ::GetLastError()); + TC_LOG_ERROR("server.worldserver", "StartService Failed. Error [%u]", uint32(::GetLastError())); return false; } return true; diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 50bb8d7646d..a1e8ba74514 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -325,7 +325,7 @@ void ShutdownCLIThread(std::thread* cliThread) errorBuffer = "Unknown error"; TC_LOG_DEBUG("server.worldserver", "Error cancelling I/O of CliThread, error code %u, detail: %s", - errorCode, errorBuffer); + uint32(errorCode), errorBuffer); LocalFree(errorBuffer); // send keyboard input to safely unblock the CLI thread -- cgit v1.2.3 From ee6fd67552650ae8ae180885f7e916721f917908 Mon Sep 17 00:00:00 2001 From: Carbenium Date: Sun, 22 Mar 2015 18:55:22 +0100 Subject: Core/PacketIO: Sync with WPP --- src/server/game/Server/Packets/GuildPackets.cpp | 1 + src/server/game/Server/Packets/GuildPackets.h | 1 + src/server/game/Server/Packets/SpellPackets.cpp | 2 +- src/server/game/Server/Packets/SpellPackets.h | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 65 +++--- src/server/game/Server/Protocol/Opcodes.h | 261 ++++++++++++------------ src/server/game/Spells/SpellHistory.cpp | 1 - 7 files changed, 168 insertions(+), 165 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index ef0c01c5cb7..82b003fef23 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -509,6 +509,7 @@ WorldPacket const* WorldPackets::Guild::GuildPartyState::Write() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRewardItem const& rewardItem) { data << rewardItem.ItemID; + data << rewardItem.Unk4; data << uint32(rewardItem.AchievementsRequired.size()); data << rewardItem.RaceMask; data << rewardItem.MinGuildLevel; diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 9d146587c46..ff59831612a 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -671,6 +671,7 @@ namespace WorldPackets struct GuildRewardItem { uint32 ItemID = 0; + uint32 Unk4 = 0; std::vector AchievementsRequired; uint32 RaceMask = 0; int32 MinGuildLevel = 0; diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 4045a76cb62..4dfbd67f44f 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -500,9 +500,9 @@ WorldPacket const* WorldPackets::Spells::ClearCooldowns::Write() WorldPacket const* WorldPackets::Spells::ClearCooldown::Write() { - _worldPacket << CasterGUID; _worldPacket << uint32(SpellID); _worldPacket.WriteBit(ClearOnHold); + _worldPacket.WriteBit(Unk20); _worldPacket.FlushBits(); return &_worldPacket; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 72a4fd4bdce..865e856aa6f 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -439,9 +439,9 @@ namespace WorldPackets WorldPacket const* Write() override; - ObjectGuid CasterGUID; int32 SpellID = 0; bool ClearOnHold = false; + bool Unk20 = false; }; class ModifyCooldown final : public ServerPacket diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5d7c18db742..100eb12daab 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -183,7 +183,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode ); - DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); + DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); @@ -323,7 +323,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_DANCE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Query::DBQueryBulk, &WorldSession::HandleDBQueryBulk); DEFINE_HANDLER(CMSG_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::DeclineGuildInvites, &WorldSession::HandleDeclineGuildInvites); - DEFINE_HANDLER(CMSG_DECLINE_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::DeclinePetition, &WorldSession::HandleDeclinePetition); + DEFINE_HANDLER(CMSG_DECLINE_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::DeclinePetition, &WorldSession::HandleDeclinePetition); DEFINE_OPCODE_HANDLER_OLD(CMSG_DELETE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete ); DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode); @@ -397,7 +397,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_CANCEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_REQUEST_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRequestJoinUpdates ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank); + DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank); DEFINE_HANDLER(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAssignMemberRank, &WorldSession::HandleGuildAssignRank); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_AUTO_DECLINE_INVITATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_GUILD_BANK_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankActivate, &WorldSession::HandleGuildBankActivate); @@ -411,10 +411,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_BANK_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankTextQuery, &WorldSession::HandleGuildBankTextQuery); DEFINE_HANDLER(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankUpdateTab, &WorldSession::HandleGuildBankUpdateTab); DEFINE_HANDLER(CMSG_GUILD_BANK_WITHDRAW_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankWithdrawMoney, &WorldSession::HandleGuildBankWithdrawMoney); - DEFINE_HANDLER(CMSG_GUILD_CHALLENGE_UPDATE_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildChallengeUpdateRequest, &WorldSession::HandleGuildChallengeUpdateRequest); + DEFINE_HANDLER(CMSG_GUILD_CHALLENGE_UPDATE_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildChallengeUpdateRequest, &WorldSession::HandleGuildChallengeUpdateRequest); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_CHANGE_NAME_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_GUILD_DECLINE_INVITATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeclineInvitation, &WorldSession::HandleGuildDeclineInvitation); - DEFINE_HANDLER(CMSG_GUILD_DELETE_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeleteRank, &WorldSession::HandleGuildDeleteRank); + DEFINE_HANDLER(CMSG_GUILD_DELETE_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeleteRank, &WorldSession::HandleGuildDeleteRank); DEFINE_HANDLER(CMSG_GUILD_DEMOTE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDemoteMember, &WorldSession::HandleGuildDemoteMember); DEFINE_HANDLER(CMSG_GUILD_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDelete, &WorldSession::HandleGuildDelete); DEFINE_HANDLER(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildEventLogQuery, &WorldSession::HandleGuildEventLogQuery); @@ -431,7 +431,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_MEMBER_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_GUILD_QUERY_NEWS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::GuildQueryNews, &WorldSession::HandleGuildQueryNews); + DEFINE_HANDLER(CMSG_GUILD_QUERY_NEWS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::GuildQueryNews, &WorldSession::HandleGuildQueryNews); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REPLACE_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_GUILD_REQUEST_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::RequestGuildPartyState, &WorldSession::HandleGuildRequestPartyState); @@ -504,11 +504,11 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem); - DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete); - DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead); + DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete); + DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead); DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender); - DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem); - DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney); + DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem); + DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney); DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MEETINGSTONE_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_CHANNEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -622,13 +622,13 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_SILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNINVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNSILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); + DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); DEFINE_HANDLER(CMSG_PETITION_RENAME_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionRenameGuild, &WorldSession::HandlePetitionRenameGuild); DEFINE_HANDLER(CMSG_PETITION_SHOW_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowList, &WorldSession::HandlePetitionShowList); - DEFINE_HANDLER(CMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowSignatures, &WorldSession::HandlePetitionShowSignatures); + DEFINE_HANDLER(CMSG_PETITION_SHOW_SIGNATURES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowSignatures, &WorldSession::HandlePetitionShowSignatures); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ABANDON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAbandon ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAction ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_FINAL_NOTIF, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_FINAL_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_INPUT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_QUIT_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -637,7 +637,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_REQUEST_WILD, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode ); - DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); + DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_CACHE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename ); @@ -673,6 +673,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTLOG_SWAP_QUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_CLOSE_AUTOACCEPT_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_POI_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPOIQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult ); @@ -702,7 +703,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_FORCED_REACTIONS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); + DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -795,7 +796,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SPELLCLICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivateOpcode); DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); - DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); + DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_START_QUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_START_WARGAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1018,7 +1019,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ACTION_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1094,7 +1095,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1263,7 +1264,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1291,13 +1292,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_KNOWN_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_WITH_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_UPDATE_NOTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NAME_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1305,7 +1306,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARDS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARDS_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SEND_RANK_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1343,7 +1344,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1439,10 +1440,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1531,7 +1532,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_WONT_TALK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1556,7 +1557,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_DECLINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1597,7 +1598,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UPDATE_COMBO_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1712,7 +1713,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCRIPT_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_ITEM_PASSIVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1805,7 +1806,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TABARD_VENDOR_ACTIVATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1828,8 +1829,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 498a2db708d..8f55575fe53 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -50,12 +50,12 @@ enum OpcodeClient : uint32 CMSG_ACCEPT_LEVEL_GRANT = 0xBADD, CMSG_ACCEPT_TRADE = 0xBADD, CMSG_ACCEPT_WARGAME_INVITE = 0xBADD, - CMSG_ACTIVATE_TAXI = 0xBADD, + CMSG_ACTIVATE_TAXI = 0x0823, CMSG_ACTIVATE_TAXI_EXPRESS = 0xBADD, CMSG_ADD_BATTLENET_FRIEND = 0xBADD, CMSG_ADD_FRIEND = 0x15E2, CMSG_ADD_IGNORE = 0x1D33, - CMSG_ALTER_APPEARANCE = 0xBADD, + CMSG_ALTER_APPEARANCE = 0x0822, CMSG_AREATRIGGER = 0x1904, CMSG_AREA_SPIRIT_HEALER_QUERY = 0x093A, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0xBADD, @@ -85,8 +85,8 @@ enum OpcodeClient : uint32 CMSG_AUTOBANK_ITEM = 0x00C6, CMSG_AUTOEQUIP_GROUND_ITEM = 0xBADD, CMSG_AUTOEQUIP_ITEM = 0x0235, - CMSG_AUTOEQUIP_ITEM_SLOT = 0x00E5, - CMSG_AUTOSTORE_BAG_ITEM = 0xBADD, + CMSG_AUTOEQUIP_ITEM_SLOT = 0x0076, + CMSG_AUTOSTORE_BAG_ITEM = 0x00E5, CMSG_AUTOSTORE_BANK_ITEM = 0x00D5, CMSG_AUTOSTORE_GROUND_ITEM = 0xBADD, CMSG_AUTOSTORE_LOOT_ITEM = 0x0843, @@ -158,7 +158,7 @@ enum OpcodeClient : uint32 CMSG_CANCEL_CHANNELLING = 0xBADD, CMSG_CANCEL_GROWTH_AURA = 0xBADD, CMSG_CANCEL_MASTER_LOOT_ROLL = 0xBADD, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0xBADD, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x0851, CMSG_CANCEL_MOUNT_AURA = 0x0B4C, CMSG_CANCEL_QUEUED_SPELL = 0xBADD, CMSG_CANCEL_TEMP_ENCHANTMENT = 0xBADD, @@ -201,7 +201,7 @@ enum OpcodeClient : uint32 CMSG_CHAR_RENAME = 0xBADD, CMSG_CHAR_UNDELETE_ENUM = 0xBADD, CMSG_CHECK_RAF_EMAIL_ENABLED = 0xBADD, - CMSG_CHOICE_RESPONSE = 0xBADD, + CMSG_CHOICE_RESPONSE = 0x094C, CMSG_CLEAR_RAID_MARKER = 0xBADD, CMSG_CLEAR_TRADE_ITEM = 0xBADD, CMSG_CLOSE_INTERACTION = 0x0A3A, @@ -215,25 +215,25 @@ enum OpcodeClient : uint32 CMSG_COMMENTATOR_SKIRMISH_QUEUE_COMMAND = 0xBADD, CMSG_COMMENTATOR_START_WARGAME = 0xBADD, CMSG_COMPLAIN = 0xBADD, - CMSG_COMPLETE_CINEMATIC = 0xBADD, - CMSG_COMPLETE_MOVIE = 0xBADD, + CMSG_COMPLETE_CINEMATIC = 0x0EC4, + CMSG_COMPLETE_MOVIE = 0x1319, CMSG_CONFIRM_RESPEC_WIPE = 0xBADD, CMSG_CONNECT_TO_FAILED = 0x15B4, CMSG_CONVERSATION_UNK1 = 0xBADD, CMSG_CONVERT_RAID = 0x1329, - CMSG_CREATE_SHIPMENT = 0xBADD, + CMSG_CREATE_SHIPMENT = 0x1B94, CMSG_CREATURE_QUERY = 0x007C, CMSG_DANCE_QUERY = 0xBADD, CMSG_DB_QUERY_BULK = 0x1731, CMSG_DECLINE_GUILD_INVITES = 0xBADD, - CMSG_DECLINE_PETITION = 0xBADD, + CMSG_DECLINE_PETITION = 0x0932, CMSG_DELETE_EQUIPMENT_SET = 0x1599, CMSG_DEL_FRIEND = 0x1B71, CMSG_DEL_IGNORE = 0x1BB3, CMSG_DEPOSIT_REAGENT_BANK = 0x1142, CMSG_DESTROY_ITEM = 0x0651, CMSG_DF_BOOT_PLAYER_VOTE = 0xBADD, - CMSG_DF_JOIN = 0xBADD, + CMSG_DF_JOIN = 0x1D39, CMSG_DF_LEAVE = 0xBADD, CMSG_DF_PROPOSAL_RESPONSE = 0xBADD, CMSG_DF_SEARCH_JOIN = 0xBADD, @@ -251,17 +251,17 @@ enum OpcodeClient : uint32 CMSG_ENABLE_NAGLE = 0x1433, CMSG_ENABLE_TAXI_NODE = 0x13D9, CMSG_EQUIPMENT_SET_SAVE = 0x0A7C, - CMSG_FAR_SIGHT = 0xBADD, + CMSG_FAR_SIGHT = 0x0181, CMSG_GAMEOBJECT_QUERY = 0x021A, CMSG_GAMEOBJ_REPORT_USE = 0x087C, CMSG_GAMEOBJ_USE = 0x0EE4, CMSG_GAMESPEED_SET = 0xBADD, CMSG_GAMETIME_SET = 0xBADD, CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0xBADD, - CMSG_GARRISON_COMPLETE_MISSION = 0xBADD, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0xBADD, + CMSG_GARRISON_COMPLETE_MISSION = 0x15C3, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x1B83, CMSG_GARRISON_OPEN_TRADESKILL_NPC = 0xBADD, - CMSG_GARRISON_PURCHASE_BUILDING = 0xBADD, + CMSG_GARRISON_PURCHASE_BUILDING = 0x0E24, CMSG_GARRISON_RECRUIT_FOLLOWER = 0xBADD, CMSG_GARRISON_REMOVE_FOLLOWER = 0xBADD, CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0xBADD, @@ -271,7 +271,7 @@ enum OpcodeClient : uint32 CMSG_GARRISON_SET_BUILDING_ACTIVE = 0xBADD, CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0xBADD, CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0xBADD, - CMSG_GARRISON_START_MISSION = 0xBADD, + CMSG_GARRISON_START_MISSION = 0x0023, CMSG_GARRISON_SWAP_BUILDINGS = 0xBADD, CMSG_GARRISON_UNK1 = 0xBADD, CMSG_GETDEATHBINDZONE = 0xBADD, @@ -280,7 +280,7 @@ enum OpcodeClient : uint32 CMSG_GET_ITEM_PURCHASE_DATA = 0x0CE4, CMSG_GET_MAIL_LIST = 0x0979, CMSG_GET_MIRROR_IMAGE_DATA = 0x1952, - CMSG_GET_SHIPMENT_INFO = 0xBADD, + CMSG_GET_SHIPMENT_INFO = 0x0321, CMSG_GET_TROPHY_LIST = 0xBADD, CMSG_GET_UNDELETE_COOLDOWN_STATUS = 0x196A, CMSG_GHOST = 0xBADD, @@ -303,9 +303,9 @@ enum OpcodeClient : uint32 CMSG_GROUP_CANCEL = 0xBADD, CMSG_GROUP_REQUEST_JOIN_UPDATES = 0xBADD, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0xBADD, - CMSG_GUILD_ADD_RANK = 0xBADD, + CMSG_GUILD_ADD_RANK = 0x038E, CMSG_GUILD_ASSIGN_MEMBER_RANK = 0xBADD, - CMSG_GUILD_AUTO_DECLINE_INVITATION = 0xBADD, + CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x0386, CMSG_GUILD_BANK_ACTIVATE = 0x0B64, CMSG_GUILD_BANK_BUY_TAB = 0xBADD, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0xBADD, @@ -318,11 +318,11 @@ enum OpcodeClient : uint32 CMSG_GUILD_BANK_TEXT_QUERY = 0xBADD, CMSG_GUILD_BANK_UPDATE_TAB = 0xBADD, CMSG_GUILD_BANK_WITHDRAW_MONEY = 0xBADD, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0xBADD, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x03B0, CMSG_GUILD_CHANGE_NAME_REQUEST = 0xBADD, CMSG_GUILD_DECLINE_INVITATION = 0xBADD, CMSG_GUILD_DELETE = 0xBADD, - CMSG_GUILD_DELETE_RANK = 0xBADD, + CMSG_GUILD_DELETE_RANK = 0x019D, CMSG_GUILD_DEMOTE_MEMBER = 0xBADD, CMSG_GUILD_EVENT_LOG_QUERY = 0xBADD, CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0xBADD, @@ -338,9 +338,9 @@ enum OpcodeClient : uint32 CMSG_GUILD_PROMOTE_MEMBER = 0xBADD, CMSG_GUILD_QUERY = 0x19B3, CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0xBADD, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0xBADD, - CMSG_GUILD_QUERY_NEWS = 0xBADD, - CMSG_GUILD_QUERY_RECIPES = 0xBADD, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x0110, + CMSG_GUILD_QUERY_NEWS = 0x01A5, + CMSG_GUILD_QUERY_RECIPES = 0x0538, CMSG_GUILD_REPLACE_GUILD_MASTER = 0xBADD, CMSG_GUILD_REQUEST_PARTY_STATE = 0x0B52, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x039E, @@ -391,7 +391,7 @@ enum OpcodeClient : uint32 CMSG_LF_GUILD_BROWSE = 0x11E4, CMSG_LF_GUILD_DECLINE_RECRUIT = 0xBADD, CMSG_LF_GUILD_GET_APPLICATIONS = 0xBADD, - CMSG_LF_GUILD_GET_GUILD_POST = 0xBADD, + CMSG_LF_GUILD_GET_GUILD_POST = 0x012E, CMSG_LF_GUILD_GET_RECRUITS = 0xBADD, CMSG_LF_GUILD_REMOVE_RECRUIT = 0xBADD, CMSG_LF_GUILD_SET_GUILD_POST = 0xBADD, @@ -412,11 +412,11 @@ enum OpcodeClient : uint32 CMSG_LOW_LEVEL_RAID1 = 0xBADD, CMSG_LOW_LEVEL_RAID2 = 0xBADD, CMSG_MAIL_CREATE_TEXT_ITEM = 0xBADD, - CMSG_MAIL_DELETE = 0xBADD, - CMSG_MAIL_MARK_AS_READ = 0xBADD, + CMSG_MAIL_DELETE = 0x0C89, + CMSG_MAIL_MARK_AS_READ = 0x13C9, CMSG_MAIL_RETURN_TO_SENDER = 0xBADD, - CMSG_MAIL_TAKE_ITEM = 0xBADD, - CMSG_MAIL_TAKE_MONEY = 0xBADD, + CMSG_MAIL_TAKE_ITEM = 0x0D84, + CMSG_MAIL_TAKE_MONEY = 0x0861, CMSG_MASTER_LOOT_ITEM = 0xBADD, CMSG_MEETINGSTONE_INFO = 0xBADD, CMSG_MESSAGECHAT_ADDON_CHANNEL = 0x108C, @@ -441,7 +441,7 @@ enum OpcodeClient : uint32 CMSG_MESSAGECHAT_YELL = 0x1481, CMSG_MINIGAME_MOVE = 0xBADD, CMSG_MINIMAP_PING = 0xBADD, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0xBADD, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x085A, CMSG_MOUNT_SET_FAVORITE = 0x15B1, CMSG_MOUNT_SPECIAL_ANIM = 0xBADD, CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0xBADD, @@ -513,7 +513,7 @@ enum OpcodeClient : uint32 CMSG_NAME_QUERY = 0x15A2, CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0xBADD, CMSG_NEW_SPELL_SLOT = 0xBADD, - CMSG_NEXT_CINEMATIC_CAMERA = 0xBADD, + CMSG_NEXT_CINEMATIC_CAMERA = 0x110B, CMSG_NPC_TEXT_QUERY = 0x0E44, CMSG_OBJECT_UPDATE_FAILED = 0xBADD, CMSG_OBJECT_UPDATE_RESCUED = 0x0C8A, @@ -530,22 +530,22 @@ enum OpcodeClient : uint32 CMSG_PARTY_SILENCE = 0xBADD, CMSG_PARTY_UNINVITE = 0xBADD, CMSG_PARTY_UNSILENCE = 0xBADD, - CMSG_PETITION_BUY = 0xBADD, + CMSG_PETITION_BUY = 0x159B, CMSG_PETITION_RENAME_GUILD = 0xBADD, CMSG_PETITION_SHOW_LIST = 0x06E1, - CMSG_PETITION_SHOW_SIGNATURES = 0xBADD, + CMSG_PETITION_SHOW_SIGNATURES = 0x115A, CMSG_PET_ABANDON = 0xBADD, CMSG_PET_ACTION = 0x114A, - CMSG_PET_BATTLE_FINAL_NOTIF = 0xBADD, - CMSG_PET_BATTLE_INPUT = 0xBADD, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x004B, + CMSG_PET_BATTLE_INPUT = 0x1B34, CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0xBADD, CMSG_PET_BATTLE_QUIT_NOTIFY = 0xBADD, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0xBADD, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x192A, CMSG_PET_BATTLE_REQUEST_PVP = 0xBADD, CMSG_PET_BATTLE_REQUEST_WILD = 0x084C, CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0xBADD, CMSG_PET_CANCEL_AURA = 0xBADD, - CMSG_PET_CAST_SPELL = 0xBADD, + CMSG_PET_CAST_SPELL = 0x1FC1, CMSG_PET_NAME_CACHE = 0xBADD, CMSG_PET_NAME_QUERY = 0x0CCB, CMSG_PET_RENAME = 0x1333, @@ -581,6 +581,7 @@ enum OpcodeClient : uint32 CMSG_QUESTGIVER_STATUS_QUERY = 0x0A7B, CMSG_QUESTLOG_REMOVE_QUEST = 0x04C3, CMSG_QUESTLOG_SWAP_QUEST = 0xBADD, + CMSG_QUEST_CLOSE_AUTOACCEPT_QUEST = 0x150A, CMSG_QUEST_CONFIRM_ACCEPT = 0xBADD, CMSG_QUEST_POI_QUERY = 0x1B2A, CMSG_QUEST_PUSH_RESULT = 0xBADD, @@ -604,18 +605,18 @@ enum OpcodeClient : uint32 CMSG_REPORT_IGNORED = 0xBADD, CMSG_REPORT_PVP_AFK = 0xBADD, CMSG_REQUEST_ACCOUNT_DATA = 0x1934, - CMSG_REQUEST_ARTIFACT_COMPLETION_HISTORY = 0xBADD, + CMSG_REQUEST_ARTIFACT_COMPLETION_HISTORY = 0x025A, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x17EC, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x0C72, CMSG_REQUEST_CEMETERY_LIST = 0x0421, CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x1342, CMSG_REQUEST_FORCED_REACTIONS = 0x012A, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0xBADD, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x015A, CMSG_REQUEST_HONOR_STATS = 0xBADD, CMSG_REQUEST_LFG_LIST_BLACKLIST = 0xBADD, CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x1339, CMSG_REQUEST_PARTY_MEMBER_STATS = 0x1972, - CMSG_REQUEST_PET_INFO = 0xBADD, + CMSG_REQUEST_PET_INFO = 0x0981, CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0xBADD, CMSG_REQUEST_PVP_REWARDS = 0xBADD, CMSG_REQUEST_RAID_INFO = 0x1163, @@ -652,7 +653,7 @@ enum OpcodeClient : uint32 CMSG_SET_ACTION_BUTTON = 0x13BA, CMSG_SET_ACTIVE_MOVER = 0x07CC, CMSG_SET_ACTIVE_VOICE_CHANNEL = 0xBADD, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0xBADD, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x017C, CMSG_SET_ASSISTANT_LEADER = 0xBADD, CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0xBADD, CMSG_SET_BANK_AUTOSORT_DISABLED = 0xBADD, @@ -672,7 +673,7 @@ enum OpcodeClient : uint32 CMSG_SET_PARTY_ASSIGNMENT = 0xBADD, CMSG_SET_PARTY_LEADER = 0x1932, CMSG_SET_PET_SLOT = 0xBADD, - CMSG_SET_PLAYER_DECLINED_NAMES = 0xBADD, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x1331, CMSG_SET_PREFERED_CEMETERY = 0xBADD, CMSG_SET_PVP = 0xBADD, CMSG_SET_RAID_DIFFICULTY = 0x1162, @@ -697,19 +698,19 @@ enum OpcodeClient : uint32 CMSG_SIGN_PETITION = 0xBADD, CMSG_SILENCE_PARTY_TALKER = 0xBADD, CMSG_SOCKET_GEMS = 0xBADD, - CMSG_SORT_BAGS = 0xBADD, + CMSG_SORT_BAGS = 0x0254, CMSG_SORT_BANK_BAGS = 0x1901, CMSG_SORT_REAGENT_BANK_BAGS = 0xBADD, CMSG_SPELLCLICK = 0x0DE3, CMSG_SPIRIT_HEALER_ACTIVATE = 0x0CA4, CMSG_SPLIT_ITEM = 0x0095, - CMSG_STAND_STATE_CHANGE = 0xBADD, + CMSG_STAND_STATE_CHANGE = 0x037A, CMSG_START_QUEST = 0xBADD, CMSG_START_SPECTATOR_WAR_GAME = 0xBADD, CMSG_START_WARGAME = 0xBADD, CMSG_STOP_DANCE = 0xBADD, CMSG_STORE_LOOT_IN_SLOT = 0xBADD, - CMSG_SUMMON_RESPONSE = 0xBADD, + CMSG_SUMMON_RESPONSE = 0x1BFA, CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x11BB, CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x1BB1, CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x1B63, @@ -724,7 +725,7 @@ enum OpcodeClient : uint32 CMSG_TAXIENABLEALLNODES = 0xBADD, CMSG_TAXISHOWNODES = 0xBADD, CMSG_TAXI_NODE_STATUS_QUERY = 0x0EA1, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0xBADD, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0A3B, CMSG_TELEPORT_TO_UNIT = 0xBADD, CMSG_TEXT_EMOTE = 0x0B2B, CMSG_TIME_ADJUSTMENT_RESPONSE = 0xBADD, @@ -735,7 +736,7 @@ enum OpcodeClient : uint32 CMSG_TOGGLE_PVP = 0x10A2, CMSG_TOTEM_DESTROYED = 0x1189, CMSG_TOY_SET_FAVORITE = 0xBADD, - CMSG_TRAINER_BUY_SPELL = 0xBADD, + CMSG_TRAINER_BUY_SPELL = 0x151A, CMSG_TRAINER_LIST = 0x130C, CMSG_TRANSMOGRIFY_ITEMS = 0xBADD, CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD, @@ -761,7 +762,7 @@ enum OpcodeClient : uint32 CMSG_USE_EQUIPMENT_SET = 0x0026, CMSG_USE_ITEM = 0x0A5A, CMSG_USE_PARTY_GARRISON = 0xBADD, - CMSG_USE_TOY = 0xBADD, + CMSG_USE_TOY = 0x1BC3, CMSG_VIOLENCE_LEVEL = 0x0071, CMSG_VOICE_ADD_IGNORE = 0xBADD, CMSG_VOICE_DEL_IGNORE = 0xBADD, @@ -809,7 +810,7 @@ enum OpcodeServer : uint32 SMSG_ACHIEVEMENT_DELETED = 0x0B2C, SMSG_ACHIEVEMENT_EARNED = 0x1D8C, SMSG_ACTION_BUTTONS = 0x153B, - SMSG_ACTIVATE_TAXI_REPLY = 0xBADD, + SMSG_ACTIVATE_TAXI_REPLY = 0x1B8A, SMSG_ADDON_INFO = 0x1F5C, SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0xBADD, SMSG_ADD_ITEM_PASSIVE = 0xBADD, @@ -828,7 +829,7 @@ enum OpcodeServer : uint32 SMSG_AREA_SPIRIT_HEALER_TIME = 0xBADD, SMSG_AREA_TRIGGER_DEBUG_PLAYER_INSIDE = 0xBADD, SMSG_AREA_TRIGGER_DEBUG_SWEEP = 0xBADD, - SMSG_AREA_TRIGGER_DENIED = 0xBADD, + SMSG_AREA_TRIGGER_DENIED = 0x19FC, SMSG_AREA_TRIGGER_MESSAGE = 0xBADD, SMSG_AREA_TRIGGER_NO_CORPSE = 0xBADD, SMSG_AREA_TRIGGER_RE_PATH = 0xBADD, @@ -868,7 +869,7 @@ enum OpcodeServer : uint32 SMSG_AUTH_RESPONSE = 0x0B61, SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD, SMSG_AVERAGE_ITEM_LEVEL_INFORM = 0xBADD, - SMSG_BARBER_SHOP_RESULT = 0xBADD, + SMSG_BARBER_SHOP_RESULT = 0x1B89, SMSG_BATTLEFIELD_LIST = 0xBADD, SMSG_BATTLEFIELD_MGR_DROP_TIMER_CANCELED = 0xBADD, SMSG_BATTLEFIELD_MGR_DROP_TIMER_STARTED = 0xBADD, @@ -881,12 +882,12 @@ enum OpcodeServer : uint32 SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE = 0xBADD, SMSG_BATTLEFIELD_MGR_STATE_CHANGED = 0xBADD, SMSG_BATTLEFIELD_PORT_DENIED = 0xBADD, - SMSG_BATTLEFIELD_RATED_INFO = 0xBADD, + SMSG_BATTLEFIELD_RATED_INFO = 0x1322, SMSG_BATTLEFIELD_STATUS_ACTIVE = 0xBADD, SMSG_BATTLEFIELD_STATUS_FAILED = 0xBADD, SMSG_BATTLEFIELD_STATUS_NEEDCONFIRMATION = 0xBADD, SMSG_BATTLEFIELD_STATUS_NONE = 0xBADD, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0xBADD, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x135A, SMSG_BATTLEFIELD_STATUS_WAITFORGROUPS = 0xBADD, SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD, SMSG_BATTLEGROUND_INIT = 0xBADD, @@ -927,10 +928,10 @@ enum OpcodeServer : uint32 SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0xBADD, SMSG_BLACK_MARKET_WON = 0xBADD, SMSG_BONUS_ROLL_EMPTY = 0xBADD, - SMSG_BREAK_TARGET = 0xBADD, + SMSG_BREAK_TARGET = 0x159A, SMSG_BUY_BANK_SLOT_RESULT = 0xBADD, SMSG_BUY_FAILED = 0xBADD, - SMSG_BUY_SUCCEEDED = 0xBADD, + SMSG_BUY_SUCCEEDED = 0x117B, SMSG_CALENDAR_ACTION_PENDING = 0xBADD, SMSG_CALENDAR_ARENA_TEAM = 0xBADD, SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0xBADD, @@ -949,10 +950,10 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_EVENT_STATUS = 0xBADD, SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0xBADD, SMSG_CALENDAR_FILTER_GUILD = 0xBADD, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0xBADD, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0C83, SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0xBADD, SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD, - SMSG_CALENDAR_SEND_CALENDAR = 0xBADD, + SMSG_CALENDAR_SEND_CALENDAR = 0x1562, SMSG_CALENDAR_SEND_EVENT = 0xBADD, SMSG_CALENDAR_SEND_NUM_PENDING = 0x17B1, SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD, @@ -1006,14 +1007,14 @@ enum OpcodeServer : uint32 SMSG_CHECK_WARGAME_ENTRY = 0xBADD, SMSG_CLEAR_ALL_SPELL_CHARGES = 0xBADD, SMSG_CLEAR_BOSS_EMOTES = 0xBADD, - SMSG_CLEAR_COOLDOWN = 0xBADD, + SMSG_CLEAR_COOLDOWN = 0x0964, SMSG_CLEAR_COOLDOWNS = 0xBADD, SMSG_CLEAR_FAR_SIGHT_IMMEDIATE = 0xBADD, SMSG_CLEAR_LOSS_OF_CONTROL = 0xBADD, SMSG_CLEAR_SPELL_CHARGES = 0xBADD, SMSG_CLEAR_TARGET = 0x17FA, SMSG_CLIENTCACHE_VERSION = 0x116C, - SMSG_CLIENT_CONTROL_UPDATE = 0xBADD, + SMSG_CLIENT_CONTROL_UPDATE = 0x1B4C, SMSG_COIN_REMOVED = 0x11A4, SMSG_COMBAT_EVENT_FAILED = 0x19D9, SMSG_COMBAT_LOG_MULTIPLE = 0xBADD, @@ -1024,7 +1025,7 @@ enum OpcodeServer : uint32 SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2 = 0xBADD, SMSG_COMMENTATOR_STATE_CHANGED = 0xBADD, SMSG_COMPLAINT_RESULT = 0xBADD, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x173C, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0xBADD, SMSG_COMPRESSED_MOVES = 0xBADD, SMSG_COMPRESSED_PACKET = 0x0689, SMSG_COMSAT_CONNECT_FAIL = 0xBADD, @@ -1040,7 +1041,7 @@ enum OpcodeServer : uint32 SMSG_CORPSE_LOCATION = 0x0A63, SMSG_CORPSE_RECLAIM_DELAY = 0x1B9C, SMSG_CORPSE_TRANSPORT_QUERY = 0x0B6C, - SMSG_CREATE_SHIPMENT_RESPONSE = 0xBADD, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x0839, SMSG_CREATURE_QUERY_RESPONSE = 0x0DC2, SMSG_CRITERIA_DELETED = 0x0B2A, SMSG_CRITERIA_UPDATE = 0x115A, @@ -1067,8 +1068,8 @@ enum OpcodeServer : uint32 SMSG_DISMOUNT = 0x1371, SMSG_DISMOUNT_RESULT = 0xBADD, SMSG_DISPEL_FAILED = 0xBADD, - SMSG_DISPLAY_GAME_ERROR = 0xBADD, - SMSG_DISPLAY_PLAYER_CHOICE = 0xBADD, + SMSG_DISPLAY_GAME_ERROR = 0x173B, + SMSG_DISPLAY_PLAYER_CHOICE = 0x087C, SMSG_DISPLAY_PROMOTION = 0x01E2, SMSG_DISPLAY_QUEST_POPUP = 0xBADD, SMSG_DISPLAY_TOAST = 0x17DA, @@ -1085,10 +1086,10 @@ enum OpcodeServer : uint32 SMSG_DYNAMIC_DROP_ROLL_RESULT = 0xBADD, SMSG_ECHO_PARTY_SQUELCH = 0xBADD, SMSG_EMOTE = 0x171C, - SMSG_ENABLE_BARBER_SHOP = 0xBADD, + SMSG_ENABLE_BARBER_SHOP = 0x1D5C, SMSG_ENCHANTMENT_LOG = 0x1563, - SMSG_ENCOUNTER_END = 0xBADD, - SMSG_ENCOUNTER_START = 0xBADD, + SMSG_ENCOUNTER_END = 0x0EC4, + SMSG_ENCOUNTER_START = 0x1B5C, SMSG_ENVIRONMENTALDAMAGELOG = 0x0679, SMSG_EQUIPMENT_SET_LIST = 0x111A, SMSG_EQUIPMENT_SET_SAVED = 0xBADD, @@ -1127,21 +1128,21 @@ enum OpcodeServer : uint32 SMSG_GARRISON_ADD_MISSION_RESULT = 0xBADD, SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0xBADD, SMSG_GARRISON_BUILDING_ACTIVATED = 0x07AA, - SMSG_GARRISON_BUILDING_REMOVED = 0xBADD, + SMSG_GARRISON_BUILDING_REMOVED = 0x0723, SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0xBADD, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0xBADD, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x02C2, SMSG_GARRISON_DELETE_RESULT = 0xBADD, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x07AC, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0xBADD, SMSG_GARRISON_LANDINGPAGE_SHIPMENTS = 0xBADD, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0xBADD, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x0701, SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0xBADD, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x0081, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0xBADD, SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0xBADD, SMSG_GARRISON_MONUMENT_SELECTED_TROPHY_ID_LOADED = 0xBADD, SMSG_GARRISON_OPEN_ARCHITECT = 0xBADD, SMSG_GARRISON_OPEN_MISSION_NPC = 0xBADD, SMSG_GARRISON_OPEN_TRADESKILL_NPC_RESPONSE = 0xBADD, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0xBADD, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x07CA, SMSG_GARRISON_PLOT_PLACED = 0xBADD, SMSG_GARRISON_PLOT_REMOVED = 0xBADD, SMSG_GARRISON_REMOTE_INFO = 0x0C39, @@ -1149,7 +1150,7 @@ enum OpcodeServer : uint32 SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0xBADD, SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0xBADD, SMSG_GARRISON_SET_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0xBADD, - SMSG_GARRISON_START_MISSION_RESULT = 0xBADD, + SMSG_GARRISON_START_MISSION_RESULT = 0x0AA1, SMSG_GARRISON_UNK1 = 0xBADD, SMSG_GARRISON_UNK3 = 0xBADD, SMSG_GARRISON_UPGRADEABLE_RESULT = 0xBADD, @@ -1157,7 +1158,7 @@ enum OpcodeServer : uint32 SMSG_GARRISON_UPGRADE_RESULT = 0xBADD, SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0xBADD, SMSG_GET_GARRISON_INFO_RESULT = 0x0733, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0xBADD, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x1F09, SMSG_GET_TROPHY_LIST_RESPONSE = 0xBADD, SMSG_GHOST = 0xBADD, SMSG_GHOSTEE_GONE = 0xBADD, @@ -1179,7 +1180,7 @@ enum OpcodeServer : uint32 SMSG_GOD_MODE = 0xBADD, SMSG_GOSSIP_COMPLETE = 0x07A8, SMSG_GOSSIP_MESSAGE = 0x0117, - SMSG_GOSSIP_POI = 0xBADD, + SMSG_GOSSIP_POI = 0x1BBC, SMSG_GROUP_ACTION_THROTTLED = 0xBADD, SMSG_GROUP_CANCEL = 0xBADD, SMSG_GROUP_DECLINE = 0xBADD, @@ -1195,7 +1196,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0xBADD, SMSG_GUILD_CANCEL = 0xBADD, SMSG_GUILD_CHALLENGE_COMPLETED = 0xBADD, - SMSG_GUILD_CHALLENGE_UPDATE = 0xBADD, + SMSG_GUILD_CHALLENGE_UPDATE = 0x04F3, SMSG_GUILD_CHANGE_NAME_RESULT = 0xBADD, SMSG_GUILD_COMMAND_RESULT = 0x0B94, SMSG_GUILD_CRITERIA_DELETED = 0x09B4, @@ -1221,24 +1222,24 @@ enum OpcodeServer : uint32 SMSG_GUILD_INVITE_CANCEL = 0xBADD, SMSG_GUILD_INVITE_DECLINED = 0xBADD, SMSG_GUILD_INVITE_EXPIRED = 0xBADD, - SMSG_GUILD_KNOWN_RECIPES = 0xBADD, + SMSG_GUILD_KNOWN_RECIPES = 0x04B3, SMSG_GUILD_MEMBERS_WITH_RECIPE = 0xBADD, - SMSG_GUILD_MEMBER_DAILY_RESET = 0xBADD, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x08D4, SMSG_GUILD_MEMBER_RECIPES = 0xBADD, SMSG_GUILD_MEMBER_UPDATE_NOTE = 0xBADD, SMSG_GUILD_MOVED = 0xBADD, SMSG_GUILD_MOVE_STARTING = 0xBADD, SMSG_GUILD_NAME_CHANGED = 0xBADD, - SMSG_GUILD_NEWS = 0xBADD, - SMSG_GUILD_NEWS_DELETED = 0xBADD, + SMSG_GUILD_NEWS = 0x05F4, + SMSG_GUILD_NEWS_DELETED = 0x0194, SMSG_GUILD_PARTY_STATE_RESPONSE = 0x0BD4, SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x07D4, SMSG_GUILD_QUERY_RESPONSE = 0x06F3, SMSG_GUILD_RANKS = 0x01D3, SMSG_GUILD_RECIPES = 0xBADD, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x0293, SMSG_GUILD_RESET = 0xBADD, - SMSG_GUILD_REWARDS_LIST = 0xBADD, + SMSG_GUILD_REWARDS_LIST = 0x04D3, SMSG_GUILD_ROSTER = 0x07F3, SMSG_GUILD_ROSTER_UPDATE = 0xBADD, SMSG_GUILD_SEND_RANK_CHANGE = 0xBADD, @@ -1277,8 +1278,8 @@ enum OpcodeServer : uint32 SMSG_INVALIDATE_DANCE = 0xBADD, SMSG_INVALIDATE_PLAYER = 0x1799, SMSG_INVALID_PROMOTION_CODE = 0xBADD, - SMSG_INVENTORY_CHANGE_FAILURE = 0xBADD, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0xBADD, + SMSG_INVENTORY_CHANGE_FAILURE = 0x05E1, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x0108, SMSG_ITEM_COOLDOWN = 0x05A3, SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x176A, SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x112B, @@ -1296,7 +1297,7 @@ enum OpcodeServer : uint32 SMSG_LFG_BOOT_PLAYER = 0xBADD, SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_DISABLED = 0xBADD, - SMSG_LFG_JOIN_RESULT = 0xBADD, + SMSG_LFG_JOIN_RESULT = 0x01BA, SMSG_LFG_LIST_JOIN_RESULT = 0xBADD, SMSG_LFG_LIST_UPDATE_BLACKLIST = 0xBADD, SMSG_LFG_LIST_UPDATE_STATUS = 0xBADD, @@ -1307,10 +1308,10 @@ enum OpcodeServer : uint32 SMSG_LFG_PLAYER_REWARD = 0xBADD, SMSG_LFG_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_QUEUE_STATUS = 0x0292, - SMSG_LFG_ROLE_CHECK_UPDATE = 0xBADD, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x01D9, SMSG_LFG_ROLE_CHOSEN = 0xBADD, SMSG_LFG_SEARCH_RESULTS = 0xBADD, - SMSG_LFG_SLOT_INVALID = 0xBADD, + SMSG_LFG_SLOT_INVALID = 0x0191, SMSG_LFG_TELEPORT_DENIED = 0xBADD, SMSG_LFG_UPDATE_LIST = 0xBADD, SMSG_LFG_UPDATE_SEARCH = 0xBADD, @@ -1321,8 +1322,8 @@ enum OpcodeServer : uint32 SMSG_LF_GUILD_BROWSE = 0xBADD, SMSG_LF_GUILD_COMMAND_RESULT = 0xBADD, SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED = 0xBADD, - SMSG_LF_GUILD_POST = 0xBADD, - SMSG_LF_GUILD_RECRUITS = 0xBADD, + SMSG_LF_GUILD_POST = 0x0BD3, + SMSG_LF_GUILD_RECRUITS = 0x0CB3, SMSG_LIST_INVENTORY = 0x17A1, SMSG_LIST_TARGETS = 0xBADD, SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0xBADD, @@ -1334,7 +1335,7 @@ enum OpcodeServer : uint32 SMSG_LOGOUT_CANCEL_ACK = 0x1D8A, SMSG_LOGOUT_COMPLETE = 0x17AA, SMSG_LOGOUT_RESPONSE = 0x05C3, - SMSG_LOG_XPGAIN = 0xBADD, + SMSG_LOG_XPGAIN = 0x1B8B, SMSG_LOOT_ALL_PASSED = 0xBADD, SMSG_LOOT_CONTENTS = 0x1334, SMSG_LOOT_ITEM_LIST = 0xBADD, @@ -1372,17 +1373,17 @@ enum OpcodeServer : uint32 SMSG_MONEY_NOTIFY = 0xBADD, SMSG_MOTD = 0x12FB, SMSG_MOUNT_RESULT = 0x1BAC, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0xBADD, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x033A, SMSG_MOVE_CHARACTER_CHEAT_FAILURE = 0xBADD, SMSG_MOVE_CHARACTER_CHEAT_SUCCESS = 0xBADD, SMSG_MOVE_DISABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x0C12, - SMSG_MOVE_DISABLE_COLLISION = 0xBADD, - SMSG_MOVE_DISABLE_GRAVITY = 0xBADD, + SMSG_MOVE_DISABLE_COLLISION = 0x027C, + SMSG_MOVE_DISABLE_GRAVITY = 0x0124, SMSG_MOVE_ENABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x0AC9, - SMSG_MOVE_ENABLE_COLLISION = 0xBADD, - SMSG_MOVE_ENABLE_GRAVITY = 0xBADD, + SMSG_MOVE_ENABLE_COLLISION = 0x0512, + SMSG_MOVE_ENABLE_GRAVITY = 0x0024, SMSG_MOVE_KNOCK_BACK = 0x048B, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0xBADD, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x0361, SMSG_MOVE_ROOT = 0x0031, SMSG_MOVE_SET_ACTIVE_MOVER = 0x024C, SMSG_MOVE_SET_ANIM_KIT = 0x1F9B, @@ -1407,10 +1408,10 @@ enum OpcodeServer : uint32 SMSG_MOVE_SET_WALK_IN_AIR = 0xBADD, SMSG_MOVE_SET_WALK_SPEED = 0x024A, SMSG_MOVE_SET_WATER_WALK = 0x0D62, - SMSG_MOVE_SKIP_TIME = 0xBADD, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0xBADD, + SMSG_MOVE_SKIP_TIME = 0x0359, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x1392, SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x002A, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0xBADD, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x0152, SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x0641, SMSG_MOVE_SPLINE_ROOT = 0x0A4B, SMSG_MOVE_SPLINE_SET_ANIM = 0xBADD, @@ -1445,7 +1446,7 @@ enum OpcodeServer : uint32 SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x0E31, SMSG_MOVE_UNSET_WALK_IN_AIR = 0xBADD, SMSG_MOVE_UPDATE = 0x1514, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0xBADD, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x1193, SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x0624, SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x036B, SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x0D72, @@ -1467,17 +1468,17 @@ enum OpcodeServer : uint32 SMSG_NOTIFICATION = 0xBADD, SMSG_NOTIFY_DANCE = 0xBADD, SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0xBADD, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0xBADD, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x1F49, SMSG_NOTIFY_MONEY = 0xBADD, - SMSG_NOTIFY_RECEIVED_MAIL = 0xBADD, + SMSG_NOTIFY_RECEIVED_MAIL = 0x136C, SMSG_NPC_TEXT_UPDATE = 0x0A31, SMSG_NPC_WONT_TALK = 0xBADD, SMSG_OFFER_PETITION_ERROR = 0xBADD, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0xBADD, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x096C, SMSG_ON_MONSTER_MOVE = 0x0B09, SMSG_OPEN_CONTAINER = 0xBADD, SMSG_OPEN_LFG_DUNGEON_FINDER = 0xBADD, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0xBADD, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x11F2, SMSG_OPEN_SHIPMENT_NPC_RESULT = 0xBADD, SMSG_OVERRIDE_LIGHT = 0xBADD, SMSG_PAGE_TEXT = 0xBADD, @@ -1495,7 +1496,7 @@ enum OpcodeServer : uint32 SMSG_PETITION_ALREADY_SIGNED = 0xBADD, SMSG_PETITION_DECLINED = 0xBADD, SMSG_PETITION_RENAME_GUILD_RESPONSE = 0xBADD, - SMSG_PETITION_SHOW_LIST = 0xBADD, + SMSG_PETITION_SHOW_LIST = 0x1134, SMSG_PETITION_SHOW_SIGNATURES = 0xBADD, SMSG_PETITION_SIGN_RESULTS = 0xBADD, SMSG_PET_ACTION_FEEDBACK = 0xBADD, @@ -1503,40 +1504,40 @@ enum OpcodeServer : uint32 SMSG_PET_ADDED = 0xBADD, SMSG_PET_BATTLE_CHAT_RESTRICTED = 0xBADD, SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0xBADD, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0xBADD, - SMSG_PET_BATTLE_FINAL_ROUND = 0xBADD, - SMSG_PET_BATTLE_FINISHED = 0xBADD, - SMSG_PET_BATTLE_FIRST_ROUND = 0xBADD, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0xBADD, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x1D24, + SMSG_PET_BATTLE_FINAL_ROUND = 0x0B29, + SMSG_PET_BATTLE_FINISHED = 0x15FC, + SMSG_PET_BATTLE_FIRST_ROUND = 0x11CA, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x153A, SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0xBADD, SMSG_PET_BATTLE_PVP_CHALLENGE = 0xBADD, SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0xBADD, SMSG_PET_BATTLE_QUEUE_STATUS = 0xBADD, SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0xBADD, SMSG_PET_BATTLE_REQUEST_FAILED = 0xBADD, - SMSG_PET_BATTLE_ROUND_RESULT = 0xBADD, + SMSG_PET_BATTLE_ROUND_RESULT = 0x15F9, SMSG_PET_BATTLE_SLOT_UPDATES = 0xBADD, SMSG_PET_BROKEN = 0xBADD, SMSG_PET_CAST_FAILED = 0xBADD, - SMSG_PET_CLEAR_SPELLS = 0xBADD, + SMSG_PET_CLEAR_SPELLS = 0x0EEA, SMSG_PET_DISMISS_SOUND = 0x11BC, SMSG_PET_GOD_MODE = 0xBADD, SMSG_PET_GUIDS = 0x198A, SMSG_PET_LEARNED_SPELL = 0xBADD, - SMSG_PET_MODE = 0xBADD, + SMSG_PET_MODE = 0x196B, SMSG_PET_NAME_INVALID = 0xBADD, SMSG_PET_NAME_QUERY_RESPONSE = 0x15A9, SMSG_PET_REMOVED_SPELL = 0xBADD, SMSG_PET_RENAMEABLE = 0xBADD, SMSG_PET_SLOT_UPDATED = 0xBADD, SMSG_PET_SPECIALIZATION = 0xBADD, - SMSG_PET_SPELLS = 0xBADD, + SMSG_PET_SPELLS = 0x1283, SMSG_PET_STABLE_LIST = 0x04E2, SMSG_PET_STABLE_RESULT = 0xBADD, SMSG_PET_TAME_FAILURE = 0xBADD, SMSG_PET_UPDATE_COMBO_POINTS = 0xBADD, SMSG_PLAYED_TIME = 0x0B71, - SMSG_PLAYER_BOUND = 0xBADD, + SMSG_PLAYER_BOUND = 0x19A1, SMSG_PLAYER_SKINNED = 0xBADD, SMSG_PLAYER_VEHICLE_DATA = 0xBADD, SMSG_PLAY_DANCE = 0xBADD, @@ -1579,7 +1580,7 @@ enum OpcodeServer : uint32 SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x030F, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x071D, SMSG_QUEST_CONFIRM_ACCEPT = 0xBADD, - SMSG_QUEST_FORCE_REMOVED = 0xBADD, + SMSG_QUEST_FORCE_REMOVED = 0x0120, SMSG_QUEST_LOG_FULL = 0xBADD, SMSG_QUEST_POI_QUERY_RESPONSE = 0x01AE, SMSG_QUEST_PUSH_RESULT = 0xBADD, @@ -1593,7 +1594,7 @@ enum OpcodeServer : uint32 SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0xBADD, SMSG_RAID_GROUP_ONLY = 0xBADD, SMSG_RAID_INSTANCE_INFO = 0xBADD, - SMSG_RAID_INSTANCE_MESSAGE = 0xBADD, + SMSG_RAID_INSTANCE_MESSAGE = 0x12F3, SMSG_RAID_MARKERS_CHANGED = 0xBADD, SMSG_RANDOMIZE_CHAR_NAME = 0x195B, SMSG_RANDOM_ROLL = 0x04C1, @@ -1618,13 +1619,13 @@ enum OpcodeServer : uint32 SMSG_REPLACE_TROPHY_RESPONSE = 0xBADD, SMSG_REPORT_PVP_AFK_RESULT = 0xBADD, SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x15BB, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x1B74, SMSG_RESEARCH_COMPLETE = 0xBADD, - SMSG_RESEARCH_SETUP_HISTORY = 0xBADD, + SMSG_RESEARCH_SETUP_HISTORY = 0x1D8B, SMSG_RESET_AREA_TRIGGER = 0xBADD, SMSG_RESET_COMPRESSION_CONTEXT = 0xBADD, SMSG_RESET_FAILED_NOTIFY = 0xBADD, - SMSG_RESET_RANGED_COMBAT_TIMER = 0xBADD, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x135C, SMSG_RESET_WEEKLY_CURRENCY = 0xBADD, SMSG_RESISTLOG = 0xBADD, SMSG_RESPEC_WIPE_CONFIRM = 0xBADD, @@ -1658,7 +1659,7 @@ enum OpcodeServer : uint32 SMSG_SCRIPT_MESSAGE = 0xBADD, SMSG_SELL_RESPONSE = 0x0933, SMSG_SEND_ITEM_PASSIVES = 0xBADD, - SMSG_SEND_MAIL_RESULT = 0xBADD, + SMSG_SEND_MAIL_RESULT = 0x01C4, SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0xBADD, SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0xBADD, SMSG_SEND_SPELL_CHARGES = 0x0CEB, @@ -1690,11 +1691,11 @@ enum OpcodeServer : uint32 SMSG_SET_ITEM_PURCHASE_DATA = 0xBADD, SMSG_SET_LFG_TIME_WALKER = 0xBADD, SMSG_SET_LOOT_METHOD_FAILED = 0xBADD, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0xBADD, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1372, SMSG_SET_MELEE_ANIM_KIT = 0x1B2C, SMSG_SET_PCT_SPELL_MODIFIER = 0x0E59, SMSG_SET_PHASE_SHIFT_CHANGE = 0x17F9, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0xBADD, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x1363, SMSG_SET_PLAY_HOVER_ANIM = 0x01C3, SMSG_SET_PROFICIENCY = 0x092A, SMSG_SET_PROJECTILE_POSITION = 0xBADD, @@ -1749,7 +1750,7 @@ enum OpcodeServer : uint32 SMSG_STOP_DANCE = 0xBADD, SMSG_STOP_ELAPSED_TIMER = 0x092B, SMSG_STOP_MIRROR_TIMER = 0x0D81, - SMSG_STREAMING_MOVIE = 0xBADD, + SMSG_STREAMING_MOVIE = 0x0A7B, SMSG_SUMMON_CANCEL = 0xBADD, SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0xBADD, SMSG_SUMMON_REQUEST = 0xBADD, @@ -1757,7 +1758,7 @@ enum OpcodeServer : uint32 SMSG_SUPPRESS_NPC_GREETINGS = 0x118B, SMSG_SUSPEND_COMMS = 0x068B, SMSG_SUSPEND_TOKEN = 0x1BB4, - SMSG_TABARD_VENDOR_ACTIVATE = 0xBADD, + SMSG_TABARD_VENDOR_ACTIVATE = 0x15BC, SMSG_TALENTS_ERROR = 0xBADD, SMSG_TALENTS_INFO = 0x04C4, SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD, @@ -1769,9 +1770,9 @@ enum OpcodeServer : uint32 SMSG_THREAT_UPDATE = 0x0B33, SMSG_TIME_ADJUSTMENT = 0xBADD, SMSG_TIME_SYNC_REQ = 0x0A01, - SMSG_TITLE_EARNED = 0xBADD, - SMSG_TITLE_LOST = 0xBADD, - SMSG_TOTEM_CREATED = 0xBADD, + SMSG_TITLE_EARNED = 0x0D83, + SMSG_TITLE_LOST = 0x083B, + SMSG_TOTEM_CREATED = 0x1F5A, SMSG_TOTEM_MOVED = 0xBADD, SMSG_TRADE_STATUS = 0xBADD, SMSG_TRADE_UPDATED = 0xBADD, @@ -1780,8 +1781,8 @@ enum OpcodeServer : uint32 SMSG_TRAINER_LIST = 0x1F4B, SMSG_TRANSFER_ABORTED = 0x1B7C, SMSG_TRANSFER_PENDING = 0x1BDB, - SMSG_TRIGGER_CINEMATIC = 0xBADD, - SMSG_TRIGGER_MOVIE = 0xBADD, + SMSG_TRIGGER_CINEMATIC = 0x0863, + SMSG_TRIGGER_MOVIE = 0x1B3C, SMSG_TURN_IN_PETITION_RESULTS = 0xBADD, SMSG_TUTORIAL_FLAGS = 0x0A39, SMSG_UI_TIME = 0x05E3, diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 658498e7455..db8cb880d28 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -579,7 +579,6 @@ void SpellHistory::ResetCooldown(CooldownStorageType::iterator& itr, bool update if (Player* playerOwner = GetPlayerOwner()) { WorldPackets::Spells::ClearCooldown clearCooldown; - clearCooldown.CasterGUID = _owner->GetGUID(); clearCooldown.SpellID = itr->first; clearCooldown.ClearOnHold = false; playerOwner->SendDirectMessage(clearCooldown.Write()); -- cgit v1.2.3 From 358b063d170ad527085ac0b19a021d44db060af8 Mon Sep 17 00:00:00 2001 From: Duarte Duarte Date: Sun, 22 Mar 2015 22:12:02 +0000 Subject: Merge pull request #14426 from tkrokli/SetQuestSlotState [Core/Quest] Update quest Objective status Client side (cherry picked from commit 965ed68470431e6ee889a154e1ec73d28b461a25) Conflicts: src/server/game/Entities/Player/Player.cpp --- src/server/game/Entities/Player/Player.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 98945400ded..c4915914c3f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15684,6 +15684,8 @@ void Player::AreaExploredOrEventHappens(uint32 questId) { q_status.Explored = true; m_QuestStatusSave[questId] = QUEST_DEFAULT_SAVE_TYPE; + SetQuestSlotState(log_slot, QUEST_STATE_COMPLETE); + SendQuestComplete(questId); }**/ } if (CanCompleteQuest(questId)) -- cgit v1.2.3 From 930b74d0cad2623cd6d7455df58e9908ab5dcd2c Mon Sep 17 00:00:00 2001 From: Rat Date: Mon, 23 Mar 2015 07:42:50 +0100 Subject: Core/Spells: Spell radius calculation update --- src/server/game/DataStores/DBCStructure.h | 4 ++-- src/server/game/Spells/SpellInfo.cpp | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index c26898abf21..f997aaf776f 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1564,8 +1564,8 @@ struct SpellRadiusEntry { uint32 ID; // 0 //float Radius; // 1 - float RadiusMin; // 2 - float RadiusPerLevel; // 3 + float RadiusPerLevel; // 2 + float RadiusMin; // 3 float RadiusMax; // 4 }; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 2a72cdc49be..eb09cc60a1f 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -642,6 +642,11 @@ float SpellEffectInfo::CalcRadius(Unit* caster, Spell* spell) const return 0.0f; float radius = entry->RadiusMin; + + // Client uses max if min is 0 + if (radius == 0.0f) + radius = entry->RadiusMax; + if (caster) { radius += entry->RadiusPerLevel * caster->getLevel(); -- cgit v1.2.3