diff --git a/engine/server/application/ServerConsole/src/shared/ServerConsoleConnection.cpp b/engine/server/application/ServerConsole/src/shared/ServerConsoleConnection.cpp index 1816a580..68d7686b 100755 --- a/engine/server/application/ServerConsole/src/shared/ServerConsoleConnection.cpp +++ b/engine/server/application/ServerConsole/src/shared/ServerConsoleConnection.cpp @@ -10,6 +10,8 @@ #include "sharedNetwork/NetworkSetupData.h" #include "sharedNetworkMessages/ConsoleChannelMessages.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- ServerConsoleConnection::ServerConsoleConnection(const std::string & address, const unsigned short port) : @@ -44,15 +46,21 @@ void ServerConsoleConnection::onReceive(const Archive::ByteStream & bs) Archive::ReadIterator ri = bs.begin(); GameNetworkMessage m(ri); ri = bs.begin(); + + const uint32 messageType = m.getType(); - if(m.isType("ConGenericMessage")) - { - ConGenericMessage msg(ri); - fprintf(stdout, "%s", msg.getMsg().c_str()); - } - else if(m.isType("RequestDisconnect")) - { - disconnect(); + switch(messageType) { + case constcrc("ConGenericMessage") : + { + ConGenericMessage msg(ri); + fprintf(stdout, "%s", msg.getMsg().c_str()); + break; + } + case constcrc("RequestDisconnect") : + { + disconnect(); + break; + } } } diff --git a/engine/server/application/StationPlayersCollector/src/shared/CentralServerConnection.cpp b/engine/server/application/StationPlayersCollector/src/shared/CentralServerConnection.cpp index ca07f218..372241a3 100755 --- a/engine/server/application/StationPlayersCollector/src/shared/CentralServerConnection.cpp +++ b/engine/server/application/StationPlayersCollector/src/shared/CentralServerConnection.cpp @@ -17,6 +17,8 @@ #include "sharedNetwork/NetworkSetupData.h" #include "UnicodeUtils.h" +#include "sharedFoundation/CrcConstexpr.hpp" + // ====================================================================== namespace CentralServerConnectionNamespace @@ -84,19 +86,16 @@ void CentralServerConnection::onReceive(const Archive::ByteStream & message) GameNetworkMessage msg(ri); ri = message.begin(); - if (msg.isType("SPCharacterProfileMessage")) + if (msg.getType() == constcrc("SPCharacterProfileMessage")) { - DEBUG_REPORT_LOG(true,(" Got SPCharacterProfileMessage:")); - StationPlayersCollector::handleSPCharacterProfileData(msg); - } - else if ( msg.isType("SomeOtherMessage") ) - { - + DEBUG_REPORT_LOG(true,(" Got SPCharacterProfileMessage:")); + StationPlayersCollector::handleSPCharacterProfileData(msg); } + // else if ( msg.isType("SomeOtherMessage") ) {} leaving this here just so i can ask, what the fuck sony? else { - DEBUG_REPORT_LOG(true, ("Got (%s) handing off to ServerConnection::onReceive\n", msg.getCmdName().c_str())); - ServerConnection::onReceive(message); + DEBUG_REPORT_LOG(true, ("Got (%s) handing off to ServerConnection::onReceive\n", msg.getCmdName().c_str())); + ServerConnection::onReceive(message); } } diff --git a/engine/server/application/TaskManager/src/shared/CentralConnection.cpp b/engine/server/application/TaskManager/src/shared/CentralConnection.cpp index 416b0af0..b8ca9f88 100755 --- a/engine/server/application/TaskManager/src/shared/CentralConnection.cpp +++ b/engine/server/application/TaskManager/src/shared/CentralConnection.cpp @@ -14,6 +14,8 @@ #include "sharedFoundation/Clock.h" #include "sharedMessageDispatch/Transceiver.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- CentralConnection::CentralConnection(TaskConnection * c, const std::string & n) : @@ -84,30 +86,37 @@ void CentralConnection::receive(const Archive::ByteStream & message) { Archive::ReadIterator r(message); GameNetworkMessage m(r); - r = message.begin(); - if(m.isType("TaskSpawnProcess")) - { - TaskSpawnProcess s(r); - IGNORE_RETURN(TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay())); - } - else if(m.isType("PreloadFinishedMessage")) - { - PreloadFinishedMessage m(r); - if (m.getFinished()) - TaskManager::onPreloadFinished(); - } - else if(m.isType("ConGenericMessage")) - { - ConGenericMessage taskConsoleCommand(r); + + const uint32 messageType = m.getType(); - static std::string command = taskConsoleCommand.getMsg(); - while(command.rfind(' ') != command.npos || command.rfind('\n') != command.npos || command.rfind('\r') != command.npos) + switch (messageType) { + case constcrc("TaskSpawnProcess") : { - command = command.substr(0, command.length() - 1); + TaskSpawnProcess s(r); + IGNORE_RETURN(TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay())); + break; } + case constcrc("PreloadFinishedMessage") : + { + PreloadFinishedMessage m(r); + if (m.getFinished()) + TaskManager::onPreloadFinished(); + break; + } + case constcrc("ConGenericMessage") : + { + ConGenericMessage taskConsoleCommand(r); - TaskManager::executeCommand(command); + static std::string command = taskConsoleCommand.getMsg(); + while(command.rfind(' ') != command.npos || command.rfind('\n') != command.npos || command.rfind('\r') != command.npos) + { + command = command.substr(0, command.length() - 1); + } + + TaskManager::executeCommand(command); + break; + } } } diff --git a/engine/server/application/TaskManager/src/shared/DatabaseConnection.cpp b/engine/server/application/TaskManager/src/shared/DatabaseConnection.cpp index 4eee169c..9e2451c4 100755 --- a/engine/server/application/TaskManager/src/shared/DatabaseConnection.cpp +++ b/engine/server/application/TaskManager/src/shared/DatabaseConnection.cpp @@ -10,6 +10,8 @@ #include "serverNetworkMessages/GameTaskManagerMessages.h" #include "serverNetworkMessages/TaskSpawnProcess.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- DatabaseConnection::DatabaseConnection() : @@ -42,17 +44,23 @@ void DatabaseConnection::receive(const Archive::ByteStream & message) { Archive::ReadIterator r(message); GameNetworkMessage m(r); - r = message.begin(); - if(m.isType("TaskSpawnProcess")) - { - TaskSpawnProcess s(r); - IGNORE_RETURN(TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay())); - } - else if(m.isType("ServerIdleMessage")) - { - ServerIdleMessage msg(r); - TaskManager::onDatabaseIdle(msg.getIsIdle()); + + const uint32 messageType = m.getType(); + + switch(messageType) { + case constcrc("TaskSpawnProcess") : + { + TaskSpawnProcess s(r); + IGNORE_RETURN(TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay())); + break; + } + case constcrc("ServerIdleMessage") : + { + ServerIdleMessage msg(r); + TaskManager::onDatabaseIdle(msg.getIsIdle()); + break; + } } } diff --git a/engine/server/application/TaskManager/src/shared/ManagerConnection.cpp b/engine/server/application/TaskManager/src/shared/ManagerConnection.cpp index 08807765..3aa53136 100755 --- a/engine/server/application/TaskManager/src/shared/ManagerConnection.cpp +++ b/engine/server/application/TaskManager/src/shared/ManagerConnection.cpp @@ -24,6 +24,8 @@ #include "TaskConnection.h" #include "TaskManager.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- namespace ManagerConnectionNamespace @@ -94,115 +96,126 @@ void ManagerConnection::onReceive(const Archive::ByteStream & message) { Archive::ReadIterator r(message); GameNetworkMessage m(r); - r = message.begin(); - if (m.isType("SystemTimeCheck")) - { - long const currentTime = static_cast(::time(nullptr)); - GenericValueTypeMessage > msg(r); - - if (TaskManager::getNodeLabel() == "node0") + + const uint32 messageType = m.getType(); + + switch(messageType) { + case constcrc("SystemTimeCheck") : { - if ((std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)) > ConfigTaskManager::getMaximumClockDriftToleranceSeconds()) + long const currentTime = static_cast(::time(nullptr)); + GenericValueTypeMessage > msg(r); + + if (TaskManager::getNodeLabel() == "node0") { - LOG("CustomerService", ("system_clock_mismatch:System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld)", (std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, msg.getValue().first.c_str(), getRemoteAddress().c_str(), msg.getValue().second)); - - // tell CentralServer about the system clock mismatch so it can report an alert to SOEMon - GenericValueTypeMessage systemTimeMismatchMessage("SystemTimeMismatchNotification", - FormattedString<1024>().sprintf("%s: %s (%s) is off by %ld seconds", CalendarTime::convertEpochToTimeStringLocal(static_cast(currentTime)).c_str(), msg.getValue().first.c_str(), getRemoteAddress().c_str(), (std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)))); - TaskManager::sendToCentralServer(systemTimeMismatchMessage); - } - } - } - else if (m.isType("TaskConnectionIdMessage")) - { - static long const clockDriftFatalTimePeriod = static_cast(TaskManager::getStartTime()) + ConfigTaskManager::getClockDriftFatalIntervalSeconds(); - long const currentTime = static_cast(::time(nullptr)); - TaskConnectionIdMessage t(r); - WARNING_STRICT_FATAL(t.getServerType() != TaskConnectionIdMessage::TaskManager, - ("ManagerConnection received wrong type identifier")); - WARNING_STRICT_FATAL(m_nodeLabel, ("Received new taskconnectionIdMessage with an already named connection")); - - FATAL((ConfigTaskManager::getVerifyClusterName() && (TaskManager::getNodeLabel() == "node0") && (t.getServerType() == TaskConnectionIdMessage::TaskManager) && (t.getClusterName() != std::string(ConfigTaskManager::getClusterName()))), ("Remote TaskManager %s (%s) reported cluster name (%s) that is different from my cluster name (%s)", t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getClusterName().c_str(), ConfigTaskManager::getClusterName())); - - // don't allow cluster to start if the system clock across the boxes are out of sync - bool remoteSystemClockInSync = true; - if (TaskManager::getNodeLabel() == "node0") - { - if ((std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())) > ConfigTaskManager::getMaximumClockDriftToleranceSeconds()) - { - remoteSystemClockInSync = false; - - // don't bring down the cluster if we lost a box and when the box is - // restarted, its system clock is out of sync; just ignore that - // TaskManager, and send it a message to terminate itself - if (currentTime <= clockDriftFatalTimePeriod) + if ((std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)) > ConfigTaskManager::getMaximumClockDriftToleranceSeconds()) { - FATAL(true, ("System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld)", (std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getCurrentEpochTime())); - } - else - { - LOG("CustomerService", ("system_clock_mismatch:System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld). Telling remote TaskManager to terminate.", (std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getCurrentEpochTime())); + LOG("CustomerService", ("system_clock_mismatch:System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld)", (std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, msg.getValue().first.c_str(), getRemoteAddress().c_str(), msg.getValue().second)); - GenericValueTypeMessage > > systemTimeMismatchMessage("SystemTimeMismatchMessage", std::make_pair(TaskManager::getNodeLabel(), std::make_pair(static_cast(currentTime), t.getCurrentEpochTime()))); - send(systemTimeMismatchMessage); - } - } - } - - if (remoteSystemClockInSync) - { - m_nodeLabel = new std::string(t.getCommandLine()); - Locator::opened(*m_nodeLabel, this); - TaskManager::resendUnacknowledgedSpawnRequests(this, *m_nodeLabel); - } - } - else if (m.isType("SystemTimeMismatchMessage")) - { - GenericValueTypeMessage > > msg(r); - FATAL((msg.getValue().first == "node0"), ("System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), self epoch (%ld)", (std::max(msg.getValue().second.first, msg.getValue().second.second) - std::min(msg.getValue().second.first, msg.getValue().second.second)), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), msg.getValue().second.first, msg.getValue().second.second)); - } - else if(m.isType("TaskSpawnProcess")) - { - TaskSpawnProcess s(r); - if (TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay()) == 0) - { - DEBUG_REPORT_LOG(true, ("Failed to spawn %s on this node\n", s.getProcessName().c_str())); - //send fail message back - } - else - { - TaskSpawnProcessAck ack(s.getTransactionId()); - send(ack); - } - } - else if(m.isType("TaskUtilization")) - { - TaskUtilization util(r); - switch(util.getUtilType()) - { - case TaskUtilization::SYSTEM_AVG: - { - if (m_nodeLabel) - { - m_remoteUtilAvg = util.getUtilAmount(); - Locator::updateServerLoad(*m_nodeLabel, m_remoteUtilAvg); + // tell CentralServer about the system clock mismatch so it can report an alert to SOEMon + GenericValueTypeMessage systemTimeMismatchMessage("SystemTimeMismatchNotification", + FormattedString<1024>().sprintf("%s: %s (%s) is off by %ld seconds", CalendarTime::convertEpochToTimeStringLocal(static_cast(currentTime)).c_str(), msg.getValue().first.c_str(), getRemoteAddress().c_str(), (std::max(currentTime, msg.getValue().second) - std::min(currentTime, msg.getValue().second)))); + TaskManager::sendToCentralServer(systemTimeMismatchMessage); } } break; - default: + } + case constcrc("TaskConnectionIdMessage") : + { + static long const clockDriftFatalTimePeriod = static_cast(TaskManager::getStartTime()) + ConfigTaskManager::getClockDriftFatalIntervalSeconds(); + long const currentTime = static_cast(::time(nullptr)); + TaskConnectionIdMessage t(r); + WARNING_STRICT_FATAL(t.getServerType() != TaskConnectionIdMessage::TaskManager, + ("ManagerConnection received wrong type identifier")); + WARNING_STRICT_FATAL(m_nodeLabel, ("Received new taskconnectionIdMessage with an already named connection")); + + FATAL((ConfigTaskManager::getVerifyClusterName() && (TaskManager::getNodeLabel() == "node0") && (t.getServerType() == TaskConnectionIdMessage::TaskManager) && (t.getClusterName() != std::string(ConfigTaskManager::getClusterName()))), ("Remote TaskManager %s (%s) reported cluster name (%s) that is different from my cluster name (%s)", t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getClusterName().c_str(), ConfigTaskManager::getClusterName())); + + // don't allow cluster to start if the system clock across the boxes are out of sync + bool remoteSystemClockInSync = true; + if (TaskManager::getNodeLabel() == "node0") + { + if ((std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())) > ConfigTaskManager::getMaximumClockDriftToleranceSeconds()) + { + remoteSystemClockInSync = false; + + // don't bring down the cluster if we lost a box and when the box is + // restarted, its system clock is out of sync; just ignore that + // TaskManager, and send it a message to terminate itself + if (currentTime <= clockDriftFatalTimePeriod) + { + FATAL(true, ("System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld)", (std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getCurrentEpochTime())); + } + else + { + LOG("CustomerService", ("system_clock_mismatch:System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), remote TaskManager %s (%s) epoch (%ld). Telling remote TaskManager to terminate.", (std::max(currentTime, t.getCurrentEpochTime()) - std::min(currentTime, t.getCurrentEpochTime())), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), currentTime, t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getCurrentEpochTime())); + + GenericValueTypeMessage > > systemTimeMismatchMessage("SystemTimeMismatchMessage", std::make_pair(TaskManager::getNodeLabel(), std::make_pair(static_cast(currentTime), t.getCurrentEpochTime()))); + send(systemTimeMismatchMessage); + } + } + } + + if (remoteSystemClockInSync) + { + m_nodeLabel = new std::string(t.getCommandLine()); + Locator::opened(*m_nodeLabel, this); + TaskManager::resendUnacknowledgedSpawnRequests(this, *m_nodeLabel); + } + break; + } + case constcrc("SystemTimeMismatchMessage") : + { + GenericValueTypeMessage > > msg(r); + FATAL((msg.getValue().first == "node0"), ("System clock mismatch (%d seconds) by more than %d seconds: master TaskManager epoch (%ld), self epoch (%ld)", (std::max(msg.getValue().second.first, msg.getValue().second.second) - std::min(msg.getValue().second.first, msg.getValue().second.second)), ConfigTaskManager::getMaximumClockDriftToleranceSeconds(), msg.getValue().second.first, msg.getValue().second.second)); + break; + } + case constcrc("TaskSpawnProcess") : + { + TaskSpawnProcess s(r); + if (TaskManager::startServer(s.getProcessName(), s.getOptions(), s.getTargetHostAddress(), s.getSpawnDelay()) == 0) + { + DEBUG_REPORT_LOG(true, ("Failed to spawn %s on this node\n", s.getProcessName().c_str())); + //send fail message back + } + else + { + TaskSpawnProcessAck ack(s.getTransactionId()); + send(ack); + } + break; + } + case constcrc("TaskUtilization") : + { + TaskUtilization util(r); + switch(util.getUtilType()) + { + case TaskUtilization::SYSTEM_AVG: + { + if (m_nodeLabel) + { + m_remoteUtilAvg = util.getUtilAmount(); + Locator::updateServerLoad(*m_nodeLabel, m_remoteUtilAvg); + } + } + break; + default: + break; + } + break; + } + case constcrc("TaskProcessDiedMessage") : + { + TaskProcessDiedMessage died(r); + TaskManager::sendToCentralServer(died); + break; + } + case constcrc("TaskSpawnProcessAck") : + { + TaskSpawnProcessAck ack(r); + TaskManager::removePendingSpawnProcessAck(ack.getTransactionId()); break; } - } - else if(m.isType("TaskProcessDiedMessage")) - { - TaskProcessDiedMessage died(r); - TaskManager::sendToCentralServer(died); - } - else if(m.isType("TaskSpawnProcessAck")) - { - TaskSpawnProcessAck ack(r); - TaskManager::removePendingSpawnProcessAck(ack.getTransactionId()); } } diff --git a/engine/server/application/TaskManager/src/shared/TaskConnection.cpp b/engine/server/application/TaskManager/src/shared/TaskConnection.cpp index 522578f5..b1751e29 100755 --- a/engine/server/application/TaskManager/src/shared/TaskConnection.cpp +++ b/engine/server/application/TaskManager/src/shared/TaskConnection.cpp @@ -20,6 +20,8 @@ #include "serverNetworkMessages/TaskKillProcess.h" #include "sharedNetwork/NetworkSetupData.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- TaskConnection::TaskConnection(const std::string & a, const unsigned short p) : @@ -94,70 +96,79 @@ void TaskConnection::onReceive(const Archive::ByteStream & message) Archive::ReadIterator r(message); GameNetworkMessage m(r); - if(m.isType("TaskConnectionIdMessage")) - { - r = message.begin(); - TaskConnectionIdMessage t(r); - - FATAL((ConfigTaskManager::getVerifyClusterName() && (TaskManager::getNodeLabel() == "node0") && (t.getServerType() == TaskConnectionIdMessage::TaskManager) && (t.getClusterName() != std::string(ConfigTaskManager::getClusterName()))), ("Remote TaskManager %s (%s) reported cluster name (%s) that is different from my cluster name (%s)", t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getClusterName().c_str(), ConfigTaskManager::getClusterName())); - - Identified i = {this, t.getServerType() }; - identified.emitMessage(i); - - switch(i.id) + + const uint32 messageType = m.getType(); + + switch(messageType) { + case constcrc("TaskConnectionIdMessage") : { - case TaskConnectionIdMessage::Central: - { - REPORT_LOG(true, ("New Central Server connection active\n")); - handler = new CentralConnection(this, t.getCommandLine()); - TaskManager::setCentralConnection(this); - } - break; - case TaskConnectionIdMessage::Game: - { - REPORT_LOG(true, ("New Game Server connection active\n")); - handler = new GameConnection(this); - } - break; - case TaskConnectionIdMessage::Database: - { - REPORT_LOG(true, ("New Database Server connection active\n")); - handler = new DatabaseConnection(); - } - break; - case TaskConnectionIdMessage::Metrics: - { - REPORT_LOG(true, ("New Metrics Server connection active\n")); - handler = new MetricsServerConnection(this, t.getCommandLine()); - } - break; - case TaskConnectionIdMessage::Planet: - { - REPORT_LOG(true, ("New Planet Server connection active\n")); - handler = new PlanetConnection(this); - } - break; + r = message.begin(); + TaskConnectionIdMessage t(r); - default: - WARNING_STRICT_FATAL(true, ("Unknown id (%d) received on task connection", i.id)); + FATAL((ConfigTaskManager::getVerifyClusterName() && (TaskManager::getNodeLabel() == "node0") && (t.getServerType() == TaskConnectionIdMessage::TaskManager) && (t.getClusterName() != std::string(ConfigTaskManager::getClusterName()))), ("Remote TaskManager %s (%s) reported cluster name (%s) that is different from my cluster name (%s)", t.getCommandLine().c_str(), getRemoteAddress().c_str(), t.getClusterName().c_str(), ConfigTaskManager::getClusterName())); + + Identified i = {this, t.getServerType() }; + identified.emitMessage(i); + + switch(i.id) + { + case TaskConnectionIdMessage::Central: + { + REPORT_LOG(true, ("New Central Server connection active\n")); + handler = new CentralConnection(this, t.getCommandLine()); + TaskManager::setCentralConnection(this); + } + break; + case TaskConnectionIdMessage::Game: + { + REPORT_LOG(true, ("New Game Server connection active\n")); + handler = new GameConnection(this); + } + break; + case TaskConnectionIdMessage::Database: + { + REPORT_LOG(true, ("New Database Server connection active\n")); + handler = new DatabaseConnection(); + } + break; + case TaskConnectionIdMessage::Metrics: + { + REPORT_LOG(true, ("New Metrics Server connection active\n")); + handler = new MetricsServerConnection(this, t.getCommandLine()); + } + break; + case TaskConnectionIdMessage::Planet: + { + REPORT_LOG(true, ("New Planet Server connection active\n")); + handler = new PlanetConnection(this); + } + break; + + default: + WARNING_STRICT_FATAL(true, ("Unknown id (%d) received on task connection", i.id)); + break; + } + break; + } + case constcrc("ExcommunicateGameServerMessage") : + { + r = message.begin(); + ExcommunicateGameServerMessage ex(r); + TaskKillProcess k(ex.getHostName(), ex.getProcessId(), true); + TaskManager::killProcess(k); + + // broadcast to other task managers + Locator::sendToAllTaskManagers(k); + + break; + } + case constcrc("TaskKillProcess") : + { + r = message.begin(); + TaskKillProcess k(r); + TaskManager::killProcess(k); break; } - } - else if(m.isType("ExcommunicateGameServerMessage")) - { - r = message.begin(); - ExcommunicateGameServerMessage ex(r); - TaskKillProcess k(ex.getHostName(), ex.getProcessId(), true); - TaskManager::killProcess(k); - - // broadcast to other task managers - Locator::sendToAllTaskManagers(k); - } - else if(m.isType("TaskKillProcess")) - { - r = message.begin(); - TaskKillProcess k(r); - TaskManager::killProcess(k); } msg.message = &message; diff --git a/engine/server/application/TransferServer/src/shared/CentralServerConnection.cpp b/engine/server/application/TransferServer/src/shared/CentralServerConnection.cpp index 5fb34c0b..ece4ff3d 100755 --- a/engine/server/application/TransferServer/src/shared/CentralServerConnection.cpp +++ b/engine/server/application/TransferServer/src/shared/CentralServerConnection.cpp @@ -25,6 +25,8 @@ #include "sharedNetworkMessages/GenericValueTypeMessage.h" #include "UnicodeUtils.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- namespace CentralServerConnectionNamespace @@ -95,306 +97,329 @@ void CentralServerConnection::onReceive(const Archive::ByteStream & message) Archive::ReadIterator ri = message.begin(); const GameNetworkMessage msg(ri); ri = message.begin(); - if(msg.isType("CentralGalaxyName")) - { - - const GenericValueTypeMessage cgn(ri); - setGalaxyName(cgn.getValue()); - LOG("CustomerService", ("CharacterTransfer: Received CentralGalaxyName for %s", cgn.getValue().c_str())); - } - else if(msg.isType("UploadCharacterMessage")) - { - // receiving character data - const UploadCharacterMessage ucm(ri); - CharacterTransferData data; - data.stationId = ucm.getStationId(); - data.fromGalaxy = m_galaxyName; - data.packedData = ucm.getPackedCharacterData(); - bool result = TransferServer::uploadCharacterTransferData(data, ucm.getIsAdmin()); - if(result) + + const uint32 messageType = msg.getType(); + + switch(messageType) { + case constcrc("CentralGalaxyName") : { - CharacterTransferStatusMessage uploadResult(ucm.getFromGameServerId(), ucm.getFromCharacterId(), "@base_player:upload_success"); - send(uploadResult, true); + const GenericValueTypeMessage cgn(ri); + setGalaxyName(cgn.getValue()); + LOG("CustomerService", ("CharacterTransfer: Received CentralGalaxyName for %s", cgn.getValue().c_str())); + break; } - else + case constcrc("UploadCharacterMessage") : { - CharacterTransferStatusMessage uploadResult(ucm.getFromGameServerId(), ucm.getFromCharacterId(), "@base_player:upload_fail"); - send(uploadResult, true); - } - } - else if(msg.isType("DownloadCharacterMessage")) - { - // retreive packed data from transfer server and - // send it to the requesting central server - const DownloadCharacterMessage dcm(ri); - const CharacterTransferData * data = TransferServer::getCharacterTransferData(dcm.getStationId(), m_galaxyName, dcm.getIsAdmin()); - if(data) - { - const UploadCharacterMessage ucm(data->stationId, data->packedData, dcm.getGameServerId(), dcm.getToCharacterId(), true); - send(ucm, true); - LOG("CustomerService", ("CharacterTransfer: Character data for SUID %d downloaded\n", data->stationId)); - } - else - { - CharacterTransferStatusMessage downloadResult(dcm.getGameServerId(), dcm.getToCharacterId(), "@base_player:download_fail"); - send(downloadResult, true); - } - - } - else if(msg.isType("AuthorizeDownload")) - { - const GenericValueTypeMessage auth(ri); - TransferServer::authorizeDownload(auth.getValue()); - } - else if(msg.isType("UnauthorizeDownload")) - { - const GenericValueTypeMessage auth(ri); - TransferServer::unauthorizeDownload(auth.getValue()); - } - else if(msg.isType("TransferReplyCharacterList")) - { - const TransferReplyCharacterList reply(ri); - - // TESTING! - LOG("CustomerService", ("CharacterTransfer: Received character list for station id %d\n", reply.getStationId())); - const std::vector & avatarList = reply.getAvatarList(); - std::vector::const_iterator i; - LOG("CustomerService", ("CharacterTransfer: Enumerating %d characters", avatarList.size())); - for(i = avatarList.begin() ; i != avatarList.end(); ++i) - { - LOG("CustomerService", ("CharacterTransfer: m_name = \"%s\" m_networkId = %s\n", Unicode::wideToNarrow(i->m_name).c_str(), i->m_networkId.getValueString().c_str())); - } - - // TESTING END - TransferServer::replyCharacterList(reply); - } - else if(msg.isType("TransferReplyMoveValidation")) - { - const TransferReplyMoveValidation reply(ri); - if(reply.getResult() == TransferReplyMoveValidation::TRMVR_can_create_regular_character) - { - // save off the source character's template crc so it can be used in - // subsequent TransferRequestMoveValidation queries, so the LoginServer - // doesn't have to continually query the DB to fetch the same information - // over and over again, because the character's template crc - // (i.e. the character's species) should never, ever change - TransferServer::cacheSourceCharacterTemplateCrc(reply.getSourceStationId(), reply.getSourceGalaxy(), reply.getSourceCharacter(), reply.getSourceCharacterTemplateId()); - - TransferCharacterData requestData(reply.getTransferRequestSource()); - requestData.setTrack(reply.getTrack()); - requestData.setCustomerLocalizedLanguage(reply.getCustomerLocalizedLanguage()); - requestData.setSourceGalaxy(reply.getSourceGalaxy()); - requestData.setDestinationGalaxy(reply.getDestinationGalaxy()); - requestData.setSourceCharacterName(reply.getSourceCharacter()); - requestData.setObjectTemplateCrc(reply.getSourceCharacterTemplateId()); - requestData.setDestinationCharacterName(reply.getDestinationCharacter()); - requestData.setSourceStationId(reply.getSourceStationId()); - requestData.setDestinationStationId(reply.getDestinationStationId()); - const GenericValueTypeMessage requestNameValidation("TransferRequestNameValidation", requestData); - CentralServerConnection * destinationConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getDestinationGalaxy()); - - LOG("CustomerService", ("CharacterTransfer: Received TransferReplyMoveValidation for %s on %s to %s on %s from CentralServer. Sending TransferRequestNameValidation to destination CentralServer.", reply.getSourceCharacter().c_str(), reply.getSourceGalaxy().c_str(), reply.getDestinationCharacter().c_str(), reply.getDestinationGalaxy().c_str())); - - const GenericValueTypeMessage > kick("TransferRequestKickConnectedClients", std::make_pair(requestData.getSourceStationId(), requestData.getDestinationStationId())); - if(destinationConnection) + // receiving character data + const UploadCharacterMessage ucm(ri); + CharacterTransferData data; + data.stationId = ucm.getStationId(); + data.fromGalaxy = m_galaxyName; + data.packedData = ucm.getPackedCharacterData(); + bool result = TransferServer::uploadCharacterTransferData(data, ucm.getIsAdmin()); + if(result) { - destinationConnection->send(requestNameValidation, true); - destinationConnection->send(kick, true); + CharacterTransferStatusMessage uploadResult(ucm.getFromGameServerId(), ucm.getFromCharacterId(), "@base_player:upload_success"); + send(uploadResult, true); } - - CentralServerConnection * sourceConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getSourceGalaxy()); - if(sourceConnection) + else { - sourceConnection->send(kick, true); + CharacterTransferStatusMessage uploadResult(ucm.getFromGameServerId(), ucm.getFromCharacterId(), "@base_player:upload_fail"); + send(uploadResult, true); } + break; } - else + case constcrc("DownloadCharacterMessage") : { - LOG("CustomerService", ("CharacterTransfer: TransferReplyMoveValidation failed for %s on %s to %s on %s from CentralServer because the account cannot create a new character on the destination server", reply.getSourceCharacter().c_str(), reply.getSourceGalaxy().c_str(), reply.getDestinationCharacter().c_str(), reply.getDestinationGalaxy().c_str())); - TransferServer::failedToValidateTransfer(reply); - } - } - else if(msg.isType("TransferReplyNameValidation")) - { - const GenericValueTypeMessage > replyNameValidation(ri); - if(!replyNameValidation.getValue().second.getIsMoveRequest()) - { - LOG("CustomerService", ("CharacterTransfer: Received replyNameValidation for move validation request. (%s) %s", replyNameValidation.getValue().first.c_str(), replyNameValidation.getValue().second.toString().c_str())); - TransferServer::replyValidateMove(replyNameValidation.getValue().second); - } - else - { - if(TransferServer::isRename(replyNameValidation.getValue().second)) + // retreive packed data from transfer server and + // send it to the requesting central server + const DownloadCharacterMessage dcm(ri); + const CharacterTransferData * data = TransferServer::getCharacterTransferData(dcm.getStationId(), m_galaxyName, dcm.getIsAdmin()); + if(data) { - LOG("CustomerService", ("CharacterTransfer: Received replyNameValidation for rename request, starting character rename protocol. (%s) %s", replyNameValidation.getValue().first.c_str(), replyNameValidation.getValue().second.toString().c_str())); - const GenericValueTypeMessage renameCharacter("TransferRenameCharacter", replyNameValidation.getValue().second); - CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(replyNameValidation.getValue().second.getSourceGalaxy()); - if(centralServerConnection) + const UploadCharacterMessage ucm(data->stationId, data->packedData, dcm.getGameServerId(), dcm.getToCharacterId(), true); + send(ucm, true); + LOG("CustomerService", ("CharacterTransfer: Character data for SUID %d downloaded\n", data->stationId)); + } + else + { + CharacterTransferStatusMessage downloadResult(dcm.getGameServerId(), dcm.getToCharacterId(), "@base_player:download_fail"); + send(downloadResult, true); + } + break; + + } + case constcrc("AuthorizeDownload") : + { + const GenericValueTypeMessage auth(ri); + TransferServer::authorizeDownload(auth.getValue()); + break; + } + case constcrc("UnauthorizeDownload") : + { + const GenericValueTypeMessage auth(ri); + TransferServer::unauthorizeDownload(auth.getValue()); + break; + } + case constcrc("TransferReplyCharacterList") : + { + const TransferReplyCharacterList reply(ri); + + // TESTING! + LOG("CustomerService", ("CharacterTransfer: Received character list for station id %d\n", reply.getStationId())); + const std::vector & avatarList = reply.getAvatarList(); + std::vector::const_iterator i; + LOG("CustomerService", ("CharacterTransfer: Enumerating %d characters", avatarList.size())); + for(i = avatarList.begin() ; i != avatarList.end(); ++i) + { + LOG("CustomerService", ("CharacterTransfer: m_name = \"%s\" m_networkId = %s\n", Unicode::wideToNarrow(i->m_name).c_str(), i->m_networkId.getValueString().c_str())); + } + + // TESTING END + TransferServer::replyCharacterList(reply); + break; + } + case constcrc("TransferReplyMoveValidation") : + { + const TransferReplyMoveValidation reply(ri); + if(reply.getResult() == TransferReplyMoveValidation::TRMVR_can_create_regular_character) + { + // save off the source character's template crc so it can be used in + // subsequent TransferRequestMoveValidation queries, so the LoginServer + // doesn't have to continually query the DB to fetch the same information + // over and over again, because the character's template crc + // (i.e. the character's species) should never, ever change + TransferServer::cacheSourceCharacterTemplateCrc(reply.getSourceStationId(), reply.getSourceGalaxy(), reply.getSourceCharacter(), reply.getSourceCharacterTemplateId()); + + TransferCharacterData requestData(reply.getTransferRequestSource()); + requestData.setTrack(reply.getTrack()); + requestData.setCustomerLocalizedLanguage(reply.getCustomerLocalizedLanguage()); + requestData.setSourceGalaxy(reply.getSourceGalaxy()); + requestData.setDestinationGalaxy(reply.getDestinationGalaxy()); + requestData.setSourceCharacterName(reply.getSourceCharacter()); + requestData.setObjectTemplateCrc(reply.getSourceCharacterTemplateId()); + requestData.setDestinationCharacterName(reply.getDestinationCharacter()); + requestData.setSourceStationId(reply.getSourceStationId()); + requestData.setDestinationStationId(reply.getDestinationStationId()); + const GenericValueTypeMessage requestNameValidation("TransferRequestNameValidation", requestData); + CentralServerConnection * destinationConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getDestinationGalaxy()); + + LOG("CustomerService", ("CharacterTransfer: Received TransferReplyMoveValidation for %s on %s to %s on %s from CentralServer. Sending TransferRequestNameValidation to destination CentralServer.", reply.getSourceCharacter().c_str(), reply.getSourceGalaxy().c_str(), reply.getDestinationCharacter().c_str(), reply.getDestinationGalaxy().c_str())); + + const GenericValueTypeMessage > kick("TransferRequestKickConnectedClients", std::make_pair(requestData.getSourceStationId(), requestData.getDestinationStationId())); + if(destinationConnection) { - centralServerConnection->send(renameCharacter, true); + destinationConnection->send(requestNameValidation, true); + destinationConnection->send(kick, true); } - else + + CentralServerConnection * sourceConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getSourceGalaxy()); + if(sourceConnection) { - TransferServer::transferCreateCharacterFailed(replyNameValidation.getValue().second); + sourceConnection->send(kick, true); } } else { - DEBUG_FATAL(true, ("Received TransferReplyNameValidation for a move request that is not a rename!")); + LOG("CustomerService", ("CharacterTransfer: TransferReplyMoveValidation failed for %s on %s to %s on %s from CentralServer because the account cannot create a new character on the destination server", reply.getSourceCharacter().c_str(), reply.getSourceGalaxy().c_str(), reply.getDestinationCharacter().c_str(), reply.getDestinationGalaxy().c_str())); + TransferServer::failedToValidateTransfer(reply); } + break; } - } - else if(msg.isType("TransferReplyCharacterDataFromLoginServer")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Got TransferReplyCharacterDataFromLoginServer, characterId=%s\n", reply.getValue().getCharacterId().getValueString().c_str())); - - // is this a transfer or a rename? - if(TransferServer::isRename(reply.getValue())) + case constcrc("TransferReplyNameValidation") : { - LOG("CustomerService", ("CharacterTransfer: Sending TransferRequestNameValidation for character rename request: %s", reply.getValue().toString().c_str())); - // send a name validation request - const GenericValueTypeMessage requestNameValidation("TransferRequestNameValidation", reply.getValue()); - CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getValue().getSourceGalaxy()); + const GenericValueTypeMessage > replyNameValidation(ri); + if(!replyNameValidation.getValue().second.getIsMoveRequest()) + { + LOG("CustomerService", ("CharacterTransfer: Received replyNameValidation for move validation request. (%s) %s", replyNameValidation.getValue().first.c_str(), replyNameValidation.getValue().second.toString().c_str())); + TransferServer::replyValidateMove(replyNameValidation.getValue().second); + } + else + { + if(TransferServer::isRename(replyNameValidation.getValue().second)) + { + LOG("CustomerService", ("CharacterTransfer: Received replyNameValidation for rename request, starting character rename protocol. (%s) %s", replyNameValidation.getValue().first.c_str(), replyNameValidation.getValue().second.toString().c_str())); + const GenericValueTypeMessage renameCharacter("TransferRenameCharacter", replyNameValidation.getValue().second); + CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(replyNameValidation.getValue().second.getSourceGalaxy()); + if(centralServerConnection) + { + centralServerConnection->send(renameCharacter, true); + } + else + { + TransferServer::transferCreateCharacterFailed(replyNameValidation.getValue().second); + } + } + else + { + DEBUG_FATAL(true, ("Received TransferReplyNameValidation for a move request that is not a rename!")); + } + } + break; + } + case constcrc("TransferReplyCharacterDataFromLoginServer") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Got TransferReplyCharacterDataFromLoginServer, characterId=%s\n", reply.getValue().getCharacterId().getValueString().c_str())); + + // is this a transfer or a rename? + if(TransferServer::isRename(reply.getValue())) + { + LOG("CustomerService", ("CharacterTransfer: Sending TransferRequestNameValidation for character rename request: %s", reply.getValue().toString().c_str())); + // send a name validation request + const GenericValueTypeMessage requestNameValidation("TransferRequestNameValidation", reply.getValue()); + CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(reply.getValue().getSourceGalaxy()); + if(centralServerConnection) + { + centralServerConnection->send(requestNameValidation, true); + } + } + else + { + // this is a transfer + TransferServer::getLoginLocationData(reply.getValue()); + } + break; + } + case constcrc("TransferReplyLoginLocationData") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Got TransferReplyLoginLocationData from CentralServer. TransferCharacterData=%s\n", reply.getValue().toString().c_str())); + + // send character to ConnectionServer for login to a game server + const GenericValueTypeMessage login("TransferLoginCharacterToSourceServer", reply.getValue()); + LOG("CustomerService", ("CharacterTransfer: Sending TransferLoginCharacterToSourceServer to CentralServer : %s", login.getValue().toString().c_str())); + send(login, true); + break; + } + case constcrc("TransferReceiveDataFromGameServer") : + { + const GenericValueTypeMessage transferReply(ri); + LOG("CustomerService", ("CharacterTransfer: Got TransferReceiveDataFromGameServer: %s", transferReply.getValue().toString().c_str())); + REPORT_LOG(true, ("Got TransferReceiveDataFromGameServer: %s\n", transferReply.getValue().toString().c_str())); + + // find a central server connection for the target cluster + CentralServerConnection * destinationCentralConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(transferReply.getValue().getDestinationGalaxy()); + if(destinationCentralConnection) + { + // send character to ConnectionServer for creation on the destination server + GenericValueTypeMessage login("TransferLoginCharacterToDestinationServer", transferReply.getValue()); + destinationCentralConnection->send(login, true); + LOG("CustomerService", ("CharacterTransfer: Sending TransferLoginCharacterToDestinationServer to CentralServer (%s) for (%s)", transferReply.getValue().getDestinationGalaxy().c_str(), login.getValue().toString().c_str())); + } + else + { + //@todo: report error to CTS API + LOG("CustomerService", ("CharacterTransfer: Failed to get a CentralServer connection for %s", transferReply.getValue().getDestinationGalaxy().c_str())); + TransferServer::transferCreateCharacterFailed(transferReply.getValue()); + } + break; + } + case constcrc("ApplyTransferDataSuccess") : + { + const GenericValueTypeMessage success(ri); + LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferDataSuccess from target galaxy. %s", success.getValue().toString().c_str())); + + CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(success.getValue().getSourceGalaxy()); if(centralServerConnection) { - centralServerConnection->send(requestNameValidation, true); + LOG("CustomerService", ("CharacterTransfer: Sending ToggleAvatarLoginStatus request to source central server")); + const ToggleAvatarLoginStatus toggleLoginStatus(success.getValue().getSourceGalaxy(), success.getValue().getSourceStationId(), success.getValue().getCharacterId(), false); + centralServerConnection->send(toggleLoginStatus, true); + TransferServer::replyMoveSuccess(success.getValue()); + LOG("CustomerService", ("CharacterTransfer: TRANSFER SUCCESSFUL for transactionId=%u", success.getValue().getTransactionId())); } + else + { + LOG("CustomerService", ("CharacterTransfer: Transfer failed on target galaxy : %s", success.getValue().toString().c_str())); + TransferServer::transferCreateCharacterFailed(success.getValue()); + } + break; } - else + case constcrc("ApplyTransferDataFail") : { - // this is a transfer - TransferServer::getLoginLocationData(reply.getValue()); - } - } - else if(msg.isType("TransferReplyLoginLocationData")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Got TransferReplyLoginLocationData from CentralServer. TransferCharacterData=%s\n", reply.getValue().toString().c_str())); - - // send character to ConnectionServer for login to a game server - const GenericValueTypeMessage login("TransferLoginCharacterToSourceServer", reply.getValue()); - LOG("CustomerService", ("CharacterTransfer: Sending TransferLoginCharacterToSourceServer to CentralServer : %s", login.getValue().toString().c_str())); - send(login, true); - } - else if(msg.isType("TransferReceiveDataFromGameServer")) - { - const GenericValueTypeMessage transferReply(ri); - LOG("CustomerService", ("CharacterTransfer: Got TransferReceiveDataFromGameServer: %s", transferReply.getValue().toString().c_str())); - REPORT_LOG(true, ("Got TransferReceiveDataFromGameServer: %s\n", transferReply.getValue().toString().c_str())); - - // find a central server connection for the target cluster - CentralServerConnection * destinationCentralConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(transferReply.getValue().getDestinationGalaxy()); - if(destinationCentralConnection) - { - // send character to ConnectionServer for creation on the destination server - GenericValueTypeMessage login("TransferLoginCharacterToDestinationServer", transferReply.getValue()); - destinationCentralConnection->send(login, true); - LOG("CustomerService", ("CharacterTransfer: Sending TransferLoginCharacterToDestinationServer to CentralServer (%s) for (%s)", transferReply.getValue().getDestinationGalaxy().c_str(), login.getValue().toString().c_str())); - } - else - { - //@todo: report error to CTS API - LOG("CustomerService", ("CharacterTransfer: Failed to get a CentralServer connection for %s", transferReply.getValue().getDestinationGalaxy().c_str())); - TransferServer::transferCreateCharacterFailed(transferReply.getValue()); - } - - } - else if(msg.isType("ApplyTransferDataSuccess")) - { - const GenericValueTypeMessage success(ri); - LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferDataSuccess from target galaxy. %s", success.getValue().toString().c_str())); - - CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(success.getValue().getSourceGalaxy()); - if(centralServerConnection) - { - LOG("CustomerService", ("CharacterTransfer: Sending ToggleAvatarLoginStatus request to source central server")); - const ToggleAvatarLoginStatus toggleLoginStatus(success.getValue().getSourceGalaxy(), success.getValue().getSourceStationId(), success.getValue().getCharacterId(), false); - centralServerConnection->send(toggleLoginStatus, true); - TransferServer::replyMoveSuccess(success.getValue()); - LOG("CustomerService", ("CharacterTransfer: TRANSFER SUCCESSFUL for transactionId=%u", success.getValue().getTransactionId())); - } - else - { - LOG("CustomerService", ("CharacterTransfer: Transfer failed on target galaxy : %s", success.getValue().toString().c_str())); - TransferServer::transferCreateCharacterFailed(success.getValue()); - } - - } - else if(msg.isType("ApplyTransferDataFail")) - { - const GenericValueTypeMessage fail(ri); - LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferDataFail from target galaxy. %s", fail.getValue().toString().c_str())); - - CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(fail.getValue().getDestinationGalaxy()); - if(centralServerConnection) - { - LOG("CustomerService", ("CharacterTransfer: failed to apply transfer data. Deleting character on destination server. %s", fail.getValue().toString().c_str())); - const GenericValueTypeMessage deleteCharacter("DeleteFailedTransfer", fail.getValue()); - centralServerConnection->send(deleteCharacter, true); - TransferServer::failedToApplyTransferData(fail.getValue()); - } - } - else if(msg.isType("TransferCreateCharacterFailed")) - { - const GenericValueTypeMessage fail(ri); - LOG("CustomerService", ("CharacterTransfer: Received TransferCreateCharacterFailed, sending response to CTS API. %s", fail.getValue().toString().c_str())); - TransferServer::transferCreateCharacterFailed(fail.getValue()); - } - else if(msg.isType("TransferRenameCharacterReply")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Received TransferRenameCharacterReply from Central Server : %s", reply.getValue().toString().c_str())); - if(reply.getValue().getIsValidName()) - { - TransferServer::replyMoveSuccess(reply.getValue()); - } - else - { - TransferServer::transferCreateCharacterFailed(reply.getValue()); - } - } - else if(msg.isType("TransferAccountReplySuccessTransferServer")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Received TransferAccountReplySuccessTransferServer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); - TransferServer::replyTransferAccountSuccess(reply.getValue()); - } - else if(msg.isType("TransferAccountFailedToUpdateGameDatabase")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Received TransferAccountFailedToUpdateGameDatabase for transfer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); - TransferServer::failedToTransferAccountNoCentralConnection(reply.getValue()); - } - else if(msg.isType("TransferAccountFailedDestinationNotEmpty")) - { - const GenericValueTypeMessage reply(ri); - LOG("CustomerService", ("CharacterTransfer: Received TransferAccountFailedDestinationNotEmpty for transfer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); - TransferServer::failedToTransferAccountDestinationNotEmpty(reply.getValue()); - } - else if(msg.isType("ReplyTransferDataFail")) - { - const GenericValueTypeMessage reply(ri); - TransferServer::failedToRetrieveTransferData(reply.getValue()); - } - else if(msg.isType("TransferFailGameServerClosedConnectionWithConnectionServer")) - { - const GenericValueTypeMessage fail(ri); - TransferServer::failedToTransferCharacterGameConnectionClosed(fail.getValue()); - } - else if(msg.isType("TransferFailConnectionServerClosedConnectionWithCentralServer")) - { - const GenericValueTypeMessage fail(ri); - TransferServer::failedToTransferCharacterConnectionServerConnectionClosed(fail.getValue()); - } - else if(msg.isType("ConGenericMessage")) - { - const ConGenericMessage cm(ri); - std::string result; - ConsoleManager::processString(cm.getMsg(), static_cast(cm.getMsgId()), result); - const ConGenericMessage response(result, cm.getMsgId()); - send(response, true); + const GenericValueTypeMessage fail(ri); + LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferDataFail from target galaxy. %s", fail.getValue().toString().c_str())); + CentralServerConnection * centralServerConnection = CentralServerConnection::getCentralServerConnectionForGalaxy(fail.getValue().getDestinationGalaxy()); + if(centralServerConnection) + { + LOG("CustomerService", ("CharacterTransfer: failed to apply transfer data. Deleting character on destination server. %s", fail.getValue().toString().c_str())); + const GenericValueTypeMessage deleteCharacter("DeleteFailedTransfer", fail.getValue()); + centralServerConnection->send(deleteCharacter, true); + TransferServer::failedToApplyTransferData(fail.getValue()); + } + break; + } + case constcrc("TransferCreateCharacterFailed") : + { + const GenericValueTypeMessage fail(ri); + LOG("CustomerService", ("CharacterTransfer: Received TransferCreateCharacterFailed, sending response to CTS API. %s", fail.getValue().toString().c_str())); + TransferServer::transferCreateCharacterFailed(fail.getValue()); + break; + } + case constcrc("TransferRenameCharacterReply") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Received TransferRenameCharacterReply from Central Server : %s", reply.getValue().toString().c_str())); + if(reply.getValue().getIsValidName()) + { + TransferServer::replyMoveSuccess(reply.getValue()); + } + else + { + TransferServer::transferCreateCharacterFailed(reply.getValue()); + } + break; + } + case constcrc("TransferAccountReplySuccessTransferServer") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Received TransferAccountReplySuccessTransferServer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); + TransferServer::replyTransferAccountSuccess(reply.getValue()); + break; + } + case constcrc("TransferAccountFailedToUpdateGameDatabase") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Received TransferAccountFailedToUpdateGameDatabase for transfer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); + TransferServer::failedToTransferAccountNoCentralConnection(reply.getValue()); + break; + } + case constcrc("TransferAccountFailedDestinationNotEmpty") : + { + const GenericValueTypeMessage reply(ri); + LOG("CustomerService", ("CharacterTransfer: Received TransferAccountFailedDestinationNotEmpty for transfer from station Id %d to station Id %d", reply.getValue().getSourceStationId(), reply.getValue().getDestinationStationId())); + TransferServer::failedToTransferAccountDestinationNotEmpty(reply.getValue()); + break; + } + case constcrc("ReplyTransferDataFail") : + { + const GenericValueTypeMessage reply(ri); + TransferServer::failedToRetrieveTransferData(reply.getValue()); + break; + } + case constcrc("TransferFailGameServerClosedConnectionWithConnectionServer") : + { + const GenericValueTypeMessage fail(ri); + TransferServer::failedToTransferCharacterGameConnectionClosed(fail.getValue()); + break; + } + case constcrc("TransferFailConnectionServerClosedConnectionWithCentralServer") : + { + const GenericValueTypeMessage fail(ri); + TransferServer::failedToTransferCharacterConnectionServerConnectionClosed(fail.getValue()); + break; + } + case constcrc("ConGenericMessage") : + { + const ConGenericMessage cm(ri); + std::string result; + ConsoleManager::processString(cm.getMsg(), static_cast(cm.getMsgId()), result); + const ConGenericMessage response(result, cm.getMsgId()); + send(response, true); + break; + } } } diff --git a/engine/server/library/serverDatabase/src/shared/CentralServerConnection.cpp b/engine/server/library/serverDatabase/src/shared/CentralServerConnection.cpp index ff845939..9873c649 100755 --- a/engine/server/library/serverDatabase/src/shared/CentralServerConnection.cpp +++ b/engine/server/library/serverDatabase/src/shared/CentralServerConnection.cpp @@ -25,6 +25,8 @@ #include "Unicode.h" #include "UnicodeUtils.h" +#include "sharedFoundation/CrcConstexpr.hpp" + // ====================================================================== CentralServerConnection::CentralServerConnection(const std::string & a, const unsigned short p) : @@ -65,31 +67,39 @@ void CentralServerConnection::onReceive(const Archive::ByteStream & message) const GameNetworkMessage msg(ri); ri = message.begin(); - if(msg.isType("TransferRenameCharacter")) - { - const GenericValueTypeMessage request(ri); - const TransferCharacterData & requestData = request.getValue(); - LOG("CustomerService", ("CharacterTransfer: Received TransferRenameCharacter, starting game database name change. %s", requestData.toString().c_str())); - Persister::getInstance().renameCharacter(0, static_cast(RenameCharacterMessageEx::RCMS_cts_rename), request.getValue().getSourceStationId(), request.getValue().getCharacterId(), Unicode::narrowToWide(request.getValue().getDestinationCharacterName()), Unicode::narrowToWide(request.getValue().getSourceCharacterName()), false, NetworkId::cms_invalid, &requestData); - } - else if(msg.isType("ConGenericMessage")) - { - const ConGenericMessage cm(ri); - std::string result; - ConsoleManager::processString(cm.getMsg(), cm.getMsgId(), result); - const ConGenericMessage response(result, cm.getMsgId()); - send(response, true); - } - else if(msg.isType("TransferAccountRequestCentralDatabase")) - { - const GenericValueTypeMessage request(ri); - const TransferAccountData & requestData = request.getValue(); - LOG("CustomerService", ("CharacterTransfer: Received TransferAccountRequestCentralDatabase, starting game database change from station ID %d to station ID %d", request.getValue().getSourceStationId(), request.getValue().getDestinationStationId())); - Persister::getInstance().changeStationId(&requestData); - } - else - { - ServerConnection::onReceive(message); + const uint32 messageType = msg.getType(); + + switch(messageType) { + case constcrc("TransferRenameCharacter") : + { + const GenericValueTypeMessage request(ri); + const TransferCharacterData & requestData = request.getValue(); + LOG("CustomerService", ("CharacterTransfer: Received TransferRenameCharacter, starting game database name change. %s", requestData.toString().c_str())); + Persister::getInstance().renameCharacter(0, static_cast(RenameCharacterMessageEx::RCMS_cts_rename), request.getValue().getSourceStationId(), request.getValue().getCharacterId(), Unicode::narrowToWide(request.getValue().getDestinationCharacterName()), Unicode::narrowToWide(request.getValue().getSourceCharacterName()), false, NetworkId::cms_invalid, &requestData); + break; + } + case constcrc("ConGenericMessage") : + { + const ConGenericMessage cm(ri); + std::string result; + ConsoleManager::processString(cm.getMsg(), cm.getMsgId(), result); + const ConGenericMessage response(result, cm.getMsgId()); + send(response, true); + break; + } + case constcrc("TransferAccountRequestCentralDatabase") : + { + const GenericValueTypeMessage request(ri); + const TransferAccountData & requestData = request.getValue(); + LOG("CustomerService", ("CharacterTransfer: Received TransferAccountRequestCentralDatabase, starting game database change from station ID %d to station ID %d", request.getValue().getSourceStationId(), request.getValue().getDestinationStationId())); + Persister::getInstance().changeStationId(&requestData); + break; + } + default : + { + ServerConnection::onReceive(message); + break; + } } } diff --git a/engine/server/library/serverDatabase/src/shared/DataLookup.cpp b/engine/server/library/serverDatabase/src/shared/DataLookup.cpp index 33fef53a..3c371f0a 100755 --- a/engine/server/library/serverDatabase/src/shared/DataLookup.cpp +++ b/engine/server/library/serverDatabase/src/shared/DataLookup.cpp @@ -28,6 +28,8 @@ #include "sharedNetworkMessages/NameErrors.h" #include "unicodeArchive/UnicodeArchive.h" +#include "sharedFoundation/CrcConstexpr.hpp" + //----------------------------------------------------------------------- DataLookup *DataLookup::ms_theInstance = nullptr; @@ -93,59 +95,71 @@ void DataLookup::receiveMessage(const MessageDispatch::Emitter &source, const Me { UNREF(source); - if (message.isType("VerifyNameRequest")) - { - const GameServerConnection * g = safe_cast(&source); - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - VerifyNameRequest * vnr = new VerifyNameRequest(ri); - - LOG("TraceCharacterCreation", ("%d received VerifyNameRequest", vnr->getStationId())); - verifyName(g->getProcessId(), vnr); - } - else if (message.isType("ReleaseNameMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ReleaseNameMessage rnm(ri); + const uint32 messageType = message.getType(); + + switch(messageType) { + case constcrc("VerifyNameRequest") : + { + const GameServerConnection * g = safe_cast(&source); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + VerifyNameRequest * vnr = new VerifyNameRequest(ri); + + LOG("TraceCharacterCreation", ("%d received VerifyNameRequest", vnr->getStationId())); + verifyName(g->getProcessId(), vnr); + break; + } + case constcrc("ReleaseNameMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ReleaseNameMessage rnm(ri); - LOG("TraceCharacterCreation", ("%d received ReleaseNameMessage", rnm.getStationId())); + LOG("TraceCharacterCreation", ("%d received ReleaseNameMessage", rnm.getStationId())); - releaseName(rnm.getStationId(), rnm.getCharacterId()); - } - else if (message.isType("RequestBiographyMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RequestBiographyMessage msg(ri); + releaseName(rnm.getStationId(), rnm.getCharacterId()); + break; + } + case constcrc("RequestBiographyMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RequestBiographyMessage msg(ri); - const GameServerConnection *conn = dynamic_cast(&source); - if (conn) - getBiography(msg.getOwner(),conn->getProcessId()); - else - DEBUG_WARNING(true,("Got RequestBiographyMessage from something that wasn't a GameServerConnection.\n")); - } - else if (message.isType("BiographyMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - BiographyMessage msg(ri); + const GameServerConnection *conn = dynamic_cast(&source); + if (conn) + getBiography(msg.getOwner(),conn->getProcessId()); + else + DEBUG_WARNING(true,("Got RequestBiographyMessage from something that wasn't a GameServerConnection.\n")); + + break; + } + case constcrc("BiographyMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + BiographyMessage msg(ri); - setBiography(msg.getOwner(),msg.getBio()); - } - else if (message.isType("PurgeStructuresForAccountMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); + setBiography(msg.getOwner(),msg.getBio()); + break; + } + case constcrc("PurgeStructuresForAccountMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); - getStructuresForPurge(msg.getValue(), false); - } - else if (message.isType("WarnStructuresAboutPurgeMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); + getStructuresForPurge(msg.getValue(), false); + break; + } + case constcrc("WarnStructuresAboutPurgeMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); - getStructuresForPurge(msg.getValue(), true); - } - else - { - DEBUG_REPORT_LOG(true,("Unrecognized message recieved by DataLookup.\n")); + getStructuresForPurge(msg.getValue(), true); + break; + } + default : + { + DEBUG_REPORT_LOG(true,("Unrecognized message recieved by DataLookup.\n")); + break; + } } } @@ -454,32 +468,6 @@ const Unicode::String DataLookup::normalizeName(const Unicode::String &name) con return result; } -//-------------------------------------------------------------------- -/* -const std::string DataLookup::getNameByStationId(uint32 stationId) const -{ - std::map::const_iterator i=m_reservations.find(stationId); - if (i == m_reservations.end()) - { - WARNING_STRICT_FATAL(true, ("asked for name that wasn't in the reservation list")); - return std::string(); - } - return Unicode::wideToNarrow(i->second.originalName); -} - -//-------------------------------------------------------------------- - -const std::string DataLookup::getNormalizedNameByStationId(uint32 stationId) const -{ - std::map::const_iterator i=m_reservations.find(stationId); - if (i == m_reservations.end()) - { - WARNING_STRICT_FATAL(true, ("asked for name that wasn't in the reservation list")); - return std::string(); - } - return Unicode::wideToNarrow(i->second.name); -} - //-------------------------------------------------------------------- */ DataLookup::reservationList * DataLookup::getReservationList(uint32 stationId) diff --git a/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp b/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp index 7164f1b8..4df57236 100755 --- a/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp +++ b/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp @@ -44,6 +44,8 @@ #include "sharedNetworkMessages/FrameEndMessage.h" #include "UnicodeUtils.h" +#include "sharedFoundation/CrcConstexpr.hpp" + // ---------------------------------------------------------------------- DatabaseProcess *DatabaseProcess::ms_theInstance = nullptr; @@ -418,143 +420,162 @@ void DatabaseProcess::gameServerGoByeBye(uint32 processId) void DatabaseProcess::receiveMessage(const MessageDispatch::Emitter & source, const MessageDispatch::MessageBase & message) { UNREF(source); + + const uint32 messageType = message.getType(); //--- // Connection info messages // - if(message.isType("CentralConnectionOpened")) - { - DEBUG_REPORT_LOG(true, ("Connection with Central server opened\n")); - DEBUG_FATAL(centralServerConnection != &source,("Got CentralConnectionOpened from something other than our CentralServer connection.\n")); - - //TODO: Make a DatabaseProcessConnect version of this message, perhaps ? - CentralGameServerConnect c("database", "127.0.0.1", 0, gameService->getBindAddress(), gameService->getBindPort()); - centralServerConnection->send(c, true); - - } - else if(message.isType("GameConnectionOpened")) - { - DEBUG_REPORT_LOG(true, ("Connection with Game server opened\n")); - } - else if(message.isType("TaskConnectionOpened")) - { - DEBUG_REPORT_LOG(true, ("Connection with Task manager opened\n")); - - // get cluster name - std::string clusterName; - ConfigFile::Section const * const sec = ConfigFile::getSection("TaskManager"); - if (sec) + switch(messageType) { + case constcrc("CentralConnectionOpened") : { - ConfigFile::Key const * const ky = sec->findKey("clusterName"); - if (ky) + DEBUG_REPORT_LOG(true, ("Connection with Central server opened\n")); + DEBUG_FATAL(centralServerConnection != &source,("Got CentralConnectionOpened from something other than our CentralServer connection.\n")); + + //TODO: Make a DatabaseProcessConnect version of this message, perhaps ? + CentralGameServerConnect c("database", "127.0.0.1", 0, gameService->getBindAddress(), gameService->getBindPort()); + centralServerConnection->send(c, true); + break; + } + case constcrc("GameConnectionOpened") : + { + DEBUG_REPORT_LOG(true, ("Connection with Game server opened\n")); + break; + } + case constcrc("TaskConnectionOpened") : + { + DEBUG_REPORT_LOG(true, ("Connection with Task manager opened\n")); + + // get cluster name + std::string clusterName; + ConfigFile::Section const * const sec = ConfigFile::getSection("TaskManager"); + if (sec) { - clusterName = ky->getAsString(ky->getCount()-1, ""); + ConfigFile::Key const * const ky = sec->findKey("clusterName"); + if (ky) + { + clusterName = ky->getAsString(ky->getCount()-1, ""); + } } + + TaskConnectionIdMessage tid(TaskConnectionIdMessage::Database, "", clusterName); + taskService->send(tid, true); + + break; } - - TaskConnectionIdMessage tid(TaskConnectionIdMessage::Database, "", clusterName); - taskService->send(tid, true); - } - else if(message.isType("CommoditiesConnectionOpened")) - { - DEBUG_REPORT_LOG(true, ("Connection with Commodities Server opened\n")); - CommoditiesServerConnection * con = const_cast(static_cast(&source)); - if (commoditiesConnection) - LOG("CommoditiesConnectionOpened",("Connection Opened while another connection already exists.")); - commoditiesConnection = con; - } - else if(message.isType("CentralConnectionClosed")) - { - DEBUG_REPORT_LOG(true, ("Central server closed its connection, we must die a tragicly heroic death.\n")); - setDone("CentralConnectionClosed : %s", centralServerConnection->getDisconnectReason().c_str()); - centralServerConnection = 0; - WARNING(true,("Database lost connection to central.")); - } - else if(message.isType("GameConnectionClosed")) - { - DEBUG_REPORT_LOG(true, ("a Game server closed its connection\n")); - } - else if(message.isType("TaskConnectionClosed")) - { - DEBUG_REPORT_LOG(true, ("Task manager closed its connection\n")); - taskService=0; - } - else if(message.isType("CommoditiesConnectionClosed")) - { - DEBUG_REPORT_LOG(true, ("Commodities Server closed its connection\n")); - commoditiesService = 0; - commoditiesConnection = 0; - } - // end connection info messages - //--- - - else if(message.isType("CentralGameServerSetProcessId")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CentralGameServerSetProcessId id(ri); - setProcessId(id.getProcessId()); - clusterName = id.getClusterName(); - - Loader::getInstance().checkVersionNumber(ConfigServerDatabase::getExpectedDBVersion(), ConfigServerDatabase::isCorrectDBVersionRequired()); - Loader::getInstance().loadClock(); - } - else if(message.isType("GameSetProcessId") || message.isType("GameGameServerConnect")) - { - GameServerConnection * g = const_cast(static_cast(&source)); - gameServerConnections[g->getProcessId()] = g; - - GameServerConnectAck reply; - g->send(reply,true); - } - else if(message.isType("ProfilerOperationMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ProfilerOperationMessage m(ri); - uint32 processId = m.getProcessId(); - if (processId == 0 || processId == getProcessId()) - Profiler::handleOperation(m.getOperation().c_str()); - } - else if(message.isType("ChatServerOnline")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ChatServerOnline cso(ri); - - // establish a connection with the chat server if one doesn't already exist - if (!chatServerConnection) + case constcrc("CommoditiesConnectionOpened") : { - REPORT_LOG(true, ("New chat server connection active\n")); - chatServerConnection = new ChatServerConnection(cso.getAddress(), cso.getPort()); + DEBUG_REPORT_LOG(true, ("Connection with Commodities Server opened\n")); + CommoditiesServerConnection * con = const_cast(static_cast(&source)); + if (commoditiesConnection) + LOG("CommoditiesConnectionOpened",("Connection Opened while another connection already exists.")); + commoditiesConnection = con; + break; } - } - else if(message.isType("ChatServerConnectionClosed")) - { - REPORT_LOG(true, ("DatabaseProcess: Chat Server connection closed\n")); - chatServerConnection = 0; - } - else if(message.isType("FrameEndMessage")) - { - // TODO: handle this game server's frame ending - } - else if (message.isType("CentralPingMessage")) - { - CentralPingMessage reply; - sendToCentralServer(reply,true); - } - else if (message.isType("ExcommunicateGameServerMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ExcommunicateGameServerMessage msg(ri); - - LOG("GameGameConnect",("Database Process was told to drop connection to %lu by Central",msg.getServerId())); - - FATAL (msg.getServerId() == getProcessId(),("Crashing because Central told us to (probably indicates we weren't responding to pings)")); - GameServerConnection *conn =getConnectionByProcess(msg.getServerId()); - if (conn) + case constcrc("CentralConnectionClosed") : { - conn->setDisconnectReason("Told to excommunicate by central"); - conn->disconnect(); + DEBUG_REPORT_LOG(true, ("Central server closed its connection, we must die a tragicly heroic death.\n")); + setDone("CentralConnectionClosed : %s", centralServerConnection->getDisconnectReason().c_str()); + centralServerConnection = 0; + WARNING(true,("Database lost connection to central.")); + break; } - } + case constcrc("GameConnectionClosed") : + { + DEBUG_REPORT_LOG(true, ("a Game server closed its connection\n")); + break; + } + case constcrc("TaskConnectionClosed") : + { + DEBUG_REPORT_LOG(true, ("Task manager closed its connection\n")); + taskService = 0; + break; + } + case constcrc("CommoditiesConnectionClosed") : + { + DEBUG_REPORT_LOG(true, ("Commodities Server closed its connection\n")); + commoditiesService = 0; + commoditiesConnection = 0; + break; + } + // end connection info messages + case constcrc("CentralGameServerSetProcessId") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CentralGameServerSetProcessId id(ri); + setProcessId(id.getProcessId()); + clusterName = id.getClusterName(); + + Loader::getInstance().checkVersionNumber(ConfigServerDatabase::getExpectedDBVersion(), ConfigServerDatabase::isCorrectDBVersionRequired()); + Loader::getInstance().loadClock(); + break; + } + case constcrc("GameSetProcessId") : + case constcrc("GameGameServerConnect") : + { + GameServerConnection * g = const_cast(static_cast(&source)); + gameServerConnections[g->getProcessId()] = g; + + GameServerConnectAck reply; + g->send(reply,true); + break; + } + case constcrc("ProfilerOperationMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ProfilerOperationMessage m(ri); + uint32 processId = m.getProcessId(); + if (processId == 0 || processId == getProcessId()) + Profiler::handleOperation(m.getOperation().c_str()); + break; + } + case constcrc("ChatServerOnline") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ChatServerOnline cso(ri); + + // establish a connection with the chat server if one doesn't already exist + if (!chatServerConnection) + { + REPORT_LOG(true, ("New chat server connection active\n")); + chatServerConnection = new ChatServerConnection(cso.getAddress(), cso.getPort()); + } + break; + } + case constcrc("ChatServerConnectionClosed") : + { + REPORT_LOG(true, ("DatabaseProcess: Chat Server connection closed\n")); + chatServerConnection = 0; + break; + } + case constcrc("FrameEndMessage") : + { + // TODO: handle this game server's frame ending + break; + } + case constcrc("CentralPingMessage") : + { + CentralPingMessage reply; + sendToCentralServer(reply,true); + break; + } + case constcrc("ExcommunicateGameServerMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ExcommunicateGameServerMessage msg(ri); + + LOG("GameGameConnect",("Database Process was told to drop connection to %lu by Central",msg.getServerId())); + + FATAL (msg.getServerId() == getProcessId(),("Crashing because Central told us to (probably indicates we weren't responding to pings)")); + GameServerConnection *conn =getConnectionByProcess(msg.getServerId()); + if (conn) + { + conn->setDisconnectReason("Told to excommunicate by central"); + conn->disconnect(); + } + break; + } + } } // ---------------------------------------------------------------------- diff --git a/engine/server/library/serverDatabase/src/shared/Loader.cpp b/engine/server/library/serverDatabase/src/shared/Loader.cpp index 3f863d80..c24c4419 100755 --- a/engine/server/library/serverDatabase/src/shared/Loader.cpp +++ b/engine/server/library/serverDatabase/src/shared/Loader.cpp @@ -51,6 +51,8 @@ #include "sharedNetworkMessages/GenericValueTypeMessage.h" #include "unicodeArchive/UnicodeArchive.h" +#include "sharedFoundation/CrcConstexpr.hpp" + #include // ====================================================================== @@ -411,135 +413,160 @@ void Loader::queueOutgoingSnapshot(LoaderSnapshotGroup *outgoingSnapshot) void Loader::receiveMessage(const MessageDispatch::Emitter & source, const MessageDispatch::MessageBase & message) { UNREF(source); - if(message.isType("LoadObjectMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - LoadObjectMessage lom(ri); - DEBUG_FATAL(true,("LoadObjectMessage is deprecated on the database process.\n")); -// requestObject(lom.getId(),lom.getProcess()); - } - else if(message.isType("RequestChunkMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RequestChunkMessage m(ri); - - std::vector const & chunks = m.getChunks(); - for (std::vector::const_iterator i=chunks.begin(); i!=chunks.end(); ++i) - requestChunk(i->m_process, i->m_nodeX, i->m_nodeZ, m.getSceneId()); - } - else if(message.isType("RequestOIDsMessage")) - { -// DEBUG_REPORT_LOG(true,("Got RequestOIDsMessage.\n")); - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RequestOIDsMessage m(ri); + + switch (messageType) { + case constcrc("LoadObjectMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + LoadObjectMessage lom(ri); + DEBUG_FATAL(true,("LoadObjectMessage is deprecated on the database process.\n")); + // requestObject(lom.getId(),lom.getProcess()); + break; + } + case constcrc("RequestChunkMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RequestChunkMessage m(ri); + + std::vector const & chunks = m.getChunks(); + for (std::vector::const_iterator i=chunks.begin(); i!=chunks.end(); ++i) + requestChunk(i->m_process, i->m_nodeX, i->m_nodeZ, m.getSceneId()); + + break; + } + case constcrc("RequestOIDsMessage") : + { + // DEBUG_REPORT_LOG(true,("Got RequestOIDsMessage.\n")); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RequestOIDsMessage m(ri); - if (m.getLogRequest()) - LOG("ObjectIdManager", ("Received RequestOIDsMessage for %lu more object ids for pid %lu", m.getHowMany(), m.getServerId())); + if (m.getLogRequest()) + LOG("ObjectIdManager", ("Received RequestOIDsMessage for %lu more object ids for pid %lu", m.getHowMany(), m.getServerId())); - getObjectIds(static_cast(m.getServerId()),static_cast(m.getHowMany()), m.getLogRequest()); - } - else if(message.isType("ValidateCharacterForLoginMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ValidateCharacterForLoginMessage msg(ri); - verifyCharacter(msg.getSuid(), msg.getCharacterId(), nullptr); - } - else if(message.isType("TransferGetLoginLocationData")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage request(ri); - TransferCharacterData * transferData = new TransferCharacterData(request.getValue()); - verifyCharacter(transferData->getSourceStationId(), transferData->getCharacterId(), transferData); - }//lint !e429 not freed : suppressed because verifyCharacter will own this copy of the data - else if(message.isType("LoadUniverseMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - LoadUniverseMessage m(ri); - DEBUG_REPORT_LOG(true,("Got LoadUniverseMessage\n")); - loadUniverse(m.getProcess()); - } - else if(message.isType("PlanetLoadCharacterMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - PlanetLoadCharacterMessage m(ri); - DEBUG_REPORT_LOG(true,("Got PlanetLoadCharacterMessage\n")); - requestCharacter(m.getCharacterId(), m.getGameServerId()); - } - else if(message.isType("LoadContainedObjectMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - LoadContainedObjectMessage msg(ri); + getObjectIds(static_cast(m.getServerId()),static_cast(m.getHowMany()), m.getLogRequest()); + break; + } + case constcrc("ValidateCharacterForLoginMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ValidateCharacterForLoginMessage msg(ri); + verifyCharacter(msg.getSuid(), msg.getCharacterId(), nullptr); + break; + } + case constcrc("TransferGetLoginLocationData") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage request(ri); + TransferCharacterData * transferData = new TransferCharacterData(request.getValue()); + verifyCharacter(transferData->getSourceStationId(), transferData->getCharacterId(), transferData); + break; + }//lint !e429 not freed : suppressed because verifyCharacter will own this copy of the data + case constcrc("LoadUniverseMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + LoadUniverseMessage m(ri); + DEBUG_REPORT_LOG(true,("Got LoadUniverseMessage\n")); + loadUniverse(m.getProcess()); + break; + } + case constcrc("PlanetLoadCharacterMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + PlanetLoadCharacterMessage m(ri); + DEBUG_REPORT_LOG(true,("Got PlanetLoadCharacterMessage\n")); + requestCharacter(m.getCharacterId(), m.getGameServerId()); + break; + } + case constcrc("LoadContainedObjectMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + LoadContainedObjectMessage msg(ri); - const GameServerConnection * g = dynamic_cast(&source); - if (g) - loadContainedObject(msg.getContainerId(), msg.getObjectId(), g->getProcessId()); - else - WARNING_STRICT_FATAL(true,("Got LoadContainedObjectMessage for %s, but sender was not a GameServerConnection.\n",msg.getObjectId().getValueString().c_str())); - } - else if(message.isType("LoadContentsMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - LoadContentsMessage msg(ri); + const GameServerConnection * g = dynamic_cast(&source); + if (g) + loadContainedObject(msg.getContainerId(), msg.getObjectId(), g->getProcessId()); + else + WARNING_STRICT_FATAL(true,("Got LoadContainedObjectMessage for %s, but sender was not a GameServerConnection.\n",msg.getObjectId().getValueString().c_str())); + + break; + } + case constcrc("LoadContentsMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + LoadContentsMessage msg(ri); - const GameServerConnection * g = dynamic_cast(&source); - if (g) - loadContents(msg.getContainerId(), g->getProcessId()); - else - WARNING_STRICT_FATAL(true,("Got LoadContentsMessage for container %s, but sender was not a GameServerConnection.\n",msg.getContainerId().getValueString().c_str())); - } - else if(message.isType("LocateStructureMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - LocateStructureMessage msg(ri); + const GameServerConnection * g = dynamic_cast(&source); + if (g) + loadContents(msg.getContainerId(), g->getProcessId()); + else + WARNING_STRICT_FATAL(true,("Got LoadContentsMessage for container %s, but sender was not a GameServerConnection.\n",msg.getContainerId().getValueString().c_str())); + + break; + } + case constcrc("LocateStructureMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + LocateStructureMessage msg(ri); - const GameServerConnection * g = dynamic_cast(&source); - if (g) - locateStructure(msg.getStructureId(), msg.getWhoRequested()); - else - WARNING_STRICT_FATAL(true,("Got LocateStructureMessage for %s, but sender was not a GameServerConnection.\n",msg.getStructureId().getValueString().c_str())); - } - else if(message.isType("PreloadRequestCompleteMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - PreloadRequestCompleteMessage msg(ri); + const GameServerConnection * g = dynamic_cast(&source); + if (g) + locateStructure(msg.getStructureId(), msg.getWhoRequested()); + else + WARNING_STRICT_FATAL(true,("Got LocateStructureMessage for %s, but sender was not a GameServerConnection.\n",msg.getStructureId().getValueString().c_str())); + + break; + } + case constcrc("PreloadRequestCompleteMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + PreloadRequestCompleteMessage msg(ri); - preloadRequestComplete(msg.getGameServerId(), msg.getPreloadAreaId()); - } - else if(message.isType("LoadAckMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); - const GameServerConnection * g = dynamic_cast(&source); - if (g) - handleLoadAck(g->getProcessId(), msg.getValue()); - else - WARNING_STRICT_FATAL(true,("Got LoadAckMessage, but sender was not a GameServerConnection.")); - } - else if( message.isType("CSGetCharactersRequestMessage") ) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CSGetCharactersRequestMessage const msg( ri ); - handleCSGetCharacters( msg ); - } - else if( message.isType("CSGetDeletedItemsRequestMessage") ) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CSGetDeletedItemsRequestMessage const msg( ri ); - handleCSGetDeletedItems( msg ); - - } - else if( message.isType("DBCSRequestMessage" ) ) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - DBCSRequestMessage const msg( ri ); - handleCSRequest( msg ); + preloadRequestComplete(msg.getGameServerId(), msg.getPreloadAreaId()); + + break; + } + case constcrc("LoadAckMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); + const GameServerConnection * g = dynamic_cast(&source); + if (g) + handleLoadAck(g->getProcessId(), msg.getValue()); + else + WARNING_STRICT_FATAL(true,("Got LoadAckMessage, but sender was not a GameServerConnection.")); + + break; + } + case constcrc("CSGetCharactersRequestMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CSGetCharactersRequestMessage const msg( ri ); + handleCSGetCharacters( msg ); + break; + } + case constcrc("CSGetDeletedItemsRequestMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CSGetDeletedItemsRequestMessage const msg( ri ); + handleCSGetDeletedItems( msg ); + break; + } + case constcrc("DBCSRequestMessage" ) : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + DBCSRequestMessage const msg( ri ); + handleCSRequest( msg ); + break; + } } } void Loader::handleCSRequest( const DBCSRequestMessage & msg ) { DEBUG_REPORT_LOG( true, ( "Message:%s\n", msg.getCommand().c_str() ) ); - if( msg.getCommand() == "get_characters" ) + + // TODO : maybe constexpr this one sometime + if( == "get_characters" ) { handleCSGetCharacters( msg ); } diff --git a/engine/server/library/serverDatabase/src/shared/Persister.cpp b/engine/server/library/serverDatabase/src/shared/Persister.cpp index bf178daa..19270519 100755 --- a/engine/server/library/serverDatabase/src/shared/Persister.cpp +++ b/engine/server/library/serverDatabase/src/shared/Persister.cpp @@ -65,6 +65,8 @@ #include "sharedNetworkMessages/GenericValueTypeMessage.h" #include "sharedNetworkMessages/ObjectChannelMessages.h" +#include "sharedFoundation/CrcConstexpr.hpp" + #include #include @@ -650,243 +652,282 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me if (gameConnection) sourceGameServer = gameConnection->getProcessId(); - if(message.isType("FlagObjectForDeleteMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - FlagObjectForDeleteMessage m(ri); - handleDeleteMessage(sourceGameServer, m.getId(),m.getReason(),m.getImmediate(),m.getDemandLoadedContainer(),m.getCascadeReason()); - } - else if(message.isType("CreateObjectByCrcMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CreateObjectByCrcMessage t(ri); -// DEBUG_REPORT_LOG(true,("Got CreateObjectByCrcMessage for %s\n", t.getId().getValueString().c_str())); - newObject(sourceGameServer, t.getId(), t.getCrc(), t.getObjectType(), t.getContainer()); - } - else if(message.isType("EndBaselinesMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - EndBaselinesMessage t(ri); - endBaselines(t.getId(),sourceGameServer); - } - else if(message.isType("DeltasMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - DeltasMessage msg(ri); - - handleDeltasMessage(sourceGameServer,msg); - } - else if(message.isType("BaselinesMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - BaselinesMessage msg(ri); - - handleBaselinesMessage(sourceGameServer,msg); - } - else if(message.isType("UpdateObjectPositionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - UpdateObjectPositionMessage msg(ri); - - getSnapshotForObject(msg.getNetworkId(), sourceGameServer).handleUpdateObjectPosition(msg); - } - else if(message.isType("AddCharacterMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AddCharacterMessage ocm(ri); - DEBUG_REPORT_LOG(true, ("Got AddCharacterMessage for object %s.\n",ocm.getObjectId().getValueString().c_str())); - - addCharacter(ocm.getAccountNumber(), ocm.getObjectId(), ocm.getProcess(), ocm.getName(), ocm.getSpecial()); - } - else if (message.isType("UnloadObjectMessage")) - { - // TODO: keep track of when it's done saving so we know when we can reload it - } - else if (message.isType("MessageToMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - MessageToMessage m(ri); - - handleMessageTo (sourceGameServer, m.getData()); - } - else if (message.isType("MessageToAckMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - MessageToAckMessage m(ri); - - handleMessageToAck (sourceGameServer, m.getMessageId()); - } - else if (message.isType("ServerDeleteCharacterMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ServerDeleteCharacterMessage m(ri); - - deleteCharacter(m.getStationId(), m.getCharacterId()); - } - else if (message.isType("RenameCharacterMessageEx")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RenameCharacterMessageEx msg(ri); - - renameCharacter(sourceGameServer, static_cast(msg.getRenameCharacterMessageSource()), msg.getStationId(), msg.getCharacterId(), msg.getNewName(), msg.getOldName(), msg.getLastNameChangeOnly(), msg.getRequestedBy(), nullptr); - } - else if (message.isType("UnloadedPlayerMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - UnloadedPlayerMessage msg(ri); - - unloadCharacter(msg.getPlayerId(),sourceGameServer); - } - else if (message.isType("MoveToPlayer")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > msg(ri); - - moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, false, false); - } - else if (message.isType("MoveToPlayerBankMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > msg(ri); - - moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, true, false); - } - else if (message.isType("MoveToPlayerDatapadMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, int> > msg(ri); - - moveToPlayer(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second, false, true); - } - else if (message.isType("FixLoadWith")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, int> > msg(ri); - - fixLoadWith(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second); - } - else if (message.isType("ClusterShutdownMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); - - m_clusterShuttingDown = msg.getValue(); - } - else if (message.isType("StartSaveMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); - - userRequestedSave(sourceGameServer, msg.getValue()); - } - else if (message.isType("RestoreHouseMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > msg(ri); - - restoreHouse(msg.getValue().first, msg.getValue().second); - } - else if (message.isType("RestoreCharacterMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > msg(ri); - - restoreCharacter(msg.getValue().first, msg.getValue().second); - } - else if (message.isType("UndeleteItemMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > msg(ri); - - LOG("CustomerService", ("undeleteItem %s request from %s", msg.getValue().first.getValueString().c_str(), msg.getValue().second.c_str())); - undeleteItem(msg.getValue().first, msg.getValue().second); - } - else if (message.isType("MoveToPlayerMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, std::string> > msg(ri); - - LOG("CustomerService", ("moveToPlayer %s, %s request from %s", msg.getValue().first.first.getValueString().c_str(), msg.getValue().first.second.getValueString().c_str(), msg.getValue().second.c_str())); - moveToPlayer(msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second); - } - else if (message.isType("CentralRequestSave")) - { - centralRequestedSave(); - } - else if (message.isType("PlanetRequestSave")) - { - planetRequestedSave(); - } - else if (message.isType("AddResourceTypeMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AddResourceTypeMessage msg(ri); - handleAddResourceTypeMessage(sourceGameServer, msg); - } - else if (message.isType("BountyHunterTargetMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - BountyHunterTargetMessage msg(ri); - getSnapshotForServer(sourceGameServer).handleBountyHunterTargetMessage(msg); - } - else if ( (message.isType("CMCreateAuctionMessage")) || - (message.isType("CMCreateAuctionBidMessage")) || - (message.isType("CMCreateLocationMessage")) || - (message.isType("CMUpdateAuctionMessage")) || - (message.isType("CMUpdateLocationMessage")) || - (message.isType("CMDeleteAuctionMessage")) || - (message.isType("CMDeleteLocationMessage")) ) - { - const CommoditiesServerConnection * commConnection = dynamic_cast(&source); - uint32 commServerId = 0; - if (commConnection) - commServerId = commConnection->getProcessId(); - - getCommoditiesSnapshot(commServerId).handleCommoditiesDataMessage(message); - } - else if (message.isType("LoadCommodities")) - { - if (m_commoditiesSnapshot) + const uint32 messageType = message.getType(); + + switch(messageType) { + case constcrc("FlagObjectForDeleteMessage") : { - m_commoditiesSnapshot->startLoadAfterSaveComplete(); - if (!isSaveInProgress()) - m_startSaveWhenPossible = true; + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + FlagObjectForDeleteMessage m(ri); + handleDeleteMessage(sourceGameServer, m.getId(),m.getReason(),m.getImmediate(),m.getDemandLoadedContainer(),m.getCascadeReason()); + break; } - else + case constcrc("CreateObjectByCrcMessage") : { - startLoadCommodities(); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CreateObjectByCrcMessage t(ri); + // DEBUG_REPORT_LOG(true,("Got CreateObjectByCrcMessage for %s\n", t.getId().getValueString().c_str())); + newObject(sourceGameServer, t.getId(), t.getCrc(), t.getObjectType(), t.getContainer()); + break; + } + case constcrc("EndBaselinesMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + EndBaselinesMessage t(ri); + endBaselines(t.getId(),sourceGameServer); + break; + } + case constcrc("DeltasMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + DeltasMessage msg(ri); + + handleDeltasMessage(sourceGameServer,msg); + break; + } + case constcrc("BaselinesMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + BaselinesMessage msg(ri); + + handleBaselinesMessage(sourceGameServer,msg); + break; + } + case constcrc("UpdateObjectPositionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + UpdateObjectPositionMessage msg(ri); + + getSnapshotForObject(msg.getNetworkId(), sourceGameServer).handleUpdateObjectPosition(msg); + break; + } + case constcrc("AddCharacterMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AddCharacterMessage ocm(ri); + DEBUG_REPORT_LOG(true, ("Got AddCharacterMessage for object %s.\n",ocm.getObjectId().getValueString().c_str())); + + addCharacter(ocm.getAccountNumber(), ocm.getObjectId(), ocm.getProcess(), ocm.getName(), ocm.getSpecial()); + break; + } + case constcrc("UnloadObjectMessage") : + { + // TODO: keep track of when it's done saving so we know when we can reload it + break; + } + case constcrc("MessageToMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + MessageToMessage m(ri); + + handleMessageTo (sourceGameServer, m.getData()); + break; + } + case constcrc("MessageToAckMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + MessageToAckMessage m(ri); + + handleMessageToAck (sourceGameServer, m.getMessageId()); + break; + } + case constcrc("ServerDeleteCharacterMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ServerDeleteCharacterMessage m(ri); + + deleteCharacter(m.getStationId(), m.getCharacterId()); + break; + } + case constcrc("RenameCharacterMessageEx") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RenameCharacterMessageEx msg(ri); + + renameCharacter(sourceGameServer, static_cast(msg.getRenameCharacterMessageSource()), msg.getStationId(), msg.getCharacterId(), msg.getNewName(), msg.getOldName(), msg.getLastNameChangeOnly(), msg.getRequestedBy(), nullptr); + break; + } + case constcrc("UnloadedPlayerMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + UnloadedPlayerMessage msg(ri); + + unloadCharacter(msg.getPlayerId(),sourceGameServer); + break; + } + case constcrc("MoveToPlayer") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > msg(ri); + + moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, false, false); + break; + } + case constcrc("MoveToPlayerBankMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > msg(ri); + + moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, true, false); + break; + } + case constcrc("MoveToPlayerDatapadMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, int> > msg(ri); + + moveToPlayer(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second, false, true); + break; + } + case constcrc("FixLoadWith") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, int> > msg(ri); + + fixLoadWith(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second); + break; + } + case constcrc("ClusterShutdownMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); + + m_clusterShuttingDown = msg.getValue(); + break; + } + case constcrc("StartSaveMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); + + userRequestedSave(sourceGameServer, msg.getValue()); + break; + } + case constcrc("RestoreHouseMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > msg(ri); + + restoreHouse(msg.getValue().first, msg.getValue().second); + break; + } + case constcrc("RestoreCharacterMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > msg(ri); + + restoreCharacter(msg.getValue().first, msg.getValue().second); + break; + } + case constcrc("UndeleteItemMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > msg(ri); + + LOG("CustomerService", ("undeleteItem %s request from %s", msg.getValue().first.getValueString().c_str(), msg.getValue().second.c_str())); + undeleteItem(msg.getValue().first, msg.getValue().second); + break; + } + case constcrc("MoveToPlayerMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, std::string> > msg(ri); + + LOG("CustomerService", ("moveToPlayer %s, %s request from %s", msg.getValue().first.first.getValueString().c_str(), msg.getValue().first.second.getValueString().c_str(), msg.getValue().second.c_str())); + moveToPlayer(msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second); + break; + } + case constcrc("CentralRequestSave") : + { + centralRequestedSave(); + break; + } + case constcrc("PlanetRequestSave") : + { + planetRequestedSave(); + break; + } + case constcrc("AddResourceTypeMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AddResourceTypeMessage msg(ri); + handleAddResourceTypeMessage(sourceGameServer, msg); + break; + } + case constcrc("BountyHunterTargetMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + BountyHunterTargetMessage msg(ri); + getSnapshotForServer(sourceGameServer).handleBountyHunterTargetMessage(msg); + break; + } + case constcrc("CMCreateAuctionMessage") : + case constcrc("CMCreateAuctionBidMessage") : + case constcrc("CMCreateLocationMessage") : + case constcrc("CMUpdateAuctionMessage") : + case constcrc("CMUpdateLocationMessage") : + case constcrc("CMDeleteAuctionMessage") : + case constcrc("CMDeleteLocationMessage") : + { + const CommoditiesServerConnection * commConnection = dynamic_cast(&source); + uint32 commServerId = 0; + if (commConnection) + commServerId = commConnection->getProcessId(); + + getCommoditiesSnapshot(commServerId).handleCommoditiesDataMessage(message); + break; + } + case constcrc("LoadCommodities") : + { + if (m_commoditiesSnapshot) + { + m_commoditiesSnapshot->startLoadAfterSaveComplete(); + if (!isSaveInProgress()) + m_startSaveWhenPossible = true; + } + else + { + startLoadCommodities(); + } + break; + } + case constcrc("GetMoneyFromOfflineObjectMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GetMoneyFromOfflineObjectMessage msg(ri); + getMoneyFromOfflineObject(sourceGameServer, msg.getSourceObject(), msg.getAmount(), msg.getReplyTo(), msg.getSuccessCallback(), msg.getFailCallback(), msg.getPackedDictionary()); + break; + } + case constcrc("PurgeCompleteMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage msg(ri); + handlePurgeCompleteMessage(sourceGameServer, msg.getValue()); + break; + } + case constcrc("DBCSRequestMessage" ) : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + DBCSRequestMessage const msg( ri ); + handleCSRequest( msg ); + break; + } + case constcrc("UndeleteItemForCsMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, std::string>, bool> > undeleteRequest(ri); + handleCsUndelete(undeleteRequest.getValue().first.first.first, + undeleteRequest.getValue().first.first.second, + undeleteRequest.getValue().first.second, + undeleteRequest.getValue().second); + + break; + } + default : + { + DEBUG_REPORT_LOG(true,("Unrecognized message recieved by Persister.\n")); + break; } - } - else if (message.isType("GetMoneyFromOfflineObjectMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GetMoneyFromOfflineObjectMessage msg(ri); - getMoneyFromOfflineObject(sourceGameServer, msg.getSourceObject(), msg.getAmount(), msg.getReplyTo(), msg.getSuccessCallback(), msg.getFailCallback(), msg.getPackedDictionary()); - } - else if (message.isType("PurgeCompleteMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage msg(ri); - handlePurgeCompleteMessage(sourceGameServer, msg.getValue()); - } - else if( message.isType("DBCSRequestMessage" ) ) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - DBCSRequestMessage const msg( ri ); - handleCSRequest( msg ); - } - else if (message.isType("UndeleteItemForCsMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, std::string>, bool> > undeleteRequest(ri); - handleCsUndelete(undeleteRequest.getValue().first.first.first, - undeleteRequest.getValue().first.first.second, - undeleteRequest.getValue().first.second, - undeleteRequest.getValue().second); - } - else - { - DEBUG_REPORT_LOG(true,("Unrecognized message recieved by Persister.\n")); } } diff --git a/engine/server/library/serverGame/src/shared/core/ChatServerConnection.cpp b/engine/server/library/serverGame/src/shared/core/ChatServerConnection.cpp index cede945a..50d20614 100755 --- a/engine/server/library/serverGame/src/shared/core/ChatServerConnection.cpp +++ b/engine/server/library/serverGame/src/shared/core/ChatServerConnection.cpp @@ -25,7 +25,7 @@ #include "sharedNetwork/NetworkSetupData.h" #include "sharedObject/NetworkIdManager.h" -#include "sharedNetworkMessages/VoiceChatMiscMessages.h" +#include "sharedFoundation/CrcConstexpr.hpp" //----------------------------------------------------------------------- @@ -60,114 +60,106 @@ void ChatServerConnection::onReceive(const Archive::ByteStream &message) GameNetworkMessage msg(ri); Archive::ReadIterator cri = message.begin(); + + const uint32 messageType = msg.getType(); - if (msg.isType("ChatOnCreateRoom")) - { - ChatOnCreateRoom chat(cri); - GroupObject::onChatRoomCreate(chat.getRoomData().path); - GuildInterface::onChatRoomCreate(chat.getRoomData().path); - CityInterface::onChatRoomCreate(chat.getRoomData().path); - } - else if (msg.isType("ChatOnRequestLog")) - { - ChatOnRequestLog chatOnRequestLog(cri); - - ReportManager::handleMessage(chatOnRequestLog); - } - else if (msg.isType("ChatAvatarConnected")) - { - GenericValueTypeMessage m(cri); - Object *o = NetworkIdManager::getObjectById(m.getValue()); - if (o) + switch(messageType) { + case constcrc("ChatOnCreateRoom") : { - ServerObject *so = o->asServerObject(); - if (so && so->isAuthoritative()) + ChatOnCreateRoom chat(cri); + GroupObject::onChatRoomCreate(chat.getRoomData().path); + GuildInterface::onChatRoomCreate(chat.getRoomData().path); + CityInterface::onChatRoomCreate(chat.getRoomData().path); + break; + } + case constcrc("ChatOnRequestLog") : + { + ChatOnRequestLog chatOnRequestLog(cri); + + ReportManager::handleMessage(chatOnRequestLog); + break; + } + case constcrc("ChatAvatarConnected") : + { + GenericValueTypeMessage m(cri); + Object *o = NetworkIdManager::getObjectById(m.getValue()); + if (o) { - CreatureObject *co = so->asCreatureObject(); - if (co) + ServerObject *so = o->asServerObject(); + if (so && so->isAuthoritative()) { - if (co->getGuildId()) + CreatureObject *co = so->asCreatureObject(); + if (co) { - GuildInterface::enterGuildChatRoom(*co); - GuildInterface::enterGuildVoiceChatRoom(*co); + if (co->getGuildId()) + { + GuildInterface::enterGuildChatRoom(*co); + GuildInterface::enterGuildVoiceChatRoom(*co); + } + + std::vector const & cityIds = CityInterface::getCitizenOfCityId(co->getNetworkId()); + if (!cityIds.empty()) + CityInterface::enterCityChatRoom(cityIds.front(), *co); + } + GameScriptObject * gso = so->getScriptObject(); + if(gso) + { + ScriptParams params; + gso->trigAllScripts(Scripting::TRIG_CHAT_ON_LOGIN, params); + } + } + } + break; + } + case constcrc("ChatAvatarRenamed") : + { + GenericValueTypeMessage > const m(cri); + + // refresh the friends and/or ignore list of any character that + // has the renamed avatar in his friends and/or ignore list + std::string const oldName(NameManager::normalizeName(m.getValue().first)); + std::string const newName(NameManager::normalizeName(m.getValue().second)); + + std::set const &players = PlayerObject::getAllPlayerObjects(); + if (!players.empty()) + { + std::set::const_iterator i; + for (i = players.begin(); i != players.end(); ++i) + { + PlayerObject const * const playerObject = *i; + if (!playerObject->isAuthoritative()) + continue; + + CreatureObject const * const creatureObject = playerObject->getCreatureObject(); + if (!creatureObject || !creatureObject->isAuthoritative() || !creatureObject->getClient()) + continue; + + if (playerObject->isFriend(oldName)) + { + // refresh friends list in 30 seconds + MessageToQueue::getInstance().sendMessageToC(playerObject->getNetworkId(), + "C++RequestChatFriendsList", + "", + 30, + false); + + Chat::sendSystemMessage(*creatureObject, Unicode::narrowToWide(FormattedString<2048>().sprintf("%s on your friends list has been renamed to %s. If your friends list has not been updated with the new name in about 30 seconds, you can relog to refresh your friends list.", oldName.c_str(), newName.c_str())), Unicode::emptyString); } - std::vector const & cityIds = CityInterface::getCitizenOfCityId(co->getNetworkId()); - if (!cityIds.empty()) - CityInterface::enterCityChatRoom(cityIds.front(), *co); - } - GameScriptObject * gso = so->getScriptObject(); - if(gso) - { - ScriptParams params; - gso->trigAllScripts(Scripting::TRIG_CHAT_ON_LOGIN, params); + if (playerObject->isIgnoring(oldName)) + { + // refresh ignore list in 30 seconds + MessageToQueue::getInstance().sendMessageToC(playerObject->getNetworkId(), + "C++RequestChatIgnoreList", + "", + 30, + false); + + Chat::sendSystemMessage(*creatureObject, Unicode::narrowToWide(FormattedString<2048>().sprintf("%s on your ignore list has been renamed to %s. If your ignore list has not been updated with the new name in about 30 seconds, you can relog to refresh your ignore list.", oldName.c_str(), newName.c_str())), Unicode::emptyString); + } } } + break; } } - else if (msg.isType("ChatAvatarRenamed")) - { - GenericValueTypeMessage > const m(cri); - - // refresh the friends and/or ignore list of any character that - // has the renamed avatar in his friends and/or ignore list - std::string const oldName(NameManager::normalizeName(m.getValue().first)); - std::string const newName(NameManager::normalizeName(m.getValue().second)); - - std::set const &players = PlayerObject::getAllPlayerObjects(); - if (!players.empty()) - { - std::set::const_iterator i; - for (i = players.begin(); i != players.end(); ++i) - { - PlayerObject const * const playerObject = *i; - if (!playerObject->isAuthoritative()) - continue; - - CreatureObject const * const creatureObject = playerObject->getCreatureObject(); - if (!creatureObject || !creatureObject->isAuthoritative() || !creatureObject->getClient()) - continue; - - if (playerObject->isFriend(oldName)) - { - // refresh friends list in 30 seconds - MessageToQueue::getInstance().sendMessageToC(playerObject->getNetworkId(), - "C++RequestChatFriendsList", - "", - 30, - false); - - Chat::sendSystemMessage(*creatureObject, Unicode::narrowToWide(FormattedString<2048>().sprintf("%s on your friends list has been renamed to %s. If your friends list has not been updated with the new name in about 30 seconds, you can relog to refresh your friends list.", oldName.c_str(), newName.c_str())), Unicode::emptyString); - } - - if (playerObject->isIgnoring(oldName)) - { - // refresh ignore list in 30 seconds - MessageToQueue::getInstance().sendMessageToC(playerObject->getNetworkId(), - "C++RequestChatIgnoreList", - "", - 30, - false); - - Chat::sendSystemMessage(*creatureObject, Unicode::narrowToWide(FormattedString<2048>().sprintf("%s on your ignore list has been renamed to %s. If your ignore list has not been updated with the new name in about 30 seconds, you can relog to refresh your ignore list.", oldName.c_str(), newName.c_str())), Unicode::emptyString); - } - } - } - } - else if (msg.isType(VoiceChatOnGetChannel::cms_name)) - { - processVoiceChatOnGetChannel(message); - } -} - -//----------------------------------------------------------------------- - -void ChatServerConnection::processVoiceChatOnGetChannel(const Archive::ByteStream & message) -{ - Archive::ReadIterator ri = message.begin(); - VoiceChatOnGetChannel response(ri); - - GroupObject::onVoiceChatRoomCreate(response.getRoomName()); - GuildInterface::onVoiceChatRoomCreate(response.getRoomName()); - //TODO: guild -} +} \ No newline at end of file diff --git a/engine/server/library/serverGame/src/shared/core/ChatServerConnection.h b/engine/server/library/serverGame/src/shared/core/ChatServerConnection.h index 6280e1cd..e077d6dc 100755 --- a/engine/server/library/serverGame/src/shared/core/ChatServerConnection.h +++ b/engine/server/library/serverGame/src/shared/core/ChatServerConnection.h @@ -23,9 +23,6 @@ public: private: ChatServerConnection & operator = (const ChatServerConnection & rhs); ChatServerConnection(const ChatServerConnection & source); - - void processVoiceChatOnGetChannel(const Archive::ByteStream & message); - }; //----------------------------------------------------------------------- diff --git a/engine/server/library/serverGame/src/shared/core/Client.cpp b/engine/server/library/serverGame/src/shared/core/Client.cpp index cdef65db..87de89f2 100755 --- a/engine/server/library/serverGame/src/shared/core/Client.cpp +++ b/engine/server/library/serverGame/src/shared/core/Client.cpp @@ -128,6 +128,8 @@ #include "sharedSkillSystem/SkillManager.h" #include "unicodeArchive/UnicodeArchive.h" +#include "sharedFoundation/CrcConstexpr.hpp" + namespace ClientNamespace { // list of object types, radial menu action permission @@ -679,422 +681,426 @@ void Client::receiveClientMessage(const GameNetworkMessage & message) //----------------------------------------------------------------- - if (message.isType("ShipUpdateTransformMessage")) - { - Archive::ReadIterator readIterator = static_cast(message).getByteStream().begin(); - ShipUpdateTransformMessage const shipUpdateTransformMessage(readIterator); - - for (std::vector::const_iterator i = m_controlledObjects.begin(); i != m_controlledObjects.end(); ++i) + const uint32 messageType = message.getType(); + + switch(messageType) { + case constcrc("ShipUpdateTransformMessage") : { - ShipObject * const ship = (*i)->asShipObject(); - if (ship) + Archive::ReadIterator readIterator = static_cast(message).getByteStream().begin(); + ShipUpdateTransformMessage const shipUpdateTransformMessage(readIterator); + + for (std::vector::const_iterator i = m_controlledObjects.begin(); i != m_controlledObjects.end(); ++i) { - PlayerShipController * const playerShipController = safe_cast(ship->getController()); - if (playerShipController) - playerShipController->receiveTransform(shipUpdateTransformMessage); - } - } - } - - //---------------------------------------------------------------------- - - else if (message.isType("CreateProjectileMessage")) - { - Archive::ReadIterator readIterator = static_cast(message).getByteStream().begin(); - CreateProjectileMessage const createProjectileMessage(readIterator); - - // pilots can fire from non-turrets, gunners can fire their turret - ServerObject * const characterObject = getCharacterObject(); - if (characterObject) - { - ServerObject * const containedBy = safe_cast(ContainerInterface::getContainedByObject(*characterObject)); - if (containedBy) - { - SlottedContainer const * const slottedContainer = ContainerInterface::getSlottedContainer(*containedBy); - ShipObject * const shipObject = ShipObject::getContainingShipObject(containedBy); - - if ( (shipObject != nullptr) - && (slottedContainer != nullptr) - && !shipObject->hasCondition(TangibleObject::C_docking)) + ShipObject * const ship = (*i)->asShipObject(); + if (ship) { - bool shotOk = false; + PlayerShipController * const playerShipController = safe_cast(ship->getController()); + if (playerShipController) + playerShipController->receiveTransform(shipUpdateTransformMessage); + } + } + break; + } - int const weaponIndex = createProjectileMessage.getWeaponIndex(); - if (weaponIndex >= 0 && weaponIndex < ShipChassisSlotType::cms_numWeaponIndices) + //---------------------------------------------------------------------- + + case constcrc("CreateProjectileMessage") : + { + Archive::ReadIterator readIterator = static_cast(message).getByteStream().begin(); + CreateProjectileMessage const createProjectileMessage(readIterator); + + // pilots can fire from non-turrets, gunners can fire their turret + ServerObject * const characterObject = getCharacterObject(); + if (characterObject) + { + ServerObject * const containedBy = safe_cast(ContainerInterface::getContainedByObject(*characterObject)); + if (containedBy) + { + SlottedContainer const * const slottedContainer = ContainerInterface::getSlottedContainer(*containedBy); + ShipObject * const shipObject = ShipObject::getContainingShipObject(containedBy); + + if ( (shipObject != nullptr) + && (slottedContainer != nullptr) + && !shipObject->hasCondition(TangibleObject::C_docking)) { - Container::ContainerErrorCode err = Container::CEC_Success; - if (shipObject->isTurret(weaponIndex)) + bool shotOk = false; + + int const weaponIndex = createProjectileMessage.getWeaponIndex(); + if (weaponIndex >= 0 && weaponIndex < ShipChassisSlotType::cms_numWeaponIndices) { - if ( slottedContainer->getObjectInSlot(ShipSlotIdManager::getPobShipGunnerSlotId(weaponIndex), err) == characterObject->getNetworkId() - || slottedContainer->getObjectInSlot(ShipSlotIdManager::getShipGunnerSlotId(weaponIndex), err) == characterObject->getNetworkId()) - shotOk = true; // gunner firing his turret + Container::ContainerErrorCode err = Container::CEC_Success; + if (shipObject->isTurret(weaponIndex)) + { + if ( slottedContainer->getObjectInSlot(ShipSlotIdManager::getPobShipGunnerSlotId(weaponIndex), err) == characterObject->getNetworkId() + || slottedContainer->getObjectInSlot(ShipSlotIdManager::getShipGunnerSlotId(weaponIndex), err) == characterObject->getNetworkId()) + shotOk = true; // gunner firing his turret + } + else + { + if ( slottedContainer->getObjectInSlot(ShipSlotIdManager::getShipPilotSlotId(), err) == characterObject->getNetworkId() + || slottedContainer->getObjectInSlot(ShipSlotIdManager::getPobShipPilotSlotId(), err) == characterObject->getNetworkId()) + shotOk = true; // pilot firing non-turret + } } - else + + // only gods can fire while invulnerable + if (shipObject->isInvulnerable() && !isGod()) + shotOk = false; + + if (shotOk) { - if ( slottedContainer->getObjectInSlot(ShipSlotIdManager::getShipPilotSlotId(), err) == characterObject->getNetworkId() - || slottedContainer->getObjectInSlot(ShipSlotIdManager::getPobShipPilotSlotId(), err) == characterObject->getNetworkId()) - shotOk = true; // pilot firing non-turret + shipObject->enqueueFireShotClient( + *this, + weaponIndex, + createProjectileMessage.getTransform_p(), + createProjectileMessage.getTargetedComponent(), + createProjectileMessage.getSyncStampLong()); } } + } + } + break; + } - // only gods can fire while invulnerable - if (shipObject->isInvulnerable() && !isGod()) - shotOk = false; + //---------------------------------------------------------------------- - if (shotOk) + case constcrc("CmdSceneReady") : + { + m_isReady = true; + primaryControlledObject->onClientReady(this); + break; + } + + //---------------------------------------------------------------------- + + case constcrc("SetCombatSpamFilter") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const msg(ri); + m_combatSpamFilter = static_cast(msg.getValue()); + break; + } + + //---------------------------------------------------------------------- + + case constcrc("SetCombatSpamRangeFilter") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const msg(ri); + m_combatSpamRangeSquaredFilter = sqr(msg.getValue()); + break; + } + + //---------------------------------------------------------------------- + + case constcrc("SetFurnitureRotationDegree") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const msg(ri); + m_furnitureRotationDegree = msg.getValue(); + break; + } + + //---------------------------------------------------------------------- + + case constcrc("GcwRegionsReq") : + { + GenericValueTypeMessage, float> > > > const rsp("GcwRegionsRsp", Pvp::getGcwScoreCategoryRegions()); + send(rsp, true); + + GenericValueTypeMessage > > const rsp2("GcwGroupsRsp", Pvp::getGcwScoreCategoryGroups()); + send(rsp2, true); + break; + } + + //---------------------------------------------------------------------- + + case constcrc("SetJediSlotInfo") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > const msg(ri); + + // this comes from the client (via the LoginServer) so should not be trusted; + // we cache them here to do preliminary checks to avoid unnecessarily sending + // commands to the LoginServer (assuming the values haven't been hacked on the + // client); when we do send the commands to the LoginServer, we'll check again there + m_hasUnoccupiedJediSlot = msg.getValue().first; + m_isJediSlotCharacter = msg.getValue().second; + break; + } + + //---------------------------------------------------------------------- + + case constcrc("RotateFurnitureSetQuaternion") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, std::pair > > > const msg(ri); + + CreatureObject * creatureOwner = safe_cast(getCharacterObject()); + if (creatureOwner && creatureOwner->isAuthoritative()) + { + ServerObject const * target = ServerWorld::findObjectByNetworkId(msg.getValue().first); + if (target && target->isAuthoritative()) + { + static uint32 const commandHash = Crc::normalizeAndCalculate("rotateFurniture"); + const Command &command = CommandTable::getCommand(commandHash); + if (!command.isNull()) { - shipObject->enqueueFireShotClient( - *this, - weaponIndex, - createProjectileMessage.getTransform_p(), - createProjectileMessage.getTargetedComponent(), - createProjectileMessage.getSyncStampLong()); + // for obfuscation so players won't manually send us this command + Unicode::String params = Unicode::narrowToWide(FormattedString<512>().sprintf("(^-,=+_)internal_use_only_%s_quaternion(,+-=_^) %.10f %.10f %.10f %.10f %s", creatureOwner->getNetworkId().getValueString().c_str(), msg.getValue().second.first.first, msg.getValue().second.first.second, msg.getValue().second.second.first, msg.getValue().second.second.second, msg.getValue().first.getValueString().c_str())); + creatureOwner->commandQueueEnqueue(command, target->getNetworkId(), params, 0, false, static_cast(Command::CP_Default), true); } } } + break; } - } - //---------------------------------------------------------------------- + //---------------------------------------------------------------------- - else if(message.isType("CmdSceneReady")) - { - m_isReady = true; - primaryControlledObject->onClientReady(this); - } - - //---------------------------------------------------------------------- - - else if(message.isType("SetCombatSpamFilter")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const msg(ri); - m_combatSpamFilter = static_cast(msg.getValue()); - } - - //---------------------------------------------------------------------- - - else if(message.isType("SetCombatSpamRangeFilter")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const msg(ri); - m_combatSpamRangeSquaredFilter = sqr(msg.getValue()); - } - - //---------------------------------------------------------------------- - - else if(message.isType("SetFurnitureRotationDegree")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const msg(ri); - m_furnitureRotationDegree = msg.getValue(); - } - - //---------------------------------------------------------------------- - - else if(message.isType("GcwRegionsReq")) - { - GenericValueTypeMessage, float> > > > const rsp("GcwRegionsRsp", Pvp::getGcwScoreCategoryRegions()); - send(rsp, true); - - GenericValueTypeMessage > > const rsp2("GcwGroupsRsp", Pvp::getGcwScoreCategoryGroups()); - send(rsp2, true); - } - - //---------------------------------------------------------------------- - - else if(message.isType("SetJediSlotInfo")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > const msg(ri); - - // this comes from the client (via the LoginServer) so should not be trusted; - // we cache them here to do preliminary checks to avoid unnecessarily sending - // commands to the LoginServer (assuming the values haven't been hacked on the - // client); when we do send the commands to the LoginServer, we'll check again there - m_hasUnoccupiedJediSlot = msg.getValue().first; - m_isJediSlotCharacter = msg.getValue().second; - } - - //---------------------------------------------------------------------- - - else if(message.isType("RotateFurnitureSetQuaternion")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, std::pair > > > const msg(ri); - - CreatureObject * creatureOwner = safe_cast(getCharacterObject()); - if (creatureOwner && creatureOwner->isAuthoritative()) + case constcrc("SetLfgInterests") : { - ServerObject const * target = ServerWorld::findObjectByNetworkId(msg.getValue().first); - if (target && target->isAuthoritative()) + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const msg(ri); + + PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(safe_cast(getCharacterObject())); + if (playerObject) { - static uint32 const commandHash = Crc::normalizeAndCalculate("rotateFurniture"); - const Command &command = CommandTable::getCommand(commandHash); - if (!command.isNull()) + std::map const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData(); + std::map::const_iterator iterFind = connectedCharacterLfgData.find(getCharacterObjectId()); + if (iterFind != connectedCharacterLfgData.end()) { - // for obfuscation so players won't manually send us this command - Unicode::String params = Unicode::narrowToWide(FormattedString<512>().sprintf("(^-,=+_)internal_use_only_%s_quaternion(,+-=_^) %.10f %.10f %.10f %.10f %s", creatureOwner->getNetworkId().getValueString().c_str(), msg.getValue().second.first.first, msg.getValue().second.first.second, msg.getValue().second.second.first, msg.getValue().second.second.second, msg.getValue().first.getValueString().c_str())); - creatureOwner->commandQueueEnqueue(command, target->getNetworkId(), params, 0, false, static_cast(Command::CP_Default), true); + BitArray lfgInterests = msg.getValue(); + + MatchMakingId const & id = playerObject->getMatchMakingCharacterProfileId(); + if (id.isBitSet(MatchMakingId::B_lookingForGroup)) + LfgDataTable::setBit("lfg", lfgInterests); + else + LfgDataTable::clearBit("lfg", lfgInterests); + + if (id.isBitSet(MatchMakingId::B_helper)) + LfgDataTable::setBit("helper", lfgInterests); + else + LfgDataTable::clearBit("helper", lfgInterests); + + if (id.isBitSet(MatchMakingId::B_rolePlay)) + LfgDataTable::setBit("rp", lfgInterests); + else + LfgDataTable::clearBit("rp", lfgInterests); + + if (id.isBitSet(MatchMakingId::B_lookingForWork)) + LfgDataTable::setBit("lfw", lfgInterests); + else + LfgDataTable::clearBit("lfw", lfgInterests); + + ServerUniverse::setConnectedCharacterInterestsData(getCharacterObjectId(), lfgInterests); } } + break; } - } - //---------------------------------------------------------------------- + //---------------------------------------------------------------------- - else if(message.isType("SetLfgInterests")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const msg(ri); - - PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(safe_cast(getCharacterObject())); - if (playerObject) + case constcrc("RequestGroundObjectPlacement") : { - std::map const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData(); - std::map::const_iterator iterFind = connectedCharacterLfgData.find(getCharacterObjectId()); - if (iterFind != connectedCharacterLfgData.end()) + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, std::pair > > > const msg(ri); + + ServerObject * const target = safe_cast(NetworkIdManager::getObjectById (msg.getValue().first)); + GameScriptObject * const scriptObject = target ? target->getScriptObject() : 0; + + if (!scriptObject) { - BitArray lfgInterests = msg.getValue(); - - MatchMakingId const & id = playerObject->getMatchMakingCharacterProfileId(); - if (id.isBitSet(MatchMakingId::B_lookingForGroup)) - LfgDataTable::setBit("lfg", lfgInterests); - else - LfgDataTable::clearBit("lfg", lfgInterests); - - if (id.isBitSet(MatchMakingId::B_helper)) - LfgDataTable::setBit("helper", lfgInterests); - else - LfgDataTable::clearBit("helper", lfgInterests); - - if (id.isBitSet(MatchMakingId::B_rolePlay)) - LfgDataTable::setBit("rp", lfgInterests); - else - LfgDataTable::clearBit("rp", lfgInterests); - - if (id.isBitSet(MatchMakingId::B_lookingForWork)) - LfgDataTable::setBit("lfw", lfgInterests); - else - LfgDataTable::clearBit("lfw", lfgInterests); - - ServerUniverse::setConnectedCharacterInterestsData(getCharacterObjectId(), lfgInterests); + return; } + + int menuType = msg.getValue().second.first.first; + Vector loc(msg.getValue().second.first.second, msg.getValue().second.second.first, msg.getValue().second.second.second); + ScriptParams params; + params.addParam (getCharacterObjectId()); + params.addParam (menuType); + params.addParam (loc.x); + params.addParam (loc.y); + params.addParam (loc.z); + + IGNORE_RETURN (scriptObject->trigAllScripts(Scripting::TRIG_GROUND_TARGET_LOC, params)); + break; } - } + //---------------------------------------------------------------------- - //---------------------------------------------------------------------- - - else if(message.isType("RequestGroundObjectPlacement")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, std::pair > > > const msg(ri); - - ServerObject * const target = safe_cast(NetworkIdManager::getObjectById (msg.getValue().first)); - GameScriptObject * const scriptObject = target ? target->getScriptObject() : 0; - - if (!scriptObject) + case constcrc("ShowBackpack") : { - return; + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > const msg(ri); + PlayerObject * player = dynamic_cast(NetworkIdManager::getObjectById (msg.getValue().first)); + + if(player) + player->modifyShowBackpack(msg.getValue().second); + + break; } - - int menuType = msg.getValue().second.first.first; - Vector loc(msg.getValue().second.first.second, msg.getValue().second.second.first, msg.getValue().second.second.second); - ScriptParams params; - params.addParam (getCharacterObjectId()); - params.addParam (menuType); - params.addParam (loc.x); - params.addParam (loc.y); - params.addParam (loc.z); + //---------------------------------------------------------------------- - IGNORE_RETURN (scriptObject->trigAllScripts(Scripting::TRIG_GROUND_TARGET_LOC, params)); - } - //---------------------------------------------------------------------- - - else if(message.isType("ShowBackpack")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > const msg(ri); - PlayerObject * player = dynamic_cast(NetworkIdManager::getObjectById (msg.getValue().first)); - - if(player) - player->modifyShowBackpack(msg.getValue().second); - - } - //---------------------------------------------------------------------- - - else if(message.isType("ShowHelmet")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > const msg(ri); - PlayerObject * player = dynamic_cast(NetworkIdManager::getObjectById (msg.getValue().first)); - - if(player) - player->modifyShowHelmet(msg.getValue().second); - - } - //---------------------------------------------------------------------- - - else if(message.isType("SetWaypointColor")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > const msg(ri); - - if ((msg.getValue().second == "blue") || (msg.getValue().second == "green") || (msg.getValue().second == "orange") || (msg.getValue().second == "yellow") || (msg.getValue().second == "purple") || (msg.getValue().second == "white")) + case constcrc("ShowHelmet") : { - Waypoint w = Waypoint::getWaypointById(msg.getValue().first); - if (w.isValid()) - { - w.setColor(Waypoint::getColorIdByName(msg.getValue().second)); - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > const msg(ri); + PlayerObject * player = dynamic_cast(NetworkIdManager::getObjectById (msg.getValue().first)); + + if(player) + player->modifyShowHelmet(msg.getValue().second); + + break; } - } + //---------------------------------------------------------------------- - //---------------------------------------------------------------------- - - else if (message.isType (ObjectMenuSelectMessage::MESSAGE_TYPE)) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - const ObjectMenuSelectMessage m (ri); - ServerObject * const target = safe_cast(NetworkIdManager::getObjectById (m.getNetworkId())); - GameScriptObject * const scriptObject = target ? target->getScriptObject() : 0; - Object * const targetContainedBy = target ? ContainerInterface::getContainedByObject(*target) : nullptr; - const int menuType = m.getSelectedItemId(); - - static int examineMenuType = RadialMenuManager::getMenuTypeByName("EXAMINE"); - static int tradeMenuType = RadialMenuManager::getMenuTypeByName("TRADE_START"); - - CreatureObject* cobj = dynamic_cast(primaryControlledObject); - if (cobj && menuType != examineMenuType && menuType != tradeMenuType) + case constcrc("SetWaypointColor") : { - CreatureController* const controller = cobj->getCreatureController(); - if (controller && controller->getSecureTrade()) - { - controller->getSecureTrade()->cancelTrade(*cobj); - DEBUG_REPORT_LOG (true, ("Client ObjectMenuSelectMessage [%d] for [%s] canceling trade.\n", menuType, cobj->getNetworkId ().getValueString ().c_str ())); - } - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > const msg(ri); - if (!scriptObject) - { - DEBUG_REPORT_LOG (true, ("Received an object menu select message from player %s for object %s, which does not exist or lacks a GameScriptObject.", m_characterObjectId.getValueString().c_str(),m.getNetworkId().getValueString().c_str())); - return; - } - - NOT_NULL(target); - - float range = 0.0f; - if (RadialMenuManager::getRangeForMenuType(menuType, range)) - { - Container::ContainerErrorCode errorCode = Container::CEC_Success; - if (!target->isAuthoritative()) + if ((msg.getValue().second == "blue") || (msg.getValue().second == "green") || (msg.getValue().second == "orange") || (msg.getValue().second == "yellow") || (msg.getValue().second == "purple") || (msg.getValue().second == "white")) { - GenericValueTypeMessage > const rssMessage( - "RequestSameServer", - std::make_pair( - ContainerInterface::getTopmostContainer(*primaryControlledObject)->getNetworkId(), - ContainerInterface::getTopmostContainer(*target)->getNetworkId())); - GameServer::getInstance().sendToPlanetServer(rssMessage); - errorCode = Container::CEC_TryAgain; - } - else if (menuType != examineMenuType && targetContainedBy && targetContainedBy->asServerObject() && ( targetContainedBy->asServerObject()->getGameObjectType() == SharedObjectTemplate::GOT_chronicles_quest_holocron || targetContainedBy->asServerObject()->getGameObjectType() == SharedObjectTemplate::GOT_chronicles_quest_holocron_recipe ) ) - { - // Can only examine items that are contained in a holocron. - errorCode = Container::CEC_NoPermission; - } - else if (primaryControlledObject->canManipulateObject(*target, false, false, false, range, errorCode) - || ClientNamespace::canManipulateObjectExceptionCheck(*target, menuType, errorCode)) - { - ScriptParams params; - params.addParam (getCharacterObjectId()); - params.addParam (menuType); - - if (cobj && cobj->getObjVars().hasItem("cheater")) + Waypoint w = Waypoint::getWaypointById(msg.getValue().first); + if (w.isValid()) { - std::string menuDesc = "unknown"; - bool tmp; - IGNORE_RETURN(RadialMenuManager::getCommandForMenuType(menuType, menuDesc, tmp)); - LOG("CustomerService",("SuspectedCheaterLog: %s has used a radial menu on object %s. Menu item %d (%s).", - PlayerObject::getAccountDescription(cobj).c_str(), - m.getNetworkId().getValueString().c_str(), - menuType, - menuDesc.c_str() )); - } - - IGNORE_RETURN (scriptObject->trigAllScripts(Scripting::TRIG_OBJECT_MENU_SELECT, params)); - } - if (errorCode != Container::CEC_Success) - ContainerInterface::sendContainerMessageToClient(*primaryControlledObject, errorCode); - } - else - { - DEBUG_REPORT_LOG(true, ("Received a message type %d that had no range in data (radial_menu.tab)\n", menuType)); - } - } - - //---------------------------------------------------------------------- - - else if(message.isType("ConGenericMessage")) - { - - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ConGenericMessage c(ri); - if (isGod()) - { - LOG("CustomerService",("Avatar:%s executing command: %s", PlayerObject::getAccountDescription(getCharacterObjectId()).c_str(), c.getMsg().c_str())); - ConsoleMgr::processString(c.getMsg(), this, c.getMsgId()); - } - else - { - //Non-god user tried to use a console command - if (m_primaryControlledObject.getObject()) - { - LOG("CustomerService", ("CheatChannel:%s tried to execute a console command but they are not a god", - PlayerObject::getAccountDescription(m_primaryControlledObject.getObject()->getNetworkId()).c_str())); - ConsoleMgr::broadcastString("Only god users can execute console commands.", this, c.getMsgId()); - } - - } - } - - //----------------------------------------------------------------- - - else if(message.isType("ObjControllerMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ObjControllerMessage o(ri); - bool appended = false; - - // check to make sure the controller message is allowed from the client - bool allowFromClient = ControllerMessageFactory::allowFromClient(o.getMessage()); - - // log as a possible hack - if (!allowFromClient) - LOG("CustomerService", ("UnauthorizedControllerMessage: Player %s sent an unauthorized controller message %d for object %s.", PlayerObject::getAccountDescription(getCharacterObjectId()).c_str(), o.getMessage(), o.getNetworkId().getValueString().c_str())); - - // do we allow the controller message to get executed? - if (allowFromClient || isGod() || !ConfigServerGame::getEnableClientControllerMessageCheck()) - { - ServerObject * target = findControlledObject(o.getNetworkId()); - if(target !=0) - { - // apply the controller message - ServerController * controller = dynamic_cast(target->getController()); - if (controller != nullptr) - { - uint32 flags = o.getFlags(); - flags &= ~GameControllerMessageFlags::SOURCE_REMOTE; - flags |= GameControllerMessageFlags::SOURCE_REMOTE_CLIENT; - controller->appendMessage(o.getMessage(), o.getValue(), o.getData(), flags); - appended = true; + w.setColor(Waypoint::getColorIdByName(msg.getValue().second)); } } - else if (isGod()) - { - target = ServerWorld::findObjectByNetworkId(o.getNetworkId()); + + break; + } - if (target) + //---------------------------------------------------------------------- + + case ObjectMenuSelectMessage::MESSAGE_TYPE : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + const ObjectMenuSelectMessage m (ri); + ServerObject * const target = safe_cast(NetworkIdManager::getObjectById (m.getNetworkId())); + GameScriptObject * const scriptObject = target ? target->getScriptObject() : 0; + Object * const targetContainedBy = target ? ContainerInterface::getContainedByObject(*target) : nullptr; + const int menuType = m.getSelectedItemId(); + + static int examineMenuType = RadialMenuManager::getMenuTypeByName("EXAMINE"); + static int tradeMenuType = RadialMenuManager::getMenuTypeByName("TRADE_START"); + + CreatureObject* cobj = dynamic_cast(primaryControlledObject); + if (cobj && menuType != examineMenuType && menuType != tradeMenuType) + { + CreatureController* const controller = cobj->getCreatureController(); + if (controller && controller->getSecureTrade()) { + controller->getSecureTrade()->cancelTrade(*cobj); + DEBUG_REPORT_LOG (true, ("Client ObjectMenuSelectMessage [%d] for [%s] canceling trade.\n", menuType, cobj->getNetworkId ().getValueString ().c_str ())); + } + } + + if (!scriptObject) + { + DEBUG_REPORT_LOG (true, ("Received an object menu select message from player %s for object %s, which does not exist or lacks a GameScriptObject.", m_characterObjectId.getValueString().c_str(),m.getNetworkId().getValueString().c_str())); + return; + } + + NOT_NULL(target); + + float range = 0.0f; + if (RadialMenuManager::getRangeForMenuType(menuType, range)) + { + Container::ContainerErrorCode errorCode = Container::CEC_Success; + if (!target->isAuthoritative()) + { + GenericValueTypeMessage > const rssMessage( + "RequestSameServer", + std::make_pair( + ContainerInterface::getTopmostContainer(*primaryControlledObject)->getNetworkId(), + ContainerInterface::getTopmostContainer(*target)->getNetworkId())); + GameServer::getInstance().sendToPlanetServer(rssMessage); + errorCode = Container::CEC_TryAgain; + } + else if (menuType != examineMenuType && targetContainedBy && targetContainedBy->asServerObject() && ( targetContainedBy->asServerObject()->getGameObjectType() == SharedObjectTemplate::GOT_chronicles_quest_holocron || targetContainedBy->asServerObject()->getGameObjectType() == SharedObjectTemplate::GOT_chronicles_quest_holocron_recipe ) ) + { + // Can only examine items that are contained in a holocron. + errorCode = Container::CEC_NoPermission; + } + else if (primaryControlledObject->canManipulateObject(*target, false, false, false, range, errorCode) + || ClientNamespace::canManipulateObjectExceptionCheck(*target, menuType, errorCode)) + { + ScriptParams params; + params.addParam (getCharacterObjectId()); + params.addParam (menuType); + + if (cobj && cobj->getObjVars().hasItem("cheater")) + { + std::string menuDesc = "unknown"; + bool tmp; + IGNORE_RETURN(RadialMenuManager::getCommandForMenuType(menuType, menuDesc, tmp)); + LOG("CustomerService",("SuspectedCheaterLog: %s has used a radial menu on object %s. Menu item %d (%s).", + PlayerObject::getAccountDescription(cobj).c_str(), + m.getNetworkId().getValueString().c_str(), + menuType, + menuDesc.c_str() )); + } + + IGNORE_RETURN (scriptObject->trigAllScripts(Scripting::TRIG_OBJECT_MENU_SELECT, params)); + } + if (errorCode != Container::CEC_Success) + ContainerInterface::sendContainerMessageToClient(*primaryControlledObject, errorCode); + } + else + { + DEBUG_REPORT_LOG(true, ("Received a message type %d that had no range in data (radial_menu.tab)\n", menuType)); + } + break; + } + + //---------------------------------------------------------------------- + + case constcrc("ConGenericMessage") : + { + + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ConGenericMessage c(ri); + if (isGod()) + { + LOG("CustomerService",("Avatar:%s executing command: %s", PlayerObject::getAccountDescription(getCharacterObjectId()).c_str(), c.getMsg().c_str())); + ConsoleMgr::processString(c.getMsg(), this, c.getMsgId()); + } + else + { + //Non-god user tried to use a console command + if (m_primaryControlledObject.getObject()) + { + LOG("CustomerService", ("CheatChannel:%s tried to execute a console command but they are not a god", + PlayerObject::getAccountDescription(m_primaryControlledObject.getObject()->getNetworkId()).c_str())); + ConsoleMgr::broadcastString("Only god users can execute console commands.", this, c.getMsgId()); + } + + } + break; + } + + //----------------------------------------------------------------- + + case constcrc("ObjControllerMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ObjControllerMessage o(ri); + bool appended = false; + + // check to make sure the controller message is allowed from the client + bool allowFromClient = ControllerMessageFactory::allowFromClient(o.getMessage()); + + // log as a possible hack + if (!allowFromClient) + LOG("CustomerService", ("UnauthorizedControllerMessage: Player %s sent an unauthorized controller message %d for object %s.", PlayerObject::getAccountDescription(getCharacterObjectId()).c_str(), o.getMessage(), o.getNetworkId().getValueString().c_str())); + + // do we allow the controller message to get executed? + if (allowFromClient || isGod() || !ConfigServerGame::getEnableClientControllerMessageCheck()) + { + ServerObject * target = findControlledObject(o.getNetworkId()); + if(target !=0) + { + // apply the controller message ServerController * controller = dynamic_cast(target->getController()); if (controller != nullptr) { @@ -1105,868 +1111,922 @@ void Client::receiveClientMessage(const GameNetworkMessage & message) appended = true; } } - } - } - if (!appended) - delete o.getData(); - } - - //----------------------------------------------------------------- - //Secure Trade Messages - //----------------------------------------------------------------- - else if (message.isType("AddItemMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AddItemMessage m(ri); - - - ServerObject * item = ServerWorld::findObjectByNetworkId(m.getNetworkId()); - if (!item) - return; - - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->addItem(*playerObject, *item); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - } - else if (message.isType("RemoveItemMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RemoveItemMessage m(ri); - - ServerObject * item = ServerWorld::findObjectByNetworkId(m.getNetworkId()); - if (!item) - return; - - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->removeItem(*playerObject, *item); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - } - else if (message.isType("GiveMoneyMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GiveMoneyMessage m(ri); - - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->giveMoney(*playerObject, m.getAmount()); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - } - else if (message.isType("AcceptTransactionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AcceptTransactionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->acceptOffer(*playerObject); - } - - if (playerObject->getObjVars().hasItem("cheater")) - { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has accepted a secure trade. (Check trade logs for more detail.", PlayerObject::getAccountDescription(playerObject).c_str())); - } - - - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - - } - else if (message.isType("UnAcceptTransactionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - UnAcceptTransactionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->unacceptOffer(*playerObject); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - - } - else if (message.isType("VerifyTradeMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - VerifyTradeMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->verifyTrade(*playerObject); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - } - else if (message.isType("DenyTradeMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - DenyTradeMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->rejectOffer(*playerObject); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - - } - else if (message.isType("AbortTradeMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AbortTradeMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - DEBUG_FATAL(!playerObject, ("No controller for player!\n")); - if(playerObject) //lint !e774 - { - PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); - if (playerController && playerController->getSecureTrade()) - { - playerController->getSecureTrade()->cancelTrade(*playerObject); - } - } - else - { - GameServer::getInstance().dropClient(m_characterObjectId); - } - - } - - else if (message.isType(SuiEventNotification::MessageType)) - { - ServerUIManager::receiveMessage(message); - } - - else if (message.isType("GuildRequestMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GuildRequestMessage const m(ri); - - NetworkId const &id = m.getTargetId(); - CreatureObject * const creatureObject = dynamic_cast(NetworkIdManager::getObjectById(id)); - if (creatureObject) - { - int const guildId = creatureObject->getGuildId(); - GuildMemberInfo const * const info = GuildInterface::getGuildMemberInfo(guildId, id); - GuildResponseMessage const responseMessage(id, GuildInterface::getGuildName(guildId), info ? info->m_title : std::string()); - send(responseMessage, true); - } - } - - else if (message.isType("StomachRequestMessage")) - { - CreatureObject *creatureObject = dynamic_cast(getCharacterObject()); - - if (creatureObject != nullptr) - { - GameScriptObject *gameScriptObject = creatureObject->getScriptObject(); - - if(gameScriptObject != nullptr) - { - ScriptParams scriptParams; - IGNORE_RETURN(gameScriptObject->trigAllScripts(Scripting::TRIG_STOMACH_UPDATE, scriptParams)); - } - } - } - - else if (message.isType("FactionRequestMessage")) - { - int rebel = 0; - int imperial = 0; - int criminal = 0; - - CreatureObject * playerObject = dynamic_cast(getCharacterObject()); - if (playerObject) - { - float temp; - if (playerObject->getObjVars().getItem("faction.Rebel",temp)) - { - rebel = static_cast(temp); - } - if (playerObject->getObjVars().getItem("faction.Imperial",temp)) - { - imperial = static_cast(temp); - } - if (playerObject->getObjVars().getItem("faction.Hutt",temp)) - { - criminal = static_cast(temp); - } - - std::vector factionNames; - std::vector factionValues; - std::string currentName; - float currentValue; - DynamicVariableList::NestedList factionList(playerObject->getObjVars(),"faction"); - for(DynamicVariableList::NestedList::const_iterator i = factionList.begin(); i != factionList.end(); ++i) - { - currentName = i.getName(); - bool result = i.getValue(currentValue); - if(result) + else if (isGod()) { - factionNames.push_back(currentName); - factionValues.push_back(currentValue); + target = ServerWorld::findObjectByNetworkId(o.getNetworkId()); + + if (target) + { + ServerController * controller = dynamic_cast(target->getController()); + if (controller != nullptr) + { + uint32 flags = o.getFlags(); + flags &= ~GameControllerMessageFlags::SOURCE_REMOTE; + flags |= GameControllerMessageFlags::SOURCE_REMOTE_CLIENT; + controller->appendMessage(o.getMessage(), o.getValue(), o.getData(), flags); + appended = true; + } + } } } - - FactionResponseMessage const msg(rebel, imperial, criminal, factionNames, factionValues); - send(msg, true); + if (!appended) + delete o.getData(); + + break; } - } - //---------------------------------------------------------------------- - - else if (message.isType (PlayerMoneyRequest::MessageType)) - { - Archive::ReadIterator ri = (*NON_NULL (static_cast(&message))).getByteStream().begin(); - const PlayerMoneyRequest m (ri); - - ServerObject * const playerObject = getCharacterObject(); - - WARNING (!playerObject, ("Got PlayerMoneyRequest for non-existant character (account=%s, networkid=%s)", m_accountName.c_str (), m_characterObjectId.getValueString ().c_str ())); - - if (playerObject) + //----------------------------------------------------------------- + //Secure Trade Messages + //----------------------------------------------------------------- + case constcrc("AddItemMessage") : { - PlayerMoneyResponse resp; - resp.m_balanceCash.set (playerObject->getCashBalance ()); - resp.m_balanceBank.set (playerObject->getBankBalance ()); - send (resp, true); - } - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AddItemMessage m(ri); - //----------------------------------------------------------------- - else if (message.isType("AcceptAuctionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AcceptAuctionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - CommoditiesMarket::auctionAccept(*playerObject, m.getItemId().getValue()); - if (playerObject->getObjVars().hasItem("cheater")) + ServerObject * item = ServerWorld::findObjectByNetworkId(m.getNetworkId()); + if (!item) + return; + + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has accepted an auction for item %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str())); - } - } - else - { - WARNING(true, ("AcceptAuctionMessage: the player was not found")); - } - } - - else if (message.isType("BidAuctionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - BidAuctionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - if (playerObject->getObjVars().hasItem("cheater")) - { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has bid on an auction for item %s, amount %d", - PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str(), - m.getBid())); - } - - CommoditiesMarket::auctionBid(*playerObject, m.getItemId().getValue(), m.getBid(), m.getMaxProxyBid()); - } - else - { - WARNING(true, ("BidAuctionMessage: the player was not found")); - } - } - - else if (message.isType("CancelLiveAuctionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CancelLiveAuctionMessage m(ri); - - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - CommoditiesMarket::auctionCancel(*playerObject, m.getItemId().getValue()); - if (playerObject->getObjVars().hasItem("cheater")) - { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has cancelled an auction for item %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str())); - } - - } - else - { - WARNING(true, ("CancelLiveAuctionMessage: the player was not found")); - } - } - - else if (message.isType("CreateAuctionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CreateAuctionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - NetworkId itemId = m.getItemId(); - NetworkId containerId = m.getContainerId(); - CommoditiesMarket::auctionCreate(*playerObject, itemId, m.getItemLocalizedName(), containerId, m.getMinimumBid(), m.getAuctionLength(), m.getUserDescription(), m.isPremium()); - - if (playerObject->getObjVars().hasItem("cheater")) - { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an auction for item %s on vendor %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str(), - containerId.getValueString().c_str())); - } - } - else - { - WARNING(true, ("CreateAuctionMessage: the player was not found")); - } - } - - else if (message.isType("CreateImmediateAuctionMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - CreateImmediateAuctionMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - NetworkId itemId = m.getItemId(); - NetworkId containerId = m.getContainerId(); - if (m.isVendorTransfer()) - { - CommoditiesMarket::transferVendorItemFromStockroom(*playerObject, itemId, m.getItemLocalizedName(), m.getPrice(), m.getAuctionLength(), m.getUserDescription()); + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->addItem(*playerObject, *item); + } } else { - CommoditiesMarket::auctionCreateImmediate(*playerObject, itemId, m.getItemLocalizedName(), containerId, m.getPrice(), m.getAuctionLength(), m.getUserDescription(), m.isPremium()); - } - if (playerObject->getObjVars().hasItem("cheater")) - { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an immediate auction for item %s on vendor %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str(), - containerId.getValueString().c_str())); + GameServer::getInstance().dropClient(m_characterObjectId); } + break; } - else + case constcrc("RemoveItemMessage") : { - WARNING(true, ("CreateImmediateAuctionMessage: the player was not found")); - } - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RemoveItemMessage m(ri); - else if (message.isType("RelistItemsFromStockMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage, std::vector >, int> > const m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - std::vector const & itemIds = m.getValue().first.first; - std::vector const & itemLocalizedNames = m.getValue().first.second; - int const timer = m.getValue().second; - NetworkId itemId; - std::vector::const_iterator iterId = itemIds.begin(); - std::vector::const_iterator iterName = itemLocalizedNames.begin(); - for (; ((iterId != itemIds.end()) && (iterName != itemLocalizedNames.end())); ++iterId, ++iterName) + ServerObject * item = ServerWorld::findObjectByNetworkId(m.getNetworkId()); + if (!item) + return; + + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 { - itemId = *iterId; - CommoditiesMarket::transferVendorItemFromStockroom(*playerObject, itemId, *iterName, -1, timer, Unicode::String()); - if (playerObject->getObjVars().hasItem("cheater")) + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an immediate auction (relist) for item %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - itemId.getValueString().c_str())); + playerController->getSecureTrade()->removeItem(*playerObject, *item); } } - } - else - { - WARNING(true, ("RelistItemsFromStockMessage: the player was not found")); - } - } - - else if (message.isType("RetrieveAuctionItemMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - RetrieveAuctionItemMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - NetworkId itemId = m.getItemId(); - ServerObject *auctionContainer = dynamic_cast(NetworkIdManager::getObjectById(m.getContainerId())); - if (auctionContainer) + else { - if (playerObject->isAuthoritative() && auctionContainer->isAuthoritative()) + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("GiveMoneyMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GiveMoneyMessage m(ri); + + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) { - CommoditiesMarket::auctionRetrieve(*playerObject, m.getItemId().getValue(), m.getItemId(), *auctionContainer); + playerController->getSecureTrade()->giveMoney(*playerObject, m.getAmount()); + } + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("AcceptTransactionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AcceptTransactionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->acceptOffer(*playerObject); + } + + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has accepted a secure trade. (Check trade logs for more detail.", PlayerObject::getAccountDescription(playerObject).c_str())); + } + + + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("UnAcceptTransactionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + UnAcceptTransactionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->unacceptOffer(*playerObject); + } + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("VerifyTradeMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + VerifyTradeMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->verifyTrade(*playerObject); + } + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("DenyTradeMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + DenyTradeMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->rejectOffer(*playerObject); + } + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + case constcrc("AbortTradeMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AbortTradeMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + DEBUG_FATAL(!playerObject, ("No controller for player!\n")); + if(playerObject) //lint !e774 + { + PlayerCreatureController* playerController = dynamic_cast(playerObject->getController()); + if (playerController && playerController->getSecureTrade()) + { + playerController->getSecureTrade()->cancelTrade(*playerObject); + } + } + else + { + GameServer::getInstance().dropClient(m_characterObjectId); + } + break; + } + + case SuiEventNotification::MessageType : + { + ServerUIManager::receiveMessage(message); + break; + } + + case constcrc("GuildRequestMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GuildRequestMessage const m(ri); + + NetworkId const &id = m.getTargetId(); + CreatureObject * const creatureObject = dynamic_cast(NetworkIdManager::getObjectById(id)); + if (creatureObject) + { + int const guildId = creatureObject->getGuildId(); + GuildMemberInfo const * const info = GuildInterface::getGuildMemberInfo(guildId, id); + GuildResponseMessage const responseMessage(id, GuildInterface::getGuildName(guildId), info ? info->m_title : std::string()); + send(responseMessage, true); + } + break; + } + + case constcrc("StomachRequestMessage") : + { + CreatureObject *creatureObject = dynamic_cast(getCharacterObject()); + + if (creatureObject != nullptr) + { + GameScriptObject *gameScriptObject = creatureObject->getScriptObject(); + + if(gameScriptObject != nullptr) + { + ScriptParams scriptParams; + IGNORE_RETURN(gameScriptObject->trigAllScripts(Scripting::TRIG_STOMACH_UPDATE, scriptParams)); + } + } + break; + } + + case constcrc("FactionRequestMessage") : + { + int rebel = 0; + int imperial = 0; + int criminal = 0; + + CreatureObject * playerObject = dynamic_cast(getCharacterObject()); + if (playerObject) + { + float temp; + if (playerObject->getObjVars().getItem("faction.Rebel",temp)) + { + rebel = static_cast(temp); + } + if (playerObject->getObjVars().getItem("faction.Imperial",temp)) + { + imperial = static_cast(temp); + } + if (playerObject->getObjVars().getItem("faction.Hutt",temp)) + { + criminal = static_cast(temp); + } + + std::vector factionNames; + std::vector factionValues; + std::string currentName; + float currentValue; + DynamicVariableList::NestedList factionList(playerObject->getObjVars(),"faction"); + for(DynamicVariableList::NestedList::const_iterator i = factionList.begin(); i != factionList.end(); ++i) + { + currentName = i.getName(); + bool result = i.getValue(currentValue); + if(result) + { + factionNames.push_back(currentName); + factionValues.push_back(currentValue); + } + } + + FactionResponseMessage const msg(rebel, imperial, criminal, factionNames, factionValues); + send(msg, true); + } + break; + } + + //---------------------------------------------------------------------- + + case PlayerMoneyRequest::MessageType : + { + Archive::ReadIterator ri = (*NON_NULL (static_cast(&message))).getByteStream().begin(); + const PlayerMoneyRequest m (ri); + + ServerObject * const playerObject = getCharacterObject(); + + WARNING (!playerObject, ("Got PlayerMoneyRequest for non-existant character (account=%s, networkid=%s)", m_accountName.c_str (), m_characterObjectId.getValueString ().c_str ())); + + if (playerObject) + { + PlayerMoneyResponse resp; + resp.m_balanceCash.set (playerObject->getCashBalance ()); + resp.m_balanceBank.set (playerObject->getBankBalance ()); + send (resp, true); + } + break; + } + + //----------------------------------------------------------------- + + case constcrc("AcceptAuctionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AcceptAuctionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + CommoditiesMarket::auctionAccept(*playerObject, m.getItemId().getValue()); + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has accepted an auction for item %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str())); + } + } + else + { + WARNING(true, ("AcceptAuctionMessage: the player was not found")); + } + break; + } + + case constcrc("BidAuctionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + BidAuctionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has bid on an auction for item %s, amount %d", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str(), + m.getBid())); + } + + CommoditiesMarket::auctionBid(*playerObject, m.getItemId().getValue(), m.getBid(), m.getMaxProxyBid()); + } + else + { + WARNING(true, ("BidAuctionMessage: the player was not found")); + } + break; + } + + case constcrc("CancelLiveAuctionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CancelLiveAuctionMessage m(ri); + + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + CommoditiesMarket::auctionCancel(*playerObject, m.getItemId().getValue()); + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has cancelled an auction for item %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str())); + } + + } + else + { + WARNING(true, ("CancelLiveAuctionMessage: the player was not found")); + } + break; + } + + case constcrc("CreateAuctionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CreateAuctionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + NetworkId itemId = m.getItemId(); + NetworkId containerId = m.getContainerId(); + CommoditiesMarket::auctionCreate(*playerObject, itemId, m.getItemLocalizedName(), containerId, m.getMinimumBid(), m.getAuctionLength(), m.getUserDescription(), m.isPremium()); + + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an auction for item %s on vendor %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str(), + containerId.getValueString().c_str())); + } + } + else + { + WARNING(true, ("CreateAuctionMessage: the player was not found")); + } + break; + } + + case constcrc("CreateImmediateAuctionMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + CreateImmediateAuctionMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + NetworkId itemId = m.getItemId(); + NetworkId containerId = m.getContainerId(); + if (m.isVendorTransfer()) + { + CommoditiesMarket::transferVendorItemFromStockroom(*playerObject, itemId, m.getItemLocalizedName(), m.getPrice(), m.getAuctionLength(), m.getUserDescription()); + } + else + { + CommoditiesMarket::auctionCreateImmediate(*playerObject, itemId, m.getItemLocalizedName(), containerId, m.getPrice(), m.getAuctionLength(), m.getUserDescription(), m.isPremium()); + } + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an immediate auction for item %s on vendor %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str(), + containerId.getValueString().c_str())); + } + } + else + { + WARNING(true, ("CreateImmediateAuctionMessage: the player was not found")); + } + break; + } + + case constcrc("RelistItemsFromStockMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage, std::vector >, int> > const m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + std::vector const & itemIds = m.getValue().first.first; + std::vector const & itemLocalizedNames = m.getValue().first.second; + int const timer = m.getValue().second; + NetworkId itemId; + std::vector::const_iterator iterId = itemIds.begin(); + std::vector::const_iterator iterName = itemLocalizedNames.begin(); + for (; ((iterId != itemIds.end()) && (iterName != itemLocalizedNames.end())); ++iterId, ++iterName) + { + itemId = *iterId; + CommoditiesMarket::transferVendorItemFromStockroom(*playerObject, itemId, *iterName, -1, timer, Unicode::String()); if (playerObject->getObjVars().hasItem("cheater")) { - LOG("CustomerService", ("SuspectedCheaterChannel: %s has retrieved an auction for item %s on vendor %s", + LOG("CustomerService", ("SuspectedCheaterChannel: %s has created an immediate auction (relist) for item %s", PlayerObject::getAccountDescription(playerObject).c_str(), - m.getItemId().getValueString().c_str(), - auctionContainer->getNetworkId().getValueString().c_str())); + itemId.getValueString().c_str())); } } } else { - LOG("CustomerService", ("Auction:Player %s attempted to retrieve an auction for container %Ld but failed.", PlayerObject::getAccountDescription(playerObject).c_str(), m.getContainerId().getValue())); + WARNING(true, ("RelistItemsFromStockMessage: the player was not found")); + } + break; + } - RetrieveAuctionItemResponseMessage const msg(itemId, ar_INVALID_CONTAINER_ID);; - Client *client = playerObject->getClient(); - if (client) + case constcrc("RetrieveAuctionItemMessage") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + RetrieveAuctionItemMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + NetworkId itemId = m.getItemId(); + ServerObject *auctionContainer = dynamic_cast(NetworkIdManager::getObjectById(m.getContainerId())); + if (auctionContainer) { - client->send(msg, true); + if (playerObject->isAuthoritative() && auctionContainer->isAuthoritative()) + { + CommoditiesMarket::auctionRetrieve(*playerObject, m.getItemId().getValue(), m.getItemId(), *auctionContainer); + if (playerObject->getObjVars().hasItem("cheater")) + { + LOG("CustomerService", ("SuspectedCheaterChannel: %s has retrieved an auction for item %s on vendor %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + m.getItemId().getValueString().c_str(), + auctionContainer->getNetworkId().getValueString().c_str())); + } + } + } + else + { + LOG("CustomerService", ("Auction:Player %s attempted to retrieve an auction for container %Ld but failed.", PlayerObject::getAccountDescription(playerObject).c_str(), m.getContainerId().getValue())); + + RetrieveAuctionItemResponseMessage const msg(itemId, ar_INVALID_CONTAINER_ID);; + Client *client = playerObject->getClient(); + if (client) + { + client->send(msg, true); + } } } + else + { + WARNING(true, ("RetrieveAuctionMessage: the player was not found")); + } + break; } - else + case constcrc("AuctionQueryHeadersMessage") : { - WARNING(true, ("RetrieveAuctionMessage: the player was not found")); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + AuctionQueryHeadersMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + CommoditiesMarket::auctionQueryHeaders(*playerObject, + m.getRequestId(), + m.getSearchType(), + m.getItemType(), + m.getItemTypeExactMatch(), + m.getItemTemplateId(), + m.getTextFilterAll(), + m.getTextFilterAny(), + m.getPriceFilterMin(), + m.getPriceFilterMax(), + m.getPriceFilterIncludesFee(), + m.getAdvancedSearch(), + m.getAdvancedSearchMatchAllAny(), + m.getContainer(), + m.getLocationSearchType(), + m.getMyVendorsOnly(), + m.getQueryOffset()); + } + break; } - } - else if (message.isType("AuctionQueryHeadersMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - AuctionQueryHeadersMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) + case constcrc("GetAuctionDetails") : { - CommoditiesMarket::auctionQueryHeaders(*playerObject, - m.getRequestId(), - m.getSearchType(), - m.getItemType(), - m.getItemTypeExactMatch(), - m.getItemTemplateId(), - m.getTextFilterAll(), - m.getTextFilterAny(), - m.getPriceFilterMin(), - m.getPriceFilterMax(), - m.getPriceFilterIncludesFee(), - m.getAdvancedSearch(), - m.getAdvancedSearchMatchAllAny(), - m.getContainer(), - m.getLocationSearchType(), - m.getMyVendorsOnly(), - m.getQueryOffset()); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GetAuctionDetails m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + CommoditiesMarket::getAuctionDetails(*playerObject, + m.getItem()); + } + break; } - } - else if (message.isType("GetAuctionDetails")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GetAuctionDetails m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) + case constcrc("IsVendorOwnerMessage") : { - CommoditiesMarket::getAuctionDetails(*playerObject, - m.getItem()); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + IsVendorOwnerMessage m(ri); + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + CommoditiesMarket::isVendorOwner(*playerObject, m.getContainerId()); + } + break; } - - } - else if (message.isType("IsVendorOwnerMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - IsVendorOwnerMessage m(ri); - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) + case constcrc("CommoditiesItemTypeListRequest") : { - CommoditiesMarket::isVendorOwner(*playerObject, m.getContainerId()); - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const m(ri); - } - else if (message.isType("CommoditiesItemTypeListRequest")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const m(ri); - - static char buffer[128]; - snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), CommoditiesMarket::getItemTypeMapVersionNumber()); - buffer[sizeof(buffer)-1] = '\0'; - - if (m.getValue() != std::string(buffer)) - { - GenericValueTypeMessage > > > > const rsp("CommoditiesItemTypeListResponse", std::make_pair(std::string(buffer), CommoditiesMarket::getItemTypeMap())); - send(rsp, true); - } - } - else if (message.isType("CommoditiesResourceTypeListRequest")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const m(ri); - - static char buffer[128]; - snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), CommoditiesMarket::getResourceTypeMapVersionNumber()); - buffer[sizeof(buffer)-1] = '\0'; - - if (m.getValue() != std::string(buffer)) - { - GenericValueTypeMessage > > > const rsp("CommoditiesResourceTypeListResponse", std::make_pair(std::string(buffer), CommoditiesMarket::getResourceTypeMap())); - send(rsp, true); - } - } - else if (message.isType("CollectionServerFirstListRequest")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage const m(ri); - - PlanetObject const * const planetObject = ServerUniverse::getInstance().getTatooinePlanet(); - if (planetObject) - { static char buffer[128]; - snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), planetObject->getCollectionServerFirstUpdateNumber()); + snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), CommoditiesMarket::getItemTypeMapVersionNumber()); buffer[sizeof(buffer)-1] = '\0'; if (m.getValue() != std::string(buffer)) { - GenericValueTypeMessage, std::pair > > > > const rsp("CollectionServerFirstListResponse", std::make_pair(std::string(buffer), planetObject->getCollectionServerFirst())); + GenericValueTypeMessage > > > > const rsp("CommoditiesItemTypeListResponse", std::make_pair(std::string(buffer), CommoditiesMarket::getItemTypeMap())); send(rsp, true); } + break; } - } - - //----------------------------------------------------------------- - - else if (message.isType (PlanetTravelPointListRequest::cms_name)) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - const PlanetTravelPointListRequest requestMessage (readIterator); - - const std::string & planetName = requestMessage.getPlanetName (); - const PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (requestMessage.getPlanetName ()); - if (planetObject) + case constcrc("CommoditiesResourceTypeListRequest") : { - std::vector names; - planetObject->getTravelPointNameList (names); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const m(ri); - std::vector points; - planetObject->getTravelPointPointList (points); + static char buffer[128]; + snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), CommoditiesMarket::getResourceTypeMapVersionNumber()); + buffer[sizeof(buffer)-1] = '\0'; - std::vector costs; - planetObject->getTravelPointCostList (costs); - - std::vector interplanetary; - planetObject->getTravelPointInterplanetaryList (interplanetary); - - PlanetTravelPointListResponse const rsp(planetName, names, points, costs, interplanetary, requestMessage.getSequenceId ()); - send(rsp, true); - } - else - DEBUG_WARNING (true, ("GameServer::receiveMessage: received request for travel point names from client [%s] for planet %s which does not exist", requestMessage.getPlanetName ().c_str (), requestMessage.getNetworkId ().getValueString ().c_str ())); - } - - //----------------------------------------------------------------- - - else if (message.isType (NewbieTutorialResponse::cms_name)) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - const NewbieTutorialResponse responseMessage (readIterator); - - static const std::string clientReadyString("clientReady"); - - if (responseMessage.getResponse() == clientReadyString) - { - for (std::vector::iterator i = m_controlledObjects.begin(); i != m_controlledObjects.end(); ++i) + if (m.getValue() != std::string(buffer)) { - ServerObject * const so = *i; - if (so) - so->onLoadingScreenComplete(); + GenericValueTypeMessage > > > const rsp("CommoditiesResourceTypeListResponse", std::make_pair(std::string(buffer), CommoditiesMarket::getResourceTypeMap())); + send(rsp, true); } + break; } - - ScriptParams scriptParameters; - scriptParameters.addParam (responseMessage.getResponse ().c_str ()); - - if (primaryControlledObject->getScriptObject ()->trigAllScripts (Scripting::TRIG_NEWBIE_TUTORIAL_RESPONSE, scriptParameters) != SCRIPT_CONTINUE) - DEBUG_REPORT_LOG (true, ("OnNewbieTutorialResponse: did not return SCRIPT_CONTINUE\n")); - } - - //----------------------------------------------------------------- - - else if (message.isType("AddMapLocationMessage")) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - const AddMapLocationMessage msg (readIterator); - UNREF (msg); - - /* - MapLocation mapLocation(msg.getLocationId(), msg.getLocationName(), - Vector2d(msg.getLocationX(), msg.getLocationY()), - msg.getCategory(), msg.getSubCategory()); - - PlanetObject *planetObject = ServerUniverse::getInstance ().getPlanetByName (msg.getPlanetName ()); - if (planetObject) + case constcrc("CollectionServerFirstListRequest") : { - planetObject->addMapLocation(mapLocation); - } - AddMapLocationResponseMessage responseMsg(msg.getLocationId()); - send(responseMsg, true); - */ - } + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage const m(ri); - //----------------------------------------------------------------- - - else if (message.isType(GetMapLocationsMessage::MessageType)) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - const GetMapLocationsMessage msg (readIterator); - - PlanetMapManagerServer::handleClientRequest (*this, msg); - } - - else if (message.isType("GetSpecificMapLocationsMessage")) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - const GenericValueTypeMessage > > msg (readIterator); - - PlanetMapManagerServer::handleClientRequestGetSpecificMapLocationsMessage (*this, msg.getValue()); - } - - else if (message.isType("ConsentResponseMessage")) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - ConsentResponseMessage const msg(readIterator); - ConsentManager::getInstance().handleResponse(msg); - } - - else if (message.isType("RequestGalaxyLoopTimes")) - { - // obfuscate the information so it's not obvious on the client that this is the server loop time - unsigned long loopTime = static_cast(Clock::frameTime() * 3193000.0f); // loop time (in ms) * 3193 - GalaxyLoopTimesResponse const msg(loopTime, loopTime); - send(msg, true); - } - else if (message.isType("LagRequest")) - { - GameNetworkMessage const msg("GameServerLagResponse"); - send(msg, true); - } - else if (message.isType("LagReport")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - GenericValueTypeMessage > const report(ri); - m_connectionServerLag = report.getValue().first; - m_gameServerLag = report.getValue().second; - } - else if (message.isType("ChatInviteGroupToRoom")) - { - if (primaryControlledObject) - { - CreatureObject * const playerCreature = primaryControlledObject->asCreatureObject(); - if (playerCreature) + PlanetObject const * const planetObject = ServerUniverse::getInstance().getTatooinePlanet(); + if (planetObject) { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ChatInviteGroupToRoom const chat(ri); + static char buffer[128]; + snprintf(buffer, sizeof(buffer)-1, "%s.%d", GameServer::getInstance().getClusterName().c_str(), planetObject->getCollectionServerFirstUpdateNumber()); + buffer[sizeof(buffer)-1] = '\0'; - // We will need to notify the user if the group leader can not be found - bool foundGroupLeader = false; - - // Get the name of the group leader being invited - ChatAvatarId const & groupLeaderChatAvatarId = chat.getAvatarId(); - - // Convert the name to a network ID - NetworkId const groupLeaderNetworkId = NameManager::getInstance().getPlayerId(NameManager::normalizeName(Unicode::wideToNarrow(groupLeaderChatAvatarId.getName()))); - - // Try to get a group object corresponding to the player network ID - ServerObject const * const groupServerObject = ServerWorld::findObjectByNetworkId(GroupObject::getGroupIdForLeader(groupLeaderNetworkId)); - if (groupServerObject && groupServerObject->asGroupObject()) + if (m.getValue() != std::string(buffer)) { - // We now know the player is a group leader of a group - GroupObject const * const groupLeaderGroupObject = groupServerObject->asGroupObject(); + GenericValueTypeMessage, std::pair > > > > const rsp("CollectionServerFirstListResponse", std::make_pair(std::string(buffer), planetObject->getCollectionServerFirst())); + send(rsp, true); + } + } + break; + } - // Make sure we have the correct player since we only searched by name - // (i.e. we may have been looking for a player with the same name but on a different cluster) - ChatAvatarId const playerChatAvatarId = Chat::constructChatAvatarId(NameManager::normalizeName(groupLeaderGroupObject->getGroupLeaderName())); - if (playerChatAvatarId == groupLeaderChatAvatarId) + //----------------------------------------------------------------- + + case PlanetTravelPointListRequest::cms_name : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + const PlanetTravelPointListRequest requestMessage (readIterator); + + const std::string & planetName = requestMessage.getPlanetName (); + const PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (requestMessage.getPlanetName ()); + if (planetObject) + { + std::vector names; + planetObject->getTravelPointNameList (names); + + std::vector points; + planetObject->getTravelPointPointList (points); + + std::vector costs; + planetObject->getTravelPointCostList (costs); + + std::vector interplanetary; + planetObject->getTravelPointInterplanetaryList (interplanetary); + + PlanetTravelPointListResponse const rsp(planetName, names, points, costs, interplanetary, requestMessage.getSequenceId ()); + send(rsp, true); + } + else + DEBUG_WARNING (true, ("GameServer::receiveMessage: received request for travel point names from client [%s] for planet %s which does not exist", requestMessage.getPlanetName ().c_str (), requestMessage.getNetworkId ().getValueString ().c_str ())); + + break; + } + + //----------------------------------------------------------------- + + case NewbieTutorialResponse::cms_name : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + const NewbieTutorialResponse responseMessage (readIterator); + + static const std::string clientReadyString("clientReady"); + + if (responseMessage.getResponse() == clientReadyString) + { + for (std::vector::iterator i = m_controlledObjects.begin(); i != m_controlledObjects.end(); ++i) + { + ServerObject * const so = *i; + if (so) + so->onLoadingScreenComplete(); + } + } + + ScriptParams scriptParameters; + scriptParameters.addParam (responseMessage.getResponse ().c_str ()); + + if (primaryControlledObject->getScriptObject ()->trigAllScripts (Scripting::TRIG_NEWBIE_TUTORIAL_RESPONSE, scriptParameters) != SCRIPT_CONTINUE) + DEBUG_REPORT_LOG (true, ("OnNewbieTutorialResponse: did not return SCRIPT_CONTINUE\n")); + + break; + } + + //----------------------------------------------------------------- + + case constcrc("AddMapLocationMessage") : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + const AddMapLocationMessage msg (readIterator); + UNREF (msg); + + /* + MapLocation mapLocation(msg.getLocationId(), msg.getLocationName(), + Vector2d(msg.getLocationX(), msg.getLocationY()), + msg.getCategory(), msg.getSubCategory()); + + PlanetObject *planetObject = ServerUniverse::getInstance ().getPlanetByName (msg.getPlanetName ()); + if (planetObject) + { + planetObject->addMapLocation(mapLocation); + } + AddMapLocationResponseMessage responseMsg(msg.getLocationId()); + send(responseMsg, true); + */ + break; + } + + //----------------------------------------------------------------- + + case GetMapLocationsMessage::MessageType : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + const GetMapLocationsMessage msg (readIterator); + + PlanetMapManagerServer::handleClientRequest (*this, msg); + break; + } + + case constcrc("GetSpecificMapLocationsMessage") : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + const GenericValueTypeMessage > > msg (readIterator); + + PlanetMapManagerServer::handleClientRequestGetSpecificMapLocationsMessage (*this, msg.getValue()); + break; + } + + case constcrc("ConsentResponseMessage") : + { + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + ConsentResponseMessage const msg(readIterator); + ConsentManager::getInstance().handleResponse(msg); + break; + } + + case constcrc("RequestGalaxyLoopTimes") : + { + // obfuscate the information so it's not obvious on the client that this is the server loop time + unsigned long loopTime = static_cast(Clock::frameTime() * 3193000.0f); // loop time (in ms) * 3193 + GalaxyLoopTimesResponse const msg(loopTime, loopTime); + send(msg, true); + break; + } + case constcrc("LagRequest") : + { + GameNetworkMessage const msg("GameServerLagResponse"); + send(msg, true); + break; + } + case constcrc("LagReport") : + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + GenericValueTypeMessage > const report(ri); + m_connectionServerLag = report.getValue().first; + m_gameServerLag = report.getValue().second; + break; + } + case constcrc("ChatInviteGroupToRoom") : + { + if (primaryControlledObject) + { + CreatureObject * const playerCreature = primaryControlledObject->asCreatureObject(); + if (playerCreature) + { + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ChatInviteGroupToRoom const chat(ri); + + // We will need to notify the user if the group leader can not be found + bool foundGroupLeader = false; + + // Get the name of the group leader being invited + ChatAvatarId const & groupLeaderChatAvatarId = chat.getAvatarId(); + + // Convert the name to a network ID + NetworkId const groupLeaderNetworkId = NameManager::getInstance().getPlayerId(NameManager::normalizeName(Unicode::wideToNarrow(groupLeaderChatAvatarId.getName()))); + + // Try to get a group object corresponding to the player network ID + ServerObject const * const groupServerObject = ServerWorld::findObjectByNetworkId(GroupObject::getGroupIdForLeader(groupLeaderNetworkId)); + if (groupServerObject && groupServerObject->asGroupObject()) { - // We found the group leader - foundGroupLeader = true; + // We now know the player is a group leader of a group + GroupObject const * const groupLeaderGroupObject = groupServerObject->asGroupObject(); - // We need to get the network IDs for all the group members - std::vector groupNetworkIds; - - GroupObject::GroupMemberVector const & groupMemberVector = groupLeaderGroupObject->getGroupMembers(); - for (unsigned i = 0; i < groupMemberVector.size(); ++i) + // Make sure we have the correct player since we only searched by name + // (i.e. we may have been looking for a player with the same name but on a different cluster) + ChatAvatarId const playerChatAvatarId = Chat::constructChatAvatarId(NameManager::normalizeName(groupLeaderGroupObject->getGroupLeaderName())); + if (playerChatAvatarId == groupLeaderChatAvatarId) { - GroupObject::GroupMember const & groupMember = groupMemberVector[i]; + // We found the group leader + foundGroupLeader = true; - groupNetworkIds.push_back(groupMember.first); + // We need to get the network IDs for all the group members + std::vector groupNetworkIds; + + GroupObject::GroupMemberVector const & groupMemberVector = groupLeaderGroupObject->getGroupMembers(); + for (unsigned i = 0; i < groupMemberVector.size(); ++i) + { + GroupObject::GroupMember const & groupMember = groupMemberVector[i]; + + groupNetworkIds.push_back(groupMember.first); + } + + // Pass the invitation to all the group members + Chat::inviteGroupMembers(m_primaryControlledObject, chat.getAvatarId(), chat.getRoomName(), groupNetworkIds); } - - // Pass the invitation to all the group members - Chat::inviteGroupMembers(m_primaryControlledObject, chat.getAvatarId(), chat.getRoomName(), groupNetworkIds); } - } - // If we couldn't find the group leader, let the player know - if (!foundGroupLeader) - { - ChatAvatarId const inviteeId = Chat::constructChatAvatarId(*playerCreature); - ChatOnInviteGroupToRoom msg(ERR_DESTAVATARDOESNTEXIST, chat.getRoomName(), inviteeId, chat.getAvatarId()); - send(msg, false); + // If we couldn't find the group leader, let the player know + if (!foundGroupLeader) + { + ChatAvatarId const inviteeId = Chat::constructChatAvatarId(*playerCreature); + ChatOnInviteGroupToRoom msg(ERR_DESTAVATARDOESNTEXIST, chat.getRoomName(), inviteeId, chat.getAvatarId()); + send(msg, false); + } } } + break; } - } - else if (message.isType("ChatPersistentMessageToServer")) - { - if (primaryControlledObject) //lint !e774 + case constcrc("ChatPersistentMessageToServer") : { - CreatureObject * const playerCreature = primaryControlledObject->asCreatureObject(); - if (playerCreature) + if (primaryControlledObject) //lint !e774 { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ChatPersistentMessageToServer const chat(ri); - std::string const &toName = chat.getToCharacterName().name; - if (!_stricmp(toName.c_str(), "guild")) + CreatureObject * const playerCreature = primaryControlledObject->asCreatureObject(); + if (playerCreature) { - std::pair > const count = GuildInterface::mailToGuild(*playerCreature, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); - if (count.first < 0) + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ChatPersistentMessageToServer const chat(ri); + std::string const &toName = chat.getToCharacterName().name; + if (!_stricmp(toName.c_str(), "guild")) { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide("You do not have sufficient permission to send mail to guild members."), Unicode::emptyString); - } - else - { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d members of guild %s (%s).", count.first, count.second.first.c_str(), count.second.second.c_str())), Unicode::emptyString); - } - } - else if (!_strnicmp(toName.c_str(), "guild ", 6)) - { - // see if it's a valid guild rank - GuildRankDataTable::GuildRank const * guildRank = GuildRankDataTable::getRankForDisplayRankName(toName); - if (guildRank) - { - std::pair > const count = GuildInterface::mailToGuildRank(*playerCreature, guildRank->slotId, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); + std::pair > const count = GuildInterface::mailToGuild(*playerCreature, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); if (count.first < 0) { Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide("You do not have sufficient permission to send mail to guild members."), Unicode::emptyString); } else { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d members in rank %s of guild %s (%s).", count.first, guildRank->displayName.c_str(), count.second.first.c_str(), count.second.second.c_str())), Unicode::emptyString); + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d members of guild %s (%s).", count.first, count.second.first.c_str(), count.second.second.c_str())), Unicode::emptyString); } } - else + else if (!_strnicmp(toName.c_str(), "guild ", 6)) { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("\"%s\" is not a valid name.", toName.c_str())), Unicode::emptyString); + // see if it's a valid guild rank + GuildRankDataTable::GuildRank const * guildRank = GuildRankDataTable::getRankForDisplayRankName(toName); + if (guildRank) + { + std::pair > const count = GuildInterface::mailToGuildRank(*playerCreature, guildRank->slotId, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); + if (count.first < 0) + { + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide("You do not have sufficient permission to send mail to guild members."), Unicode::emptyString); + } + else + { + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d members in rank %s of guild %s (%s).", count.first, guildRank->displayName.c_str(), count.second.first.c_str(), count.second.second.c_str())), Unicode::emptyString); + } + } + else + { + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("\"%s\" is not a valid name.", toName.c_str())), Unicode::emptyString); + } } - } - else if (!_stricmp(toName.c_str(), "citizens")) - { - std::pair const count = CityInterface::mailToCitizens(*playerCreature, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); - if (count.first < 0) + else if (!_stricmp(toName.c_str(), "citizens")) { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide("You do not have sufficient permission to send mail to citizens."), Unicode::emptyString); + std::pair const count = CityInterface::mailToCitizens(*playerCreature, chat.getSubject(), chat.getMessage(), chat.getOutOfBand()); + if (count.first < 0) + { + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide("You do not have sufficient permission to send mail to citizens."), Unicode::emptyString); + } + else + { + Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d citizens of city %s.", count.first, count.second.c_str())), Unicode::emptyString); + } } - else - { - Chat::sendSystemMessage(*playerCreature, Unicode::narrowToWide(FormattedString<512>().sprintf("Your mail was sent to %d citizens of city %s.", count.first, count.second.c_str())), Unicode::emptyString); - } - } - if (playerCreature->getObjVars().hasItem("cheater")) - { - LOGU("CustomerService", ("SuspectedCheaterChannel: %s is broadcasting a %s message that says '%s'", - PlayerObject::getAccountDescription(playerCreature).c_str(), - toName.c_str()), - chat.getMessage()); + if (playerCreature->getObjVars().hasItem("cheater")) + { + LOGU("CustomerService", ("SuspectedCheaterChannel: %s is broadcasting a %s message that says '%s'", + PlayerObject::getAccountDescription(playerCreature).c_str(), + toName.c_str()), + chat.getMessage()); + } } } + break; } - } - else if (message.isType("ExpertiseRequestMessage")) - { - Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); - ExpertiseRequestMessage const m(ri); - - std::vector const & addExpertisesNamesList = m.getAddExpertisesList(); - bool clearAllExpertisesFirst = m.getClearAllExpertisesFirst(); - std::string addList; - std::vector::const_iterator i; - for(i = addExpertisesNamesList.begin(); i != addExpertisesNamesList.end(); ++i) + case constcrc("ExpertiseRequestMessage") : { - addList += " "; - addList += *i; - } - CreatureObject * playerObject = safe_cast(getCharacterObject()); - if (playerObject) - { - LOG("CustomerService", ("ExpertiseRequestMessage: %s has requested to add expertises [%s] %s", - PlayerObject::getAccountDescription(playerObject).c_str(), - addList.c_str(), clearAllExpertisesFirst ? "(clearing first)" : "")); - playerObject->processExpertiseRequest(addExpertisesNamesList, clearAllExpertisesFirst); - } - } - else if (message.isType("UpdateSessionPlayTimeInfo")) - { - Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); - GenericValueTypeMessage > > const msgPlayTimeInfo(readIterator); + Archive::ReadIterator ri = static_cast(message).getByteStream().begin(); + ExpertiseRequestMessage const m(ri); - PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(safe_cast(getCharacterObject())); - if (playerObject != nullptr) + std::vector const & addExpertisesNamesList = m.getAddExpertisesList(); + bool clearAllExpertisesFirst = m.getClearAllExpertisesFirst(); + std::string addList; + std::vector::const_iterator i; + for(i = addExpertisesNamesList.begin(); i != addExpertisesNamesList.end(); ++i) + { + addList += " "; + addList += *i; + } + CreatureObject * playerObject = safe_cast(getCharacterObject()); + if (playerObject) + { + LOG("CustomerService", ("ExpertiseRequestMessage: %s has requested to add expertises [%s] %s", + PlayerObject::getAccountDescription(playerObject).c_str(), + addList.c_str(), clearAllExpertisesFirst ? "(clearing first)" : "")); + playerObject->processExpertiseRequest(addExpertisesNamesList, clearAllExpertisesFirst); + } + break; + } + case constcrc("UpdateSessionPlayTimeInfo") : { - playerObject->setSessionPlayTimeInfo(msgPlayTimeInfo.getValue().first, msgPlayTimeInfo.getValue().second.first, msgPlayTimeInfo.getValue().second.second); + Archive::ReadIterator readIterator = static_cast (message).getByteStream ().begin (); + GenericValueTypeMessage > > const msgPlayTimeInfo(readIterator); + + PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(safe_cast(getCharacterObject())); + if (playerObject != nullptr) + { + playerObject->setSessionPlayTimeInfo(msgPlayTimeInfo.getValue().first, msgPlayTimeInfo.getValue().second.first, msgPlayTimeInfo.getValue().second.second); + } + break; } } } @@ -1997,8 +2057,10 @@ void Client::receiveMessage(const MessageDispatch::Emitter & source, const Messa { UNREF(source); - if ( message.isType("ConnectionServerConnectionClosed") - || message.isType("ConnectionServerConnectionDestroyed")) + const uint32 messageType = message.getType(); + + if ( messageType == constcrc("ConnectionServerConnectionClosed") + || messageType == constcrc("ConnectionServerConnectionDestroyed")) { //Connection server crashed DEBUG_REPORT_LOG(true, ("Connection Server crashed. Client dropping.\n"));