partial revert of this file as it is causing some issues

This commit is contained in:
DarthArgus
2016-10-01 04:52:25 +00:00
parent 7a6a1daf94
commit d3fb0f126c
@@ -41,8 +41,6 @@
#include "sharedObject/VolumeContainer.h"
#include "sharedSkillSystem/SkillObject.h"
#include "sharedFoundation/CrcConstexpr.hpp"
// ======================================================================
namespace ConnectionServerConnectionNamespace
@@ -113,397 +111,370 @@ void ConnectionServerConnection::onReceive (const Archive::ByteStream & message)
Archive::ReadIterator ri = message.begin();
GameNetworkMessage m(ri);
ri = message.begin();
const uint32 messageType = m.getType();
switch(messageType) {
if(m.isType("GameClientMessage"))
if(m.isType("GameClientMessage"))
{
GameClientMessage c(ri);
const std::vector<NetworkId> & idList = c.getDistributionList();
std::vector<NetworkId>::const_iterator i;
for(i = idList.begin(); i != idList.end(); ++i)
{
GameClientMessage c(ri);
const std::vector<NetworkId> & idList = c.getDistributionList();
std::vector<NetworkId>::const_iterator i;
for(i = idList.begin(); i != idList.end(); ++i)
GameServer::getInstance().deliverMessageToClientObject((*i), c.getByteStream());
}
}
else if (m.isType("SetSyncStamp"))
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<uint16, uint32> > syncStampMessage(readIterator);
setSyncStamps(syncStampMessage.getValue().first, syncStampMessage.getValue().second);
}
else if (m.isType("ChatOnChangeFriendStatus"))
{
ChatOnChangeFriendStatus chat(ri);
CommunityManager::handleMessage(chat);
}
else if (m.isType("ChatOnGetFriendsList"))
{
ChatOnGetFriendsList chat(ri);
CommunityManager::handleMessage(chat);
}
else if (m.isType("ChatOnChangeIgnoreStatus"))
{
ChatOnChangeIgnoreStatus chat(ri);
CommunityManager::handleMessage(chat);
}
else if (m.isType("ChatOnGetIgnoreList"))
{
ChatOnGetIgnoreList chat(ri);
CommunityManager::handleMessage(chat);
}
else if (m.isType("ChatStatisticsCS"))
{
GenericValueTypeMessage<std::pair<std::pair<NetworkId, int>, std::pair<int, int> > > chatStatistics(ri);
ServerObject * const so = ServerWorld::findObjectByNetworkId(chatStatistics.getValue().first.first);
if (so)
{
CreatureObject * const character = so->asCreatureObject();
if (character)
{
GameServer::getInstance().deliverMessageToClientObject((*i), c.getByteStream());
}
break;
}
case constcrc("SetSyncStamp") :
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<uint16, uint32> > syncStampMessage(readIterator);
setSyncStamps(syncStampMessage.getValue().first, syncStampMessage.getValue().second);
break;
}
case constcrc("ChatOnChangeFriendStatus") :
{
ChatOnChangeFriendStatus chat(ri);
CommunityManager::handleMessage(chat);
break;
}
case constcrc("ChatOnGetFriendsList") :
{
ChatOnGetFriendsList chat(ri);
CommunityManager::handleMessage(chat);
break;
}
case constcrc("ChatOnChangeIgnoreStatus") :
{
ChatOnChangeIgnoreStatus chat(ri);
CommunityManager::handleMessage(chat);
break;
}
case constcrc("ChatOnGetIgnoreList") :
{
ChatOnGetIgnoreList chat(ri);
CommunityManager::handleMessage(chat);
break;
}
case constcrc("ChatStatisticsCS") :
{
GenericValueTypeMessage<std::pair<std::pair<NetworkId, int>, std::pair<int, int> > > chatStatistics(ri);
ServerObject * const so = ServerWorld::findObjectByNetworkId(chatStatistics.getValue().first.first);
if (so)
{
CreatureObject * const character = so->asCreatureObject();
if (character)
PlayerObject * const player = PlayerCreatureController::getPlayerObject(character);
if (player)
{
PlayerObject * const player = PlayerCreatureController::getPlayerObject(character);
if (player)
{
player->handleChatStatisticsFromChatServer(chatStatistics.getValue().first.first, chatStatistics.getValue().first.second, chatStatistics.getValue().second.first, chatStatistics.getValue().second.second);
}
player->handleChatStatisticsFromChatServer(chatStatistics.getValue().first.first, chatStatistics.getValue().first.second, chatStatistics.getValue().second.first, chatStatistics.getValue().second.second);
}
}
break;
}
case constcrc("RequestLoadPackedHouses") :
{
GenericValueTypeMessage<NetworkId> characterId(ri);
LOG("CustomerService", ("CharacterTransfer: ConnectionServerConnection received RequestLoadPackedHouses for %s", characterId.getValue().getValueString().c_str()));
}
else if (m.isType("RequestLoadPackedHouses"))
{
GenericValueTypeMessage<NetworkId> characterId(ri);
LOG("CustomerService", ("CharacterTransfer: ConnectionServerConnection received RequestLoadPackedHouses for %s", characterId.getValue().getValueString().c_str()));
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(characterId.getValue()));
if(character)
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(characterId.getValue()));
if(character)
{
int numHouses = 0;
numHouses = character->loadPackedHouses();
if (numHouses > 0)
{
int numHouses = 0;
numHouses = character->loadPackedHouses();
if (numHouses > 0)
character->setLoadCTSPackedHouses(true);
// add the objvar.
character->setObjVarItem("cts.packed_house_count", numHouses);
LOG("CustomerService", ("CharacterTransfer: starting %d packed house load for CTS character %s", numHouses, PlayerObject::getAccountDescription(character).c_str()));
}
else
{
// houses are loaded, go ahead and send the reply message
GenericValueTypeMessage<NetworkId> loadedMsg("PackedHousesLoaded", characterId.getValue());
send(loadedMsg, true);
LOG("CustomerService", ("CharacterTransfer: CTS character %s does not have any packed houses, so telling the connection server", PlayerObject::getAccountDescription(character).c_str()));
}
}
else
LOG("CustomerService", ("CharacterTransfer: character object was nullptr so unable to check if bank is loaded"));
}
else if (m.isType("RequestLoadCTSBank"))
{
GenericValueTypeMessage<NetworkId> characterId(ri);
LOG("CustomerService", ("CharacterTransfer: ConnectionServerConnection received RequestLoadCTSBank for %s", characterId.getValue().getValueString().c_str()));
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(characterId.getValue()));
if(character)
{
ServerObject *bankContainer = character->getBankContainer();
if (bankContainer)
{
if (!bankContainer->areContentsLoaded())
{
character->setLoadCTSPackedHouses(true);
// add the objvar.
character->setObjVarItem("cts.packed_house_count", numHouses);
LOG("CustomerService", ("CharacterTransfer: starting %d packed house load for CTS character %s", numHouses, PlayerObject::getAccountDescription(character).c_str()));
LOG("CustomerService", ("CharacterTransfer: setting LoadCTSBank flag and request bank to be loaded for %s", PlayerObject::getAccountDescription(character).c_str()));
character->setLoadCTSBank(true);
bankContainer->loadAllContentsFromDB();
}
else
{
// houses are loaded, go ahead and send the reply message
GenericValueTypeMessage<NetworkId> loadedMsg("PackedHousesLoaded", characterId.getValue());
send(loadedMsg, true);
LOG("CustomerService", ("CharacterTransfer: CTS character %s does not have any packed houses, so telling the connection server", PlayerObject::getAccountDescription(character).c_str()));
LOG("CustomerService", ("CharacterTransfer: bank contents already loaded for %s, sending ReplyBankCTSLoaded back to client", PlayerObject::getAccountDescription(character).c_str()));
//Bank contents are already loaded
GenericValueTypeMessage<NetworkId> reply("ReplyBankCTSLoaded", characterId.getValue());
send(reply, true);
}
}
else
LOG("CustomerService", ("CharacterTransfer: character object was nullptr so unable to check if bank is loaded"));
break;
LOG("CustomerService", ("CharacterTransfer: bank container object was nullptr for getBankContainer call"));
}
else
LOG("CustomerService", ("CharacterTransfer: character object was nullptr so unable to check if bank is loaded"));
}
else if (m.isType("RequestTransferData"))
{
GenericValueTypeMessage<TransferCharacterData> requestTransferData(ri);
const TransferCharacterData & transferCharacterData = requestTransferData.getValue();
CreatureObject * const character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(requestTransferData.getValue().getCharacterId()));
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(character);
time_t characterCreateTime = -1;
FreeCtsDataTable::FreeCtsInfo const * freeCtsInfo = nullptr;
bool freeCtsBypassTimeRestriction = false;
if (character && playerObject)
{
characterCreateTime = static_cast<time_t>(NameManager::getInstance().getPlayerCreateTime(character->getNetworkId()));
freeCtsInfo = FreeCtsDataTable::wouldCharacterTransferBeFree(characterCreateTime, static_cast<uint32>(transferCharacterData.getSourceStationId()), transferCharacterData.getSourceGalaxy(), static_cast<uint32>(transferCharacterData.getDestinationStationId()), transferCharacterData.getDestinationGalaxy(), false);
// see if we can/should bypass the free CTS time restriction
if (!freeCtsInfo && ConfigServerGame::getAllowIgnoreFreeCtsTimeRestriction() && (transferCharacterData.getTransferRequestSource() == TransferRequestMoveValidation::TRS_ingame_freects_command_transfer))
{
// if we got this far and the CTS request came from TRS_ingame_freects_command_transfer, then it
// should be allowed as a free CTS, so do another check bypassing the free CTS time restriction
// check to find any matching free CTS rule, even if the time restriction on the rule has expired
freeCtsInfo = FreeCtsDataTable::wouldCharacterTransferBeFree(characterCreateTime, static_cast<uint32>(transferCharacterData.getSourceStationId()), transferCharacterData.getSourceGalaxy(), static_cast<uint32>(transferCharacterData.getDestinationStationId()), transferCharacterData.getDestinationGalaxy(), true);
if (freeCtsInfo)
{
freeCtsBypassTimeRestriction = true;
}
}
}
case constcrc("RequestLoadCTSBank") :
LOG("CustomerService", ("CharacterTransfer: Received RequestTransferData for character [character create time (%s) free transfer (%s)] %s", ((characterCreateTime > 0) ? CalendarTime::convertEpochToTimeStringLocal(characterCreateTime).c_str() : "NA"), (freeCtsInfo ? (freeCtsBypassTimeRestriction ? "yes - bypass" : "yes") : "no "), transferCharacterData.toString().c_str()));
bool succeeded = false;
if(ServerWorld::getSceneId() != NewbieTutorial::getSceneId())
{
GenericValueTypeMessage<NetworkId> characterId(ri);
LOG("CustomerService", ("CharacterTransfer: ConnectionServerConnection received RequestLoadCTSBank for %s", characterId.getValue().getValueString().c_str()));
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(characterId.getValue()));
if(character)
{
ServerObject *bankContainer = character->getBankContainer();
if (bankContainer)
// get hair
std::string hairObjectTemplateName;
std::string hairObjectAppearanceData;
SlottedContainer * const container = ContainerInterface::getSlottedContainer(*character);
if(container)
{
if (!bankContainer->areContentsLoaded())
SlotId hairSlot = SlotIdManager::findSlotId(ConstCharCrcString("hair"));
if(hairSlot != SlotId::invalid)
{
LOG("CustomerService", ("CharacterTransfer: setting LoadCTSBank flag and request bank to be loaded for %s", PlayerObject::getAccountDescription(character).c_str()));
character->setLoadCTSBank(true);
bankContainer->loadAllContentsFromDB();
}
else
{
LOG("CustomerService", ("CharacterTransfer: bank contents already loaded for %s, sending ReplyBankCTSLoaded back to client", PlayerObject::getAccountDescription(character).c_str()));
//Bank contents are already loaded
GenericValueTypeMessage<NetworkId> reply("ReplyBankCTSLoaded", characterId.getValue());
send(reply, true);
Container::ContainerErrorCode containerErrorCode = Container::CEC_Success;
Container::ContainedItem hairItem = container->getObjectInSlot(hairSlot, containerErrorCode);
const TangibleObject * hairObject = dynamic_cast<const TangibleObject *>(hairItem.getObject());
if(hairObject)
{
hairObjectTemplateName = hairObject->getObjectTemplateName();
hairObjectAppearanceData = hairObject->getAppearanceData();
}
}
}
else
LOG("CustomerService", ("CharacterTransfer: bank container object was nullptr for getBankContainer call"));
}
else
LOG("CustomerService", ("CharacterTransfer: character object was nullptr so unable to check if bank is loaded"));
break;
}
case constcrc("RequestTransferData") :
{
GenericValueTypeMessage<TransferCharacterData> requestTransferData(ri);
const TransferCharacterData & transferCharacterData = requestTransferData.getValue();
CreatureObject * const character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(requestTransferData.getValue().getCharacterId()));
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(character);
time_t characterCreateTime = -1;
FreeCtsDataTable::FreeCtsInfo const * freeCtsInfo = nullptr;
bool freeCtsBypassTimeRestriction = false;
if (character && playerObject)
{
characterCreateTime = static_cast<time_t>(NameManager::getInstance().getPlayerCreateTime(character->getNetworkId()));
freeCtsInfo = FreeCtsDataTable::wouldCharacterTransferBeFree(characterCreateTime, static_cast<uint32>(transferCharacterData.getSourceStationId()), transferCharacterData.getSourceGalaxy(), static_cast<uint32>(transferCharacterData.getDestinationStationId()), transferCharacterData.getDestinationGalaxy(), false);
// see if we can/should bypass the free CTS time restriction
if (!freeCtsInfo && ConfigServerGame::getAllowIgnoreFreeCtsTimeRestriction() && (transferCharacterData.getTransferRequestSource() == TransferRequestMoveValidation::TRS_ingame_freects_command_transfer))
std::string professionName;
const CreatureObject::SkillList & skills = character->getSkillList();
if (!skills.empty())
{
// if we got this far and the CTS request came from TRS_ingame_freects_command_transfer, then it
// should be allowed as a free CTS, so do another check bypassing the free CTS time restriction
// check to find any matching free CTS rule, even if the time restriction on the rule has expired
freeCtsInfo = FreeCtsDataTable::wouldCharacterTransferBeFree(characterCreateTime, static_cast<uint32>(transferCharacterData.getSourceStationId()), transferCharacterData.getSourceGalaxy(), static_cast<uint32>(transferCharacterData.getDestinationStationId()), transferCharacterData.getDestinationGalaxy(), true);
for (CreatureObject::SkillList::const_iterator i = skills.begin(); i != skills.end(); ++i)
{
const SkillObject * profession = (*i)->findProfessionForSkill();
if (profession != nullptr)
professionName = profession->getSkillName();
}
}
if (professionName.empty())
{
// just get the 1st profession available
PlayerCreationManager::StringVector professions;
PlayerCreationManager::getProfessionVector (professions, "");
if (! professions.empty())
{
professionName = professions[0];
}
}
if (playerObject)
{
// set objvar on the creature indicating that transfer will be free,
// so that script can include the information in the packed dictionary
// so that the information can be transferred to the destination galaxy
// indicating that it's a free transfer
character->removeObjVarItem("freeCtsTransactionRuleName");
if (freeCtsInfo)
IGNORE_RETURN(character->setObjVarItem("freeCtsTransactionRuleName", (freeCtsInfo->ruleName.empty() ? "freeCts" : freeCtsInfo->ruleName)));
std::vector<unsigned char> dictionaryData = character->uploadCharacterData(transferCharacterData.getWithItems(), transferCharacterData.getAllowOverride());
character->removeObjVarItem("freeCtsTransactionRuleName");
if(! dictionaryData.empty())
{
freeCtsBypassTimeRestriction = true;
}
}
}
LOG("CustomerService", ("CharacterTransfer: Received RequestTransferData for character [character create time (%s) free transfer (%s)] %s", ((characterCreateTime > 0) ? CalendarTime::convertEpochToTimeStringLocal(characterCreateTime).c_str() : "NA"), (freeCtsInfo ? (freeCtsBypassTimeRestriction ? "yes - bypass" : "yes") : "no "), transferCharacterData.toString().c_str()));
bool succeeded = false;
if(ServerWorld::getSceneId() != NewbieTutorial::getSceneId())
{
if(character)
{
// get hair
std::string hairObjectTemplateName;
std::string hairObjectAppearanceData;
SlottedContainer * const container = ContainerInterface::getSlottedContainer(*character);
if(container)
{
SlotId hairSlot = SlotIdManager::findSlotId(ConstCharCrcString("hair"));
if(hairSlot != SlotId::invalid)
{
Container::ContainerErrorCode containerErrorCode = Container::CEC_Success;
Container::ContainedItem hairItem = container->getObjectInSlot(hairSlot, containerErrorCode);
const TangibleObject * hairObject = dynamic_cast<const TangibleObject *>(hairItem.getObject());
if(hairObject)
{
hairObjectTemplateName = hairObject->getObjectTemplateName();
hairObjectAppearanceData = hairObject->getAppearanceData();
}
}
}
std::string professionName;
const CreatureObject::SkillList & skills = character->getSkillList();
if (!skills.empty())
{
for (CreatureObject::SkillList::const_iterator i = skills.begin(); i != skills.end(); ++i)
{
const SkillObject * profession = (*i)->findProfessionForSkill();
if (profession != nullptr)
professionName = profession->getSkillName();
}
}
if (professionName.empty())
{
// just get the 1st profession available
PlayerCreationManager::StringVector professions;
PlayerCreationManager::getProfessionVector (professions, "");
if (! professions.empty())
{
professionName = professions[0];
}
}
if (playerObject)
{
// set objvar on the creature indicating that transfer will be free,
// so that script can include the information in the packed dictionary
// so that the information can be transferred to the destination galaxy
// indicating that it's a free transfer
character->removeObjVarItem("freeCtsTransactionRuleName");
if (freeCtsInfo)
IGNORE_RETURN(character->setObjVarItem("freeCtsTransactionRuleName", (freeCtsInfo->ruleName.empty() ? "freeCts" : freeCtsInfo->ruleName)));
std::vector<unsigned char> dictionaryData = character->uploadCharacterData(transferCharacterData.getWithItems(), transferCharacterData.getAllowOverride());
character->removeObjVarItem("freeCtsTransactionRuleName");
if(! dictionaryData.empty())
{
// send the response to the Connection server
TransferCharacterData replyData(transferCharacterData);
replyData.setCustomizationData(character->getAppearanceData());
replyData.setScriptDictionaryData(dictionaryData);
replyData.setObjectTemplateName(character->getObjectTemplateName());
replyData.setObjectTemplateCrc(character->getTemplateCrc());
replyData.setScaleFactor(character->getScaleFactor());
replyData.setHairTemplateName(hairObjectTemplateName);
replyData.setHairAppearanceData(hairObjectAppearanceData);
replyData.setProfession(professionName);
replyData.setSkillTemplate(playerObject->getSkillTemplate());
replyData.setWorkingSkill(playerObject->getWorkingSkill());
GenericValueTypeMessage<TransferCharacterData> reply("ReplyTransferData", replyData);
send(reply, true);
succeeded = true;
}
else
{
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not retrieve dictionary for character object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
}
// send the response to the Connection server
TransferCharacterData replyData(transferCharacterData);
replyData.setCustomizationData(character->getAppearanceData());
replyData.setScriptDictionaryData(dictionaryData);
replyData.setObjectTemplateName(character->getObjectTemplateName());
replyData.setObjectTemplateCrc(character->getTemplateCrc());
replyData.setScaleFactor(character->getScaleFactor());
replyData.setHairTemplateName(hairObjectTemplateName);
replyData.setHairAppearanceData(hairObjectAppearanceData);
replyData.setProfession(professionName);
replyData.setSkillTemplate(playerObject->getSkillTemplate());
replyData.setWorkingSkill(playerObject->getWorkingSkill());
GenericValueTypeMessage<TransferCharacterData> reply("ReplyTransferData", replyData);
send(reply, true);
succeeded = true;
}
else
{
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not load player object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not retrieve dictionary for character object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
}
}
else
{
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not load character object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not load player object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
}
}
else
{
LOG("CustomerService", ("CharacterTransfer: Transfer failed: transfers from the Tutorial are not allowed. %s", transferCharacterData.toString().c_str()));
LOG("CustomerService", ("CharacterTransfer: Transfer failed: Could not load character object (%s) for transfer request. %s", requestTransferData.getValue().getCharacterId().getValueString().c_str(), requestTransferData.getValue().toString().c_str()));
}
if(! succeeded)
{
GenericValueTypeMessage<TransferCharacterData> reply("ReplyTransferDataFail", requestTransferData.getValue());
send(reply, true);
}
break;
}
case constcrc("ApplyTransferData") :
else
{
GenericValueTypeMessage<TransferCharacterData> applyTransferData(ri);
LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferData for character %s", applyTransferData.getValue().toString().c_str()));
const TransferCharacterData & transferCharacterData = applyTransferData.getValue();
LOG("CustomerService", ("CharacterTransfer: Transfer failed: transfers from the Tutorial are not allowed. %s", transferCharacterData.toString().c_str()));
}
if(! succeeded)
{
GenericValueTypeMessage<TransferCharacterData> reply("ReplyTransferDataFail", requestTransferData.getValue());
send(reply, true);
}
}
else if (m.isType("ApplyTransferData"))
{
GenericValueTypeMessage<TransferCharacterData> applyTransferData(ri);
LOG("CustomerService", ("CharacterTransfer: Received ApplyTransferData for character %s", applyTransferData.getValue().toString().c_str()));
const TransferCharacterData & transferCharacterData = applyTransferData.getValue();
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(transferCharacterData.getDestinationCharacterId()));
if(character)
CreatureObject * character = dynamic_cast<CreatureObject *>(NetworkIdManager::getObjectById(transferCharacterData.getDestinationCharacterId()));
if(character)
{
if(character->receiveCharacterTransferMessage(transferCharacterData.getScriptDictionaryData()))
{
if(character->receiveCharacterTransferMessage(transferCharacterData.getScriptDictionaryData()))
{
// force CTS failure if the source character has this objvar (which has now been
// transferred to the target character); this is for testing CTS failure handing
if (character->getObjVars().hasItem("testing_only_force_cts_failure_testing_only"))
{
GenericValueTypeMessage<TransferCharacterData> applyTransferDataFail("ApplyTransferDataFail", transferCharacterData);
send(applyTransferDataFail, true);
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Character has testing_only_force_cts_failure_testing_only objvar, sending ApplyTransferDataFail to central %s", applyTransferData.getValue().toString().c_str()));
}
else
{
GenericValueTypeMessage<TransferCharacterData> applyTransferDataSuccess("ApplyTransferDataSuccess", transferCharacterData);
send(applyTransferDataSuccess, true);
LOG("CustomerService", ("CharacterTransfer: Sending ApplyTransferDataSuccess for character %s", applyTransferData.getValue().toString().c_str()));
}
}
else
// force CTS failure if the source character has this objvar (which has now been
// transferred to the target character); this is for testing CTS failure handing
if (character->getObjVars().hasItem("testing_only_force_cts_failure_testing_only"))
{
GenericValueTypeMessage<TransferCharacterData> applyTransferDataFail("ApplyTransferDataFail", transferCharacterData);
send(applyTransferDataFail, true);
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Sending ApplyTransferDataFail for character %s", applyTransferData.getValue().toString().c_str()));
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Character has testing_only_force_cts_failure_testing_only objvar, sending ApplyTransferDataFail to central %s", applyTransferData.getValue().toString().c_str()));
}
else
{
GenericValueTypeMessage<TransferCharacterData> applyTransferDataSuccess("ApplyTransferDataSuccess", transferCharacterData);
send(applyTransferDataSuccess, true);
LOG("CustomerService", ("CharacterTransfer: Sending ApplyTransferDataSuccess for character %s", applyTransferData.getValue().toString().c_str()));
}
}
else
{
GenericValueTypeMessage<TransferCharacterData> applyTransferDataFail("ApplyTransferDataFail", transferCharacterData);
send(applyTransferDataFail, true);
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Could not find object for character, sending ApplyTransferDataFail to central %s", applyTransferData.getValue().toString().c_str()));
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Sending ApplyTransferDataFail for character %s", applyTransferData.getValue().toString().c_str()));
}
break;
}
case constcrc("ChatEnterRoomValidationRequest") :
else
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<std::pair<NetworkId, std::string>, unsigned int> > const cervreq(readIterator);
unsigned int result = CHATRESULT_SUCCESS;
ServerObject const * const o = ServerWorld::findObjectByNetworkId(cervreq.getValue().first.first);
CreatureObject const * const co = (o ? o->asCreatureObject() : nullptr);
if (co)
{
result = Chat::isAllowedToEnterRoom(*co, cervreq.getValue().first.second);
}
else
{
result = SWG_CHAT_ERR_INVALID_OBJECT;
}
GenericValueTypeMessage<std::pair<std::pair<NetworkId, unsigned int>, unsigned int> > const cervresp(
"ChatEnterRoomValidationResponse",
std::make_pair(
std::make_pair(cervreq.getValue().first.first, result),
cervreq.getValue().second));
send(cervresp, true);
break;
GenericValueTypeMessage<TransferCharacterData> applyTransferDataFail("ApplyTransferDataFail", transferCharacterData);
send(applyTransferDataFail, true);
LOG("CustomerService", ("CharacterTransfer: *** ERROR: Could not find object for character, sending ApplyTransferDataFail to central %s", applyTransferData.getValue().toString().c_str()));
}
case constcrc("ChatQueryRoomValidationRequest") :
}
else if (m.isType("ChatEnterRoomValidationRequest"))
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<std::pair<NetworkId, std::string>, unsigned int> > const cervreq(readIterator);
unsigned int result = CHATRESULT_SUCCESS;
ServerObject const * const o = ServerWorld::findObjectByNetworkId(cervreq.getValue().first.first);
CreatureObject const * const co = (o ? o->asCreatureObject() : nullptr);
if (co)
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<std::pair<NetworkId, std::string>, unsigned int> > const cqrvreq(readIterator);
bool success = false;
ServerObject const * const o = ServerWorld::findObjectByNetworkId(cqrvreq.getValue().first.first);
CreatureObject const * const co = (o ? o->asCreatureObject() : nullptr);
if (co)
{
success = (CHATRESULT_SUCCESS == Chat::isAllowedToEnterRoom(*co, cqrvreq.getValue().first.second));
}
GenericValueTypeMessage<std::pair<std::pair<NetworkId, bool>, unsigned int> > const cqrvresp(
"ChatQueryRoomValidationResponse",
std::make_pair(
std::make_pair(cqrvreq.getValue().first.first, success),
cqrvreq.getValue().second));
send(cqrvresp, true);
break;
result = Chat::isAllowedToEnterRoom(*co, cervreq.getValue().first.second);
}
case constcrc("PlayerDroppedFromGameServerCrash") :
else
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::set<NetworkId> > const m(readIterator);
std::map<NetworkId, LfgCharacterData> const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData();
std::map<NetworkId, Unicode::String> const & connectedCharacterBiographyData = ServerUniverse::getConnectedCharacterBiographyData();
std::set<NetworkId>::const_iterator const end = m.getValue().end();
for (std::set<NetworkId>::const_iterator iter = m.getValue().begin(); iter != end; ++iter)
{
if (connectedCharacterLfgData.count(*iter) > 0)
ServerUniverse::removeConnectedCharacterData(*iter);
if (connectedCharacterBiographyData.count(*iter) > 0)
ServerUniverse::removeConnectedCharacterBiographyData(*iter);
}
break;
result = SWG_CHAT_ERR_INVALID_OBJECT;
}
default :
GenericValueTypeMessage<std::pair<std::pair<NetworkId, unsigned int>, unsigned int> > const cervresp(
"ChatEnterRoomValidationResponse",
std::make_pair(
std::make_pair(cervreq.getValue().first.first, result),
cervreq.getValue().second));
send(cervresp, true);
}
else if (m.isType("ChatQueryRoomValidationRequest"))
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::pair<std::pair<NetworkId, std::string>, unsigned int> > const cqrvreq(readIterator);
bool success = false;
ServerObject const * const o = ServerWorld::findObjectByNetworkId(cqrvreq.getValue().first.first);
CreatureObject const * const co = (o ? o->asCreatureObject() : nullptr);
if (co)
{
ServerConnection::emitMessage(m);
break;
success = (CHATRESULT_SUCCESS == Chat::isAllowedToEnterRoom(*co, cqrvreq.getValue().first.second));
}
GenericValueTypeMessage<std::pair<std::pair<NetworkId, bool>, unsigned int> > const cqrvresp(
"ChatQueryRoomValidationResponse",
std::make_pair(
std::make_pair(cqrvreq.getValue().first.first, success),
cqrvreq.getValue().second));
send(cqrvresp, true);
}
else if (m.isType("PlayerDroppedFromGameServerCrash"))
{
Archive::ReadIterator readIterator = message.begin();
GenericValueTypeMessage<std::set<NetworkId> > const m(readIterator);
std::map<NetworkId, LfgCharacterData> const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData();
std::map<NetworkId, Unicode::String> const & connectedCharacterBiographyData = ServerUniverse::getConnectedCharacterBiographyData();
std::set<NetworkId>::const_iterator const end = m.getValue().end();
for (std::set<NetworkId>::const_iterator iter = m.getValue().begin(); iter != end; ++iter)
{
if (connectedCharacterLfgData.count(*iter) > 0)
ServerUniverse::removeConnectedCharacterData(*iter);
if (connectedCharacterBiographyData.count(*iter) > 0)
ServerUniverse::removeConnectedCharacterBiographyData(*iter);
}
}
else
{
ServerConnection::emitMessage(m);
}
}