BString ObjectController::handleCancelShutdownGalaxy(BString message) const { int8 replyData[128]; if (!AdminManager::Instance()->shutdownPending()) { sprintf(replyData,"No shutdown in progress"); } else { sprintf(replyData,"OK"); // We have no idea of how much white space are inserted in string... BString ansiData; int32 index = indexOfFirstField(message); if (index < 0) { // We may not have any "next field", it's optional here. index = 0; ansiData = ""; } else { // Now we can get the broadcaste from the message. // Remove first field from message. ansiData.setLength(message.getLength()); message.substring(ansiData, static_cast<uint16>(index), message.getLength()); } // Send request to all zones, via chatserver. this->cancelScheduledShutdown(ansiData); } return replyData; }
BString ObjectController::handleBroadcastGalaxy(BString message) const { int8* replyStr = "OK"; int8 rawData[128]; // We have no idea of how much white space are inserted in string... int32 index = indexOfFirstField(message); if (index >= 0) { // Now we can get the broadcast from the message. // Remove white space from start of message. BString ansiData; ansiData.setLength(message.getLength()); message.substring(ansiData, static_cast<uint16>(index), message.getLength()); // Any valid message? int32 elementCount = sscanf(ansiData.getAnsi(), "%80s", rawData); if (elementCount > 0) { this->broadcastGalaxyMessage(ansiData, -1); } else { replyStr = "No broadcast supplied"; } } else { replyStr = "No valid broadcast supplied"; } return replyStr; }
void ChatMessageLib::sendChatRoomList(DispatchClient* client, ChannelList* list) const { ChannelList::iterator iter = list->begin(); gMessageFactory->StartMessage(); gMessageFactory->addUint32(opChatRoomlist); gMessageFactory->addUint32(list->size()); while (iter != list->end()) { gMessageFactory->addUint32((*iter)->getId()); gMessageFactory->addUint32((uint32)(*iter)->isPrivate()); gMessageFactory->addUint8((*iter)->isModerated()); BString roomPathName = "SWG."; roomPathName << (*iter)->getGalaxy().getAnsi() << "."; roomPathName << (*iter)->getName().getAnsi(); gMessageFactory->addString(roomPathName); gMessageFactory->addString(SWG); gMessageFactory->addString((*iter)->getGalaxy()); #ifdef DISP_REAL_FIRST_NAME BString* name = (ChatManager::getSingletonPtr()->getFirstName((BString &)((*iter)->getOwner()->getLoweredName()))); if (name->getLength() == 0) { gMessageFactory->addString((*iter)->getOwner()->getLoweredName()); } else { gMessageFactory->addString(*name); } #else gMessageFactory->addString((*iter)->getOwner()->getLoweredName()); #endif gMessageFactory->addString(SWG); gMessageFactory->addString((*iter)->getGalaxy()); #ifdef DISP_REAL_FIRST_NAME name = (ChatManager::getSingletonPtr()->getFirstName((BString &)((*iter)->getCreator()->getLoweredName()))); if (name->getLength() == 0) { gMessageFactory->addString((*iter)->getCreator()->getLoweredName()); } else { gMessageFactory->addString(*name); } #else gMessageFactory->addString((*iter)->getCreator()->getLoweredName()); #endif gMessageFactory->addString((*iter)->getTitle()); gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); ++iter; } Message* message = gMessageFactory->EndMessage(); client->SendChannelA(message, client->getAccountId(), CR_Client, 2); }
void ObjectController::_handleSetWaypointName(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); BString name; Datapad* datapad = player->getDataPad(); WaypointObject* waypoint = datapad->getWaypointById(targetId); int8 sql[1024],restStr[64],*sqlPointer; if(waypoint == NULL) { DLOG(info) << "ObjController::handlesetwaypointname: could not find waypoint "<< targetId; return; } message->getStringUnicode16(name); if(!(name.getLength())) return; waypoint->setName(name); name.convert(BSTRType_ANSI); sprintf(sql,"UPDATE %s.waypoints SET name='",mDatabase->galaxy()); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->escapeString(sqlPointer,name.getAnsi(),name.getLength()); sprintf(restStr,"' WHERE waypoint_id=%" PRIu64 "",targetId); strcat(sql,restStr); mDatabase->executeSqlAsync(NULL,NULL,sql); gMessageLib->sendUpdateWaypoint(waypoint,ObjectUpdateChange,player); }
void ChatMessageLib::sendGroupSystemMessage(BString name, BString pointer, Player* target, GroupObject* group, bool unicode) const { name.convert(BSTRType_Unicode16); uint32 pointerLength = (uint32)ceil((double)(pointer.getLength() / 2)); Message* newMessage; gMessageFactory->StartMessage(); gMessageFactory->addUint32(opChatSystemMessage); gMessageFactory->addUint8(0); gMessageFactory->addUint32(0); gMessageFactory->addUint32(45 + pointerLength + name.getLength()); gMessageFactory->addUint16(1); gMessageFactory->addUint8(1); gMessageFactory->addUint32(0xffffffff); gMessageFactory->addString(BString("group")); gMessageFactory->addUint32(0); gMessageFactory->addString(pointer); gMessageFactory->addUint64(0); gMessageFactory->addUint64(0); if(unicode) { gMessageFactory->addString(name); gMessageFactory->addUint32(0); gMessageFactory->addUint64(0); gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); } else { gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); gMessageFactory->addUint64(0); gMessageFactory->addUint32(0); gMessageFactory->addString(name); } gMessageFactory->addUint64(0); gMessageFactory->addUint64(0); gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); gMessageFactory->addUint16(0); newMessage = gMessageFactory->EndMessage(); if(group == NULL) { target->getClient()->SendChannelA(newMessage, target->getClient()->getAccountId(), CR_Client, 5); } else { group->broadcastMessage(newMessage); } }
BString ObjectController::handleShutdownGalaxy(BString message) const { int8 replyData[128]; if (AdminManager::Instance()->shutdownPending()) { sprintf(replyData,"Shutdown already in progress"); } else { sprintf(replyData,"OK"); // Get time for shutdown // int32 minutesToShutdown; int32 elementCount = sscanf(message.getAnsi(), "%3d", &minutesToShutdown); // string planet(rawData); if (elementCount > 0) { // We have no idea of how much white space are inserted in string... BString ansiData; int32 index = indexOfNextField(message); if (index < 0) { // We may not have any "next field", it's optional here. index = 0; ansiData = ""; } else { // Now we can get the broadcaste from the message. // Remove first field from message. ansiData.setLength(message.getLength()); message.substring(ansiData, static_cast<uint16>(index), message.getLength()); } // Validate the timeout. if (minutesToShutdown >= 0) { // Any valid message? int8 rawData[128]; elementCount = sscanf(ansiData.getAnsi(), "%80s", rawData); // Send request to all zones, via chatserver. this->scheduleShutdown(minutesToShutdown*60, ansiData); } else { sprintf(replyData,"%d is not valid shutdown time", minutesToShutdown); } } else { sprintf(replyData,"No shutdown time supplied"); } } return replyData; }
BString ObjectController::handleBroadcastPlanet(BString message) const { // Get planet name int8 rawData[128]; rawData[0] = 0; int32 elementCount = sscanf(message.getAnsi(), "%80s", rawData); BString planet(rawData); if (elementCount > 0) { // Yes. Validate the planet name. int32 planetId = gWorldManager->getPlanetIdByNameLike(planet); if (planetId >= 0) { // We have no idea of how much white space are inserted in string... int32 index = indexOfNextField(message); if (index > 0) { // Now we can get the broadcaste from the message. // Remove planet name from message. BString ansiData; ansiData.setLength(message.getLength()); message.substring(ansiData, static_cast<uint16>(index), message.getLength()); // Any valid message? elementCount = sscanf(ansiData.getAnsi(), "%80s", rawData); if (elementCount > 0) { // string planetName(gWorldManager->getPlanetNameById(planetId)); this->broadcastGalaxyMessage(ansiData, planetId); sprintf(rawData,"OK"); } else { sprintf(rawData,"No broadcast supplied"); } } else { sprintf(rawData,"No valid broadcast supplied"); } } else { sprintf(rawData,"%s is not valid planet name", planet.getAnsi()); } } else { sprintf(rawData,"Missing planet name"); } return rawData; }
BString ObjectController::removeWhiteSpace(BString str) const { int32 index = indexOfFirstField(str); if (index > 0) { // Remove white space from start of message. BString resultStr; resultStr.setLength(str.getLength()); str.substring(resultStr, static_cast<uint16>(index), str.getLength()); return resultStr; } // Nothing we can do about that string... good or bad. return str; }
void ChatMessageLib::sendChatOnCreateRoom(DispatchClient* client, Channel* channel, uint32 requestId) const { gMessageFactory->StartMessage(); gMessageFactory->addUint32(opChatOnCreateRoom); gMessageFactory->addUint32(0); gMessageFactory->addUint32(channel->getId()); gMessageFactory->addUint32((uint32)channel->isPrivate()); gMessageFactory->addUint8(channel->isModerated()); gMessageFactory->addString(channel->getFullPath()); gMessageFactory->addString(SWG); gMessageFactory->addString(channel->getGalaxy()); #ifdef DISP_REAL_FIRST_NAME BString* name = (ChatManager::getSingletonPtr()->getFirstName((BString &)(channel->getOwner()->getLoweredName()))); if (name->getLength() == 0) { gMessageFactory->addString(channel->getOwner()->getLoweredName()); } else { gMessageFactory->addString(*name); } #else gMessageFactory->addString(channel->getOwner()->getLoweredName()); #endif gMessageFactory->addString(SWG); gMessageFactory->addString(channel->getGalaxy()); #ifdef DISP_REAL_FIRST_NAME name = (ChatManager::getSingletonPtr()->getFirstName((BString &)(channel->getCreator()->getLoweredName()))); if (name->getLength() == 0) { gMessageFactory->addString(channel->getCreator()->getLoweredName()); } else { gMessageFactory->addString(*name); } #else gMessageFactory->addString(channel->getCreator()->getLoweredName()); #endif gMessageFactory->addString(channel->getTitle()); gMessageFactory->addUint32(0); gMessageFactory->addUint32(0); gMessageFactory->addUint32(requestId); Message* message = gMessageFactory->EndMessage(); client->SendChannelA(message, client->getAccountId(), CR_Client, 4); }
BString ObjectController::skipToNextField(BString str) const { int32 index = indexOfNextField(str); if (index < 0) { // Not all commands have payload. index = str.getLength(); } // Remove white space from start of message. BString resultStr; resultStr.setLength(str.getLength()); str.substring(resultStr, static_cast<uint16>(index), str.getLength()); return resultStr; }
BString ObjectController::handleBroadcast(BString message) const { int8 rawData[128]; int8* replyStr = "OK"; if (message.getLength()) { // Any valid message? int32 elementCount = sscanf(message.getAnsi(), "%80s", rawData); if (elementCount > 0) { message.convert(BSTRType_Unicode16); PlayerAccMap::const_iterator it = gWorldManager->getPlayerAccMap()->begin(); while(it != gWorldManager->getPlayerAccMap()->end()) { const PlayerObject* const player = (*it).second; if (player->isConnected()) { gMessageLib->SendSystemMessage(message.getUnicode16(), player); } ++it; } } else { replyStr = "No broadcast supplied"; } } else { replyStr = "No broadcast supplied"; } return replyStr; }
bool MessageLib::sendXpUpdate(uint32 xpType,PlayerObject* playerObject) { if(!(playerObject->isConnected())) return(false); // We must be able to set the value of 0, when we use up all xp. BString xpTypeName = gSkillManager->getXPTypeById(xpType); mMessageFactory->StartMessage(); mMessageFactory->addUint32(opDeltasMessage); mMessageFactory->addUint64(playerObject->getId()); mMessageFactory->addUint32(opPLAY); mMessageFactory->addUint8(8); mMessageFactory->addUint32(19 + xpTypeName.getLength()); mMessageFactory->addUint16(1); mMessageFactory->addUint16(0); mMessageFactory->addUint32(1); mMessageFactory->addUint32(++playerObject->mXpUpdateCounter); mMessageFactory->addUint8(2); mMessageFactory->addString(xpTypeName); mMessageFactory->addInt32(playerObject->getXpAmount(xpType)); (playerObject->getClient())->SendChannelA(mMessageFactory->EndMessage(),playerObject->getAccountId(),CR_Client,5); return(true); }
void ObjectController::sendAdminFeedback(BString reply) const { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if ((player) && (player->isConnected())) { if (reply.getLength()) { reply.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true); } else { DLOG(info) << "Admin :" << player->getFirstName().getAnsi(); } } else { if (reply.getDataLength()) { DLOG(info) << "Admin (anon): " << reply.getAnsi(); } else { } } }
void ObjectController::broadcastGalaxyMessage(BString theBroadcast, int32 planetId) const { if (theBroadcast.getLength()) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if (player) { theBroadcast.convert(BSTRType_Unicode16); // let the chatserver handle this. Message* newMessage; gMessageFactory->StartMessage(); gMessageFactory->addUint32(opIsmBroadcastGalaxy); gMessageFactory->addUint32(planetId); gMessageFactory->addString(theBroadcast); newMessage = gMessageFactory->EndMessage(); player->getClient()->SendChannelA(newMessage,player->getAccountId(),CR_Chat,2); //this should be fastpath as not being Mission critical and we want to prevent the communication protocol overhead with Acks and resends // Convert since we are going to print it. // theBroadcast.convert(BSTRType_ANSI); } } }
void ObjectController::sendAdminFeedback(BString reply) const { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if ((player) && (player->isConnected())) { if (reply.getLength()) { gLogger->log(LogManager::NOTICE,"Admin (%s): %s", player->getFirstName().getAnsi(), reply.getAnsi()); reply.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true); } else { gLogger->log(LogManager::NOTICE,"Admin (%s):", player->getFirstName().getAnsi()); } } else { if (reply.getDataLength()) { gLogger->log(LogManager::NOTICE,"Admin (anon): %s", reply.getAnsi()); } else { gLogger->log(LogManager::NOTICE,"Admin (anon):"); } } }
std::string MedicHandlerHelpers::handleMessage(Message* message, std::string regexPattern) { // Read the message out of the packet. BString tmp; message->getStringUnicode16(tmp); // If the string has no length the message is ill-formatted, send the // proper format to the client. if (!tmp.getLength()) return ""; // Convert the string to an ansi string for ease with the regex. tmp.convert(BSTRType_ANSI); std::string input_string(tmp.getAnsi()); static const regex pattern(regexPattern); smatch result; regex_search(input_string, result, pattern); // Gather the results of the pattern for validation and use. std::string messageType(result[1]); if (messageType.length() > 0) { return messageType; } return ""; }
void AdminManager::cancelAdminRequest(uint64 requestType, BString message) { // We will only handle one request at the time for each type. gWorldManager->cancelAdminRequest(static_cast<uint8>(requestType)); // Even though map's fix duplicate issues, the lower level implementation may change. AdminRequests::iterator adminRequestIterator = mAdminRequests.find(requestType); if (adminRequestIterator != mAdminRequests.end()) { delete ((*adminRequestIterator).second); mAdminRequests.erase(adminRequestIterator); message.convert(BSTRType_Unicode16); PlayerAccMap::const_iterator it = gWorldManager->getPlayerAccMap()->begin(); while (it != gWorldManager->getPlayerAccMap()->end()) { const PlayerObject* const player = (*it).second; if (player->isConnected()) { gMessageLib->SendSystemMessage(L"", player); if (message.getLength()) { gMessageLib->SendSystemMessage(message.getUnicode16(), player); } } ++it; } } mPendingShutdown = false; }
int32 ObjectController::indexOfNextField(const BString message) const { int32 index = -1; int8 *ptr = message.getRawData(); bool foundStart = false; bool foundEnd = false; for (int32 i = 0; i < (int32)message.getLength(); i++) { if (!foundStart) { if (!isspace(*ptr++)) { foundStart = true; } } else if (!foundEnd) { if (isspace(*ptr++)) { // we are done with the first field foundEnd = true; } } else { // Find the start of next field. if (!isspace(*ptr++)) { index = i; break; } } } return index; }
void TreasuryManager::bankTipOffline(int32 amount,PlayerObject* playerObject,BString targetName) { //============================================ //check whether we have sufficient funds //dont forget the surcharge Bank* bank = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank)); int32 credits = bank->getCredits(); int32 surcharge = (int32)((amount/100)*5); if((amount + surcharge) > credits) { BString uniName = targetName; uniName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_nsf_bank", L"", L"", uniName.getUnicode16(), amount), playerObject); return; } //now get the player int8 name[50]; mDatabase->Escape_String(name,targetName.getAnsi(),targetName.getLength()); int8 sql[256]; sprintf(sql,"SELECT id FROM characters WHERE firstname like '%s'",name); TreasuryManagerAsyncContainer* asyncContainer; asyncContainer = new TreasuryManagerAsyncContainer(TREMQuery_BankTipgetId,playerObject->getClient()); asyncContainer->amount = amount; asyncContainer->surcharge = surcharge; asyncContainer->targetName = targetName; asyncContainer->player = playerObject; mDatabase->ExecuteSqlAsync(this,asyncContainer,sql); }
//====================================================================================================================== // // Modifies the Admin List // void ObjectController::_handleNameStructure(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { // requirement we have the structure targeted AND give the name of the recipient on the commandline // OR we have the recipient targeted and stand NEXT to the structure were about to transfer //do we have a valid donor ? CreatureObject* creature = dynamic_cast<CreatureObject*>(mObject); PlayerObject* player = creature->GetGhost(); if(!player) { return; } //do we have a valid structure ??? check our target first uint64 id = player->GetCreature()->getTargetId(); Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0); if(glm::distance(player->GetCreature()->mPosition, structure->mPosition) > fTransferDistance) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } //find out where our structure is BString dataStr; message->getStringUnicode16(dataStr); BString nameStr; dataStr.convert(BSTRType_ANSI); sscanf(dataStr.getAnsi(),"%s",nameStr.getAnsi()); if(nameStr.getLength() > 68) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "not_valid_name"), player); return; } StructureAsyncCommand command; command.Command = Structure_Command_RenameStructure; command.PlayerId = player->getId(); command.StructureId = structure->getId(); gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->GetCreature()->getFirstName(),"ADMIN",command); }
void MessageFactory::addString(const BString& data) { // Make sure we've called StartMessage() assert(mCurrentMessage && "Must call StartMessage before adding data"); // Adjust start bounds if necessary. _adjustHeapStartBounds(data.getDataLength()); // Insert our data and move our end pointer. switch(data.getType()) { case BSTRType_UTF8: case BSTRType_ANSI: { // First insert the string length *((uint16*)mCurrentMessageEnd) = data.getLength(); mCurrentMessageEnd += 2; memcpy(mCurrentMessageEnd, data.getAnsi(), data.getLength()); mCurrentMessageEnd += data.getLength(); } break; case BSTRType_Unicode16: { // First insert the string length *((uint32*)mCurrentMessageEnd) = data.getLength(); mCurrentMessageEnd += 4; memcpy(mCurrentMessageEnd, data.getUnicode16(), data.getLength() * 2); mCurrentMessageEnd += data.getLength() * 2; } break; } }
void CSRManager::_processCreateTicketMessage( Message* message, DispatchClient* client ) { BString playername; BString comment; BString info; BString harrassinguser; BString language; message->getStringAnsi(playername); uint32 category = message->getUint32(); uint32 subcategory = message->getUint32(); message->getStringUnicode16(comment); message->getStringUnicode16(info); message->getStringUnicode16(harrassinguser); message->getStringAnsi(language); /*uint32 errorcode = */ message->getUint32(); uint8 bugreport = message->getUint8(); comment.convert(BSTRType_ANSI); info.convert(BSTRType_ANSI);; harrassinguser.convert(BSTRType_ANSI); CSRAsyncContainer* asyncContainer = new CSRAsyncContainer(CSRQuery_NewTicket); asyncContainer->mClient = client; int8 cleanPlayer[4000], cleanComment[4000], cleanInfo[4000], cleanHarrasser[4000], cleanLanguage[4000]; mDatabase->Escape_String(cleanPlayer, playername.getAnsi(), playername.getLength()); mDatabase->Escape_String(cleanInfo, info.getAnsi(), info.getLength()); mDatabase->Escape_String(cleanComment, comment.getAnsi(), comment.getLength()); mDatabase->Escape_String(cleanHarrasser, harrassinguser.getAnsi(), harrassinguser.getLength()); mDatabase->Escape_String(cleanLanguage, language.getAnsi(), language.getLength()); mDatabase->ExecuteProcedureAsync(this, asyncContainer, "CALL sp_CSRTicketAdd('%s', %u, %u, '%s', '%s', '%s', '%s', %d);", cleanPlayer, category, subcategory, cleanComment, cleanInfo, cleanHarrasser, cleanLanguage, bugreport); }
void CSRManager::_processAppendCommentMessage( Message* message, DispatchClient* client ) { gLogger->log(LogManager::DEBUG,"CSRManager::_processAppendCommentMessage"); BString poster; BString comment; uint32 ticketid = message->getUint32(); message->getStringAnsi(poster); message->getStringUnicode16(comment); comment.convert(BSTRType_ANSI); int8 cleanComment[4000], cleanPoster[4000]; mDatabase->Escape_String(cleanComment,comment.getAnsi(),comment.getLength()); mDatabase->Escape_String(cleanPoster,poster.getAnsi(), poster.getLength()); mDatabase->ExecuteProcedureAsync(NULL, NULL, "CALL sp_CSRTicketCommentAdd(%u, '%s', '%s');", ticketid, cleanComment, cleanPoster); mDatabase->ExecuteProcedureAsync(NULL, NULL, "CALL sp_CSRTicketActivityUpdate(%u);", ticketid); gMessageFactory->StartMessage(); gMessageFactory->addUint32(opAppendCommentResponseMessage); gMessageFactory->addUint32(0); gMessageFactory->addUint32(ticketid); }
//============================================================================= // // create a new waypoint // never call this directly - always go over the datapad!!!!! we need to check the capacity // void ObjectFactory::requestNewWaypoint(ObjectFactoryCallback* ofCallback,BString name, const glm::vec3& coords,uint16 planetId,uint64 ownerId,uint8 wpType) { PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(ownerId)); OFAsyncContainer* asyncContainer = new(mDbAsyncPool.ordered_malloc()) OFAsyncContainer(ofCallback,OFQuery_WaypointCreate,player->getClient()); int8 sql[512],*sqlPointer; int8 restStr[128]; sprintf(sql,"SELECT sf_WaypointCreate('"); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->escapeString(sqlPointer,name.getAnsi(),name.getLength()); sprintf(restStr,"',%"PRIu64",%f,%f,%f,%u,%u)", ownerId, coords.x, coords.y, coords.z, planetId, wpType); strcat(sql,restStr); mDatabase->executeSqlAsync(this,asyncContainer,sql); }
int32 ObjectController::indexOfFirstField(const BString message) const { int32 index = -1; int8 *ptr = message.getRawData(); //bool foundStart = false; //bool foundEnd = false; for (int32 i = 0; i < (int32)message.getLength(); i++) { // Find the start of next field. if (!isspace(*ptr++)) { index = i; break; } } return index; }
void TreasuryManager::bankTipOffline(uint32 amount,PlayerObject* player,BString targetName) { //============================================ //check whether we have sufficient funds //dont forget the surcharge auto equip_service = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::equipment::EquipmentService>("EquipmentService"); //auto inventory = dynamic_cast<Inventory*>(equip_service->GetEquippedObject(player, "inventory")); auto bank = dynamic_cast<Bank*>(equip_service->GetEquippedObject(player->GetCreature(), "bank")); if(!bank) { LOG (error) << "TreasuryManager::bankJoin No bank for " << player->getId(); return; } int32 credits = bank->getCredits(); int32 surcharge = (int32)((amount/100)*5); if((amount + surcharge) > credits) { BString uniName = targetName; uniName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_nsf_bank", L"", L"", uniName.getUnicode16(), amount), player); return; } //now get the player int8 name[50]; mDatabase->escapeString(name,targetName.getAnsi(),targetName.getLength()); int8 sql[256]; sprintf(sql,"SELECT id FROM %s.characters WHERE firstname like '%s'",mDatabase->galaxy(),name); TreasuryManagerAsyncContainer* asyncContainer; asyncContainer = new TreasuryManagerAsyncContainer(TREMQuery_BankTipgetId,player->getClient()); asyncContainer->amount = amount; asyncContainer->surcharge = surcharge; asyncContainer->targetName = targetName; asyncContainer->player = player; mDatabase->executeSqlAsync(this,asyncContainer,sql); }
//============================================================================= // // update existing waypoint // never call this directly - always go over the datapad!!!!! // void ObjectFactory::requestUpdatedWaypoint(ObjectFactoryCallback* ofCallback,uint64 wpId,BString name, const glm::vec3& coords,uint16 planetId,uint64 ownerId, uint8 activeStatus) { PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(ownerId)); OFAsyncContainer* asyncContainer = new(mDbAsyncPool.ordered_malloc()) OFAsyncContainer(ofCallback,QFQuery_WaypointUpdate,player->getClient()); asyncContainer->Id = wpId; int8 sql[512],*sqlPointer; int8 restStr[128]; name.convert(BSTRType_ANSI); sprintf(sql,"CALL sp_WaypointUpdate('"); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->escapeString(sqlPointer, name.getAnsi() ,name.getLength()); sprintf(restStr,"',%"PRIu64",%f,%f,%f,%u,%u)",wpId, coords.x, coords.y, coords.z, planetId, activeStatus); strcat(sql,restStr); mDatabase->executeProcedureAsync(this,asyncContainer,sql); }
void ObjectController::_handleNewbieSelectStartingLocation(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); // gLogger->hexDump(message->getData(),message->getSize()); // Find the planet and position. if (gWorldConfig->isTutorial()) { BString name; message->getStringUnicode16(name); if (!(name.getLength())) { return; } name.convert(BSTRType_ANSI); player->getTutorial()->warpToStartingLocation(name); } }
void ObjectController::_handleSetBiography(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); BString bio; int8 sql[5000],end[64],*sqlPointer; message->getStringUnicode16(bio); player->setBiography(bio); bio.convert(BSTRType_ANSI); sprintf(sql,"UPDATE %s.character_biography SET biography ='",mDatabase->galaxy()); sprintf(end,"' WHERE character_id = %" PRIu64 "",player->getId()); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->escapeString(sqlPointer,bio.getAnsi(),bio.getLength()); strcat(sql,end); mDatabase->executeAsyncSql(sql); }
void ObjectController::_handleSurrenderSkill(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); BString skillStr; message->getStringUnicode16(skillStr); skillStr.convert(BSTRType_ANSI); if(!(skillStr.getLength())) { DLOG(info) << "ObjectController::handleSurrenderSkill: no skillname"; return; } Skill* skill = gSkillManager->getSkillByName(skillStr.getAnsi()); if(skill == NULL) { DLOG(info)<<"ObjectController::handleSurrenderSkill: could not find skill " << skillStr.getAnsi(); return; } gSkillManager->dropSkill(skill->mId,player); }