void Object::addInternalAttributeIncDB(BString key,std::string value) { if(hasInternalAttribute(key)) { setInternalAttributeIncDB(key,value); return; } mInternalAttributeMap.insert(std::make_pair(key.getCrc(),value)); uint32 attributeID = gWorldManager->getAttributeId(key.getCrc()); if(!attributeID) { DLOG(info) << "Object::addAttribute DB: no such attribute in the attribute table : " << key.getAnsi(); return; } int8 sql[512],*sqlPointer,restStr[128]; // int8 sql[1024] sprintf(sql,"INSERT INTO %s.item_attributes VALUES(%" PRIu64 ",%u,'",gWorldManager->getDatabase()->galaxy() ,this->getId(), attributeID); sqlPointer = sql + strlen(sql); sqlPointer += gWorldManager->getDatabase()->escapeString(sqlPointer, value.c_str(), value.length()); sprintf(restStr,"',%u,0)",static_cast<uint32>(this->mInternalAttributeMap.size())); strcat(sql,restStr); gWorldManager->getDatabase()->executeSqlAsync(0, 0, sql); }
//======================================================================================== //used by the factoryfactory to update hoppercontent when looking at a hopper // void FactoryCrate::upDateFactoryVolume(BString amount) { if(!this->hasAttribute("factory_count")) { return; } std::string v = this->getAttribute<std::string>("factory_count"); BString value = v.c_str(); if(value.getCrc() == amount.getCrc()) { return; } this->setAttribute("factory_count",amount.getAnsi()); PlayerObjectSet* knownPlayers = this->getKnownPlayers(); PlayerObjectSet::iterator playerIt = knownPlayers->begin(); while(playerIt != knownPlayers->end()) { PlayerObject* player = (*playerIt); if(player) gMessageLib->sendUpdateCrateContent(this,player); playerIt++; } }
bool Object::hasInternalAttribute(BString key) { if(mInternalAttributeMap.find(key.getCrc()) != mInternalAttributeMap.end()) return(true); return(false); }
bool Object::hasAttribute(BString key) const { if(mAttributeMap.find(key.getCrc()) != mAttributeMap.end()) return(true); return(false); }
bool WorldConfig::hasConfiguration(BString key) const { if(mConfigurationMap.find(key.getCrc()) != mConfigurationMap.end()) return(true); return(false); }
void Object::removeInternalAttribute(BString key) { AttributeMap::iterator it = mInternalAttributeMap.find(key.getCrc()); if(it != mInternalAttributeMap.end()) mInternalAttributeMap.erase(it); else DLOG(info) << "Object::removeInternalAttribute: could not find " << key.getAnsi(); }
void WorldConfig::removeConfiguration(BString key) { ConfigurationMap::iterator it = mConfigurationMap.find(key.getCrc()); if(it != mConfigurationMap.end()) mConfigurationMap.erase(it); else gLogger->log(LogManager::INFORMATION,"WorldConfig::removeConfiguration: could not find %s",key.getAnsi()); }
void WorldConfig::removeConfiguration(BString key) { ConfigurationMap::iterator it = mConfigurationMap.find(key.getCrc()); if(it != mConfigurationMap.end()) mConfigurationMap.erase(it); else LOG(WARNING) << "Could not find configuration setting with key [" << key.getAnsi() << "]"; }
void ObjectController::_handleBoardTransport(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); ObjectSet inRangeObjects; float boardingRange = 25.0; if(playerObject->states.getPosture() == CreaturePosture_SkillAnimating) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return; } BString str; message->getStringUnicode16(str); str.convert(BSTRType_ANSI); str.toLower(); if((str.getCrc() != BString("transport").getCrc())) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_what_shuttle"), playerObject); return; } gSpatialIndexManager->getObjectsInRange(playerObject,&inRangeObjects,ObjType_Creature | ObjType_NPC, boardingRange, true); // iterate through the results ObjectSet::iterator it = inRangeObjects.begin(); while(it != inRangeObjects.end()) { if(Shuttle* shuttle = dynamic_cast<Shuttle*>(*it)) { // in range check if(playerObject->getParentId() != shuttle->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_too_far"), playerObject); return; } if (!shuttle->availableInPort()) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "shuttle_not_available"), playerObject); return; } shuttle->useShuttle(playerObject); return; } ++it; } gMessageLib->SendSystemMessage(::common::OutOfBand("structure/structure_messages", "boarding_what_shuttle"), playerObject); }
uint32 EntertainerManager::getIdXP(BString attribute, uint16 value) { IDStruct* iDContainer = getIDAttribute(attribute.getCrc()); if(!iDContainer) { gLogger->log(LogManager::DEBUG,"couldnt find attribute container"); return 0; } return iDContainer->XP; }
void Object::setInternalAttribute(BString key,std::string value) { AttributeMap::iterator it = mInternalAttributeMap.find(key.getCrc()); if(it == mInternalAttributeMap.end()) { DLOG(info) << "Object::setInternalAttribute: could not find " << key.getAnsi(); return; } (*it).second = value; }
void WorldConfig::setConfiguration(BString key,std::string value) { ConfigurationMap::iterator it = mConfigurationMap.find(key.getCrc()); if(it == mConfigurationMap.end()) { LOG(WARNING) << "Could not find configuration setting with key [" << key.getAnsi() << "]"; return; } (*it).second = value; }
void WorldConfig::setConfiguration(BString key,std::string value) { ConfigurationMap::iterator it = mConfigurationMap.find(key.getCrc()); if(it == mConfigurationMap.end()) { gLogger->log(LogManager::INFORMATION,"WorldConfig::setConfiguration: could not find %s",key.getAnsi()); return; } (*it).second = value; }
void ChatMessageLib::sendChatRoomMessage(Channel* channel, BString galaxy, BString sender, BString message) const { ChatAvatarIdList::iterator iter = channel->getUserList()->begin(); #ifdef DISP_REAL_FIRST_NAME #else sender.toLower(); #endif // Check ignore list. BString loweredName = sender; loweredName.toLower(); uint32 loweredNameCrc = loweredName.getCrc(); while (iter != channel->getUserList()->end()) { // If sender present at recievers ignore list, don't send. if ((*iter)->getPlayer()->checkIgnore(loweredNameCrc)) { // Ignore player } else { DispatchClient* client = (*iter)->getPlayer()->getClient(); if (client == NULL) { LOG(warning) << "sendChatRoomMessage: Client not found for channel " << channel->getId(); } else { gMessageFactory->StartMessage(); gMessageFactory->addUint32(opChatRoomMessage); gMessageFactory->addString(SWG); gMessageFactory->addString(galaxy); gMessageFactory->addString(sender); gMessageFactory->addUint32(channel->getId()); gMessageFactory->addString(message); gMessageFactory->addUint32(0); Message* response = gMessageFactory->EndMessage(); client->SendChannelA(response, client->getAccountId(), CR_Client, 5); } } ++iter; } }
void Object::setInternalAttributeIncDB(BString key,std::string value) { if(!hasInternalAttribute(key)) { addInternalAttributeIncDB(key,value); } AttributeMap::iterator it = mInternalAttributeMap.find(key.getCrc()); if(it == mInternalAttributeMap.end()) { DLOG(INFO) << "Object::setAttribute: could not find " << key.getAnsi(); return; } (*it).second = value; uint32 attributeID = gWorldManager->getAttributeId(key.getCrc()); if(!attributeID) { DLOG(INFO) << "Object::addAttribute DB: no such attribute in the attribute table :" << key.getAnsi(); return; } int8 sql[512],*sqlPointer,restStr[128]; // int8 sql[1024] sprintf(sql,"UPDATE item_attributes SET value='"); sqlPointer = sql + strlen(sql); sqlPointer += gWorldManager->getDatabase()->escapeString(sqlPointer,value.c_str(),value.length()); sprintf(restStr,"'WHERE item_id=%"PRIu64" AND attribute_id=%u",this->getId(),attributeID); strcat(sql,restStr); //sprintf(sql,"UPDATE item_attributes SET value='%s' WHERE item_id=%"PRIu64" AND attribute_id=%u",value,this->getId(),attributeID); gWorldManager->getDatabase()->executeSqlAsync(0,0,sql); }
bool ArtisanManager::handleRequestSurvey(Object* playerObject,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(playerObject); std::shared_ptr<SimpleEvent> start_survey_event = nullptr; if(cmdProperties) mSurveyMindCost = cmdProperties->mMindCost; // don't allow survey in buildings if(player->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), player); return false; } if(player->getPerformingState() != PlayerPerformance_None) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } if(player->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_cant"), player); return false; } if(player->getSamplingState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_sample"), player); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(tool && resource) { player->setSurveyState(true); // play effect std::string effect = gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("survey_effect")); gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,player); PlayerObjectSet* playerList = player->getKnownPlayers(); PlayerObjectSet::iterator it = playerList->begin(); while(it != playerList->end()) { gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,(*it)); ++it; } uint32 mindCost = mSurveyMindCost; Ham* hamz = player->getHam(); //are we able to sample in the first place ?? if(!hamz->checkMainPools(0,0,mindCost)) { int32 myMind = hamz->mAction.getCurrentHitPoints(); //return message for sampling cancel based on HAM if(myMind < (int32)mindCost) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player); } //message for stop sampling gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), player); player->getSampleData()->mPendingSurvey = false; hamz->updateRegenRates(); player->updateMovementProperties(); return false; } hamz->performSpecialAction(0,0,(float)mindCost,HamProperty_CurrentHitpoints); // send system message resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_survey", L"", L"", resourceName.getUnicode16()), player); // schedule execution start_survey_event = std::make_shared<SimpleEvent>(EventType("start_survey"),0, 5000, std::bind(&ArtisanManager::surveyEvent, this, player, resource, tool)); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_nothingfound")); return false; } // notify any listeners if (start_survey_event) gEventDispatcher.Notify(start_survey_event); return true; }
void WorldConfig::addConfiguration(BString key,std::string value) { mConfigurationMap.insert(std::make_pair(key.getCrc(),value)); }
void WorldManager::_loadWorldObjects() { if(mTotalObjectCount > 0) { // this loads all buildings with cells and objects they contain _loadBuildings(); //NOT PlayerStructures!!!!!!!!!!!!!!!!!!!!!!!!!! they are handled seperately further down if(mZoneId!=41) { // load objects in world _loadAllObjects(0); // load zone regions stringstream query_stream; query_stream << "SELECT id FROM "<<mDatabase->galaxy()<<".zone_regions WHERE planet_id=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gObjectFactory->requestObject(ObjType_Region, Region_Zone, 0, this, result_set->getUInt64(1)); } LOG(info) << "Loaded " << result_set->rowsCount() << " Zone Regions"; }); } // load client effects stringstream query_stream; query_stream << "SELECT * FROM "<<mDatabase->galaxy()<<".clienteffects ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); // tell vector how much space we need to stop unecessary allocation. mvClientEffects.reserve(result_set->rowsCount()); while(result_set->next()) { mvClientEffects.push_back(result_set->getString("effect")); } LOG(info) << "Loaded " << mvClientEffects.size() << " Client Effects"; }); // load attribute keys query_stream.str(std::string()); query_stream << "SELECT id, name FROM "<<mDatabase->galaxy()<<".attributes ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { BString name = result_set->getString("name").c_str(); mObjectAttributeKeyMap.insert(std::make_pair(name.getCrc(), name)); mObjectAttributeIDMap.insert(std::make_pair(name.getCrc(), result_set->getInt("id"))); } LOG(info) << "Loaded " << mObjectAttributeKeyMap.size() << " Attributes"; }); // load sounds query_stream.str(std::string()); query_stream << "SELECT * FROM "<<mDatabase->galaxy()<<".sounds ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { mvSounds.push_back(result_set->getString("name")); } LOG(info) << "Loaded " << mvSounds.size() << " Sounds"; }); // load moods query_stream.str(std::string()); query_stream << "SELECT * FROM "<<mDatabase->galaxy()<<".moods ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); mvMoods.reserve(result_set->rowsCount()); while(result_set->next()) { mvMoods.push_back(result_set->getString("name")); } LOG(info) << "Loaded " << mvMoods.size() << " Moods"; }); // load npc converse animations query_stream.str(std::string()); query_stream << "SELECT * FROM "<<mDatabase->galaxy()<<".conversation_animations ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); mvNpcConverseAnimations.reserve(result_set->rowsCount()); while(result_set->next()) { mvNpcConverseAnimations.push_back(result_set->getString("name")); } LOG(info) << "Loaded " << mvNpcConverseAnimations.size() << " NPC Converse Animations"; }); // load npc chatter query_stream.str(std::string()); query_stream << "SELECT * FROM "<<mDatabase->galaxy()<<".npc_chatter WHERE planetId=" << mZoneId << " OR planetId=99"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); mvNpcChatter.reserve(result_set->rowsCount()); while(result_set->next()) { std::string phrase(result_set->getString("phrase")); uint32 anim = result_set->getUInt("animation"); // convert from std::string to wstring std::wstring ws; ws.assign(phrase.begin(), phrase.end()); mvNpcChatter.push_back(std::make_pair(ws, anim)); } LOG(info) << "Loaded " << mvNpcChatter.size()<< " NPC Chatter Phrases"; }); if(mZoneId != 41) { // load cities stringstream query_stream; query_stream << "SELECT id FROM "<<mDatabase->galaxy()<<".cities WHERE planet_id=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gObjectFactory->requestObject(ObjType_Region, Region_City, 0, this, result_set->getUInt64(1)); } if (result_set->rowsCount()) { LOG(info) << "Loaded " << result_set->rowsCount() << " City Regions"; } else LOG(info) <<"Unable to load cities with region id: " << mZoneId; }); // load badge regions query_stream.str(std::string()); query_stream << "SELECT id FROM "<<mDatabase->galaxy()<<".badge_regions WHERE planet_id=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gObjectFactory->requestObject(ObjType_Region, Region_Badge, 0, this, result_set->getUInt64(1)); } LOG(info) << "Loaded " << result_set->rowsCount() << " Badge Regions"; }); //load spawn regions query_stream.str(std::string()); query_stream << "SELECT id FROM "<<mDatabase->galaxy()<<".spawn_regions WHERE planet_id=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gObjectFactory->requestObject(ObjType_Region, Region_Spawn, 0, this, result_set->getUInt64(1)); } LOG(info) << "Loaded " << result_set->rowsCount() << " Spawn Regions"; }); // load world scripts query_stream.str(std::string()); query_stream << "SELECT priority,file FROM "<<mDatabase->galaxy()<<".config_zone_scripts WHERE planet_id=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { Script* script = gScriptEngine->createScript(); script->setPriority(result_set->getUInt("priority")); script->setFileName(result_set->getString("file").c_str()); mWorldScripts.push_back(script); } LOG(info) << "Loaded " << mWorldScripts.size() << " World Scripts"; }); //load creature spawn regions, and optionally heightmaps cache. query_stream.str(std::string()); query_stream << "SELECT id, spawn_x, spawn_z, spawn_width, spawn_length FROM "<<mDatabase->galaxy()<<".spawns WHERE spawn_planet=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { std::shared_ptr<CreatureSpawnRegion> creatureSpawnRegion = std::make_shared<CreatureSpawnRegion>(); creatureSpawnRegion->mId = result_set->getInt64(1); creatureSpawnRegion->mPosX = result_set->getDouble(2); creatureSpawnRegion->mPosZ = result_set->getDouble(3); creatureSpawnRegion->mWidth = result_set->getDouble(4); creatureSpawnRegion->mLength = result_set->getDouble(5); mCreatureSpawnRegionMap.insert(std::make_pair(creatureSpawnRegion->mId, creatureSpawnRegion)); } LOG(info) << "Loaded " << result_set->rowsCount() << " Creature Spawn Regions"; }); // load harvesters query_stream.str(std::string()); query_stream << "SELECT s.id FROM "<<mDatabase->galaxy()<<".structures s INNER JOIN "<<mDatabase->galaxy()<<".harvesters h ON (s.id = h.id) WHERE zone=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gHarvesterFactory->requestObject(this,result_set->getUInt64(1),0,0,0); } LOG(info) << "Loaded " << result_set->rowsCount() << " Player Harvesters"; }); // load factories query_stream.str(std::string()); query_stream << "SELECT s.id FROM "<<mDatabase->galaxy()<<".structures s INNER JOIN "<<mDatabase->galaxy()<<".factories f ON (s.id = f.id) WHERE zone=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gFactoryFactory->requestObject(this,result_set->getUInt64(1),0,0,0); } LOG(info) << "Loaded " << result_set->rowsCount() << " Player Factories"; }); // load playerhouses query_stream.str(std::string()); query_stream << "SELECT s.id FROM "<<mDatabase->galaxy()<<".structures s INNER JOIN "<<mDatabase->galaxy()<<".houses h ON (s.id = h.id) WHERE zone=" << mZoneId << " ORDER BY id;"; mDatabase->executeAsyncSql(query_stream, [=] (DatabaseResult* result) { if (! result) { return; } std::unique_ptr<sql::ResultSet>& result_set = result->getResultSet(); while(result_set->next()) { gHouseFactory->requestObject(this,result_set->getUInt64(1),0,0,0); } LOG(info) << "Loaded " << result_set->rowsCount() << " Player Houses"; }); } } // no objects to load, so we are done else { _handleLoadComplete(); } }
void Object::addAttribute(BString key,std::string value) { mAttributeMap.insert(std::make_pair(key.getCrc(),value)); mAttributeOrderList.push_back(key.getCrc()); }
BString EntertainerManager::commitIdAttribute(PlayerObject* customer, BString attribute, float value) { uint32 crc = attribute.getCrc(); int8 add[50],mString[64]; uint16 uVal,sk; BString genderrace; //sprintf(attrName,""); //sprintf(add,""); // get our gender and race so we can get hold of our Information from the id_attribute table sprintf(mString,"%s",&customer->getModelString().getAnsi()[30]); char *Token; char separation[] = "."; Token = strtok(mString,separation); // genderrace = Token; gLogger->log(LogManager::DEBUG,"ID commit attribute : gender / race crc : %u",genderrace.getCrc()); IDStruct* iDContainer = getIDAttribute(attribute.getCrc(),genderrace.getCrc()); if(!iDContainer) { gLogger->log(LogManager::DEBUG,"couldnt find attribute container"); return(BString("")); } float fValue = (value*iDContainer->divider); uVal = (uint16) (fValue); if (uVal == 0) uVal = 511; if (uVal == 255) uVal = 767; gLogger->log(LogManager::DEBUG,"ID commit attribute : value : %f %u (%f)",value,uVal,fValue); //CAVE chest is handled over 2 attributes I cant find the 2nd apart from 2b in the list //however when you ahh 80h to the 2b (first attribute) you get to the so called 2 attribute version //in case of chests we have then the attribute ID ABh followed by TWO values as returned by the client on //char creation if ((crc ==523041409)&(customer->getGender())) //chest { //Slider goes from 1 to 100 uint16 v1,v2; v1 = 0; v2 = 0; uint8 slider = (uint8)(value * 100); if(slider < 51) { v2 = 0; //v1 goes from 155 for 0 to 0 for 50 v1 = (uint8)155-((155/50)*slider); } else { v2 = 255; //v1 goes from 253 for 51 //to 101 for 100 slider = slider-50; uint8 amount = ((155/50)*slider); v1 = 256 - amount; } customer->setCustomization (171,v1); customer->setCustomization (172,v2); //overwrites 2 value version so set to zero (so it gets ignored) customer->setCustomization (0x2b,0); int8 sql[250]; sprintf(sql,"ABFF = '%u', AB2FF = '%u'",v1,v2); return(BString(sql)); } customer->setCustomization ((uint8)iDContainer->Atr1ID,uVal); //sometimes we have 2 attributes corresponding to one feature - like weight //it has the attributes skinny and fat which need to be set to corresponding values //that means the more fat the less skinny if(iDContainer->Atr2ID > 0) { if(uVal == 511) sk = 767; else if(uVal == 767) sk = 511; else { sk = 255 - uVal; } sprintf(add,",%s = '%u'",iDContainer->Atr2Name,sk); customer->setCustomization(static_cast<uint8>(iDContainer->Atr2ID),sk); } int8 sql[150]; sprintf(sql,"%s = '%u'%s",iDContainer->Atr1Name,uVal,add); return(BString(sql)); }
void EntertainerManager::applyHoloEmote(PlayerObject* customer,BString holoEmote) { //get the Data HoloStruct* myEmote = getHoloEmoteByClientCRC(holoEmote.getCrc()); if(!myEmote) { gLogger->log(LogManager::DEBUG,"ID : applyHoloEmote : canot retrieve HoloEmote Data %s : %u",holoEmote.getAnsi(),holoEmote.getCrc()); return; } //update the PlayerObject customer->setHoloEmote(myEmote->pCRC); customer->setHoloCharge(20); //update the db int8 sql[512]; EntertainerManagerAsyncContainer* asyncContainer; asyncContainer = new EntertainerManagerAsyncContainer(EMQuery_NULL,0); asyncContainer->customer = customer; sprintf(sql,"call swganh.sp_CharacterHoloEmoteCreate(%"PRIu64",%u,%u)", customer->getId(),myEmote->pCRC,20); mDatabase->ExecuteProcedureAsync(this,asyncContainer,sql); //send message box holoemote bought bool lotsOfStuff = false; if(!strcmp(myEmote->pEmoteName,"all")) { lotsOfStuff = true; } //just give help int8 sql1[512]; if(lotsOfStuff) { sprintf(sql1,"Your Holo-Emote generator can play all Holo-Emotes available. You have %u charges remaining." "\xa To play your Holo-Emote type \x2fholoemote \x3cname\x3e.\xa To delete your Holo-Emote type \x2fholoemote delete. " "\xa Purchasing a new Holo-Emote will automatically delete your current Holo-Emote.",customer->getHoloCharge()); sprintf(sql,"%s \xa \xa The available Holo-Emote names are: \xa \xa" "Beehive \x9 \x9 Blossom \x9 Brainstorm \xa" "Bubblehead \x9 Bullhorns \x9 Butterflies \xa" "Champagne \x9 Haunted \x9 Hearts \xa" "Hologlitter \x9 \x9 Holonotes \x9 Imperial \xa" "Kitty \x9 \x9 \x9 Phonytail \x9 Rebel \xa" "Sparky",sql1); } else { sprintf(sql,"Your current Holo Emote is %s.\xa You have %u charges remaining." "\xa To play your Holo-Emote type \x2fholoemote %s.\xa To delete your Holo-Emote type \x2fholoemote delete. " "\xa Purchasing a new Holo-Emote will automatically delete your current Holo-Emote.",myEmote->pEmoteName,customer->getHoloCharge(),myEmote->pEmoteName); } gUIManager->createNewMessageBox(NULL,"holoHelpOff","Holo-Emote Help",sql,customer); }
void Object::addInternalAttribute(BString key,std::string value) { mInternalAttributeMap.insert(std::make_pair(key.getCrc(),value)); }
//============================================================================= //looks up the corresponding index and indexstring for Colors //updates the indexvalue and prepares the attribute string to be added to the sql string // BString EntertainerManager::commitIdColor(PlayerObject* customer, BString attribute, uint16 value) { gLogger->log(LogManager::DEBUG,"ID : Color Attribute : %s",attribute.getAnsi()); BString genderrace; int8 mString[64]; char *Token; char separation[] = "."; sprintf(mString,"%s",&customer->getModelString().getAnsi()[30]); Token = strtok(mString,separation); genderrace = Token; gLogger->log(LogManager::DEBUG,"ID commit color : gender / race crc : %u", genderrace.getCrc()); IDStruct* iDContainer = getIDAttribute(attribute.getCrc(),genderrace.getCrc()); if(!iDContainer) { gLogger->log(LogManager::DEBUG,"ID : Color Attribute : couldnt find attribute container"); return(BString("")); } if (value == 0) value = 511; if (value == 255) value = 767; //check whether we are modifying the hair object if(iDContainer->hair) { //if(TangibleObject* hair = dynamic_cast<TangibleObject*>(customer->getEquipManager()->getEquippedObject(CreatureEquipSlot_Hair))) if(TangibleObject* hair = dynamic_cast<TangibleObject*>(customer->getHair())) { hair->setCustomization(static_cast<uint8>(iDContainer->Atr1ID),value,3); //update hair customization db side seperately int8 sql[300]; sprintf(sql,"UPDATE character_appearance set %s = %u where character_id = '%"PRIu64"'",iDContainer->Atr1Name, value,customer->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //update object clientside // now update the hair customization string gMessageLib->sendUpdateCustomization_InRange(hair,customer); //Udate equiplist //the equiplist is what makes us have the right hair and clothes in the ID ui //additionally it updates the hair properly on the login ui after change //make sure were not wearing a helmet TangibleObject* hairSlot = dynamic_cast<TangibleObject*>(customer->getEquipManager()->getEquippedObject(CreatureEquipSlot_Hair)); if(hairSlot&&hairSlot->getTangibleType() == TanType_Hair) { customer->getEquipManager()->removeEquippedObject(CreatureEquipSlot_Hair); gMessageLib->sendEquippedListUpdate_InRange(customer); customer->getEquipManager()->addEquippedObject(CreatureEquipSlot_Hair,hair); gMessageLib->sendEquippedListUpdate_InRange(customer); } //sends to inRange by default //cant get the update to work as intended :( //gMessageLib->sendEquippedItemUpdate_InRange(customer,hair->getId()); return BString(""); } else { gLogger->log(LogManager::DEBUG,"ID : Color Attribute : No hair object exists"); return BString(""); } } else { customer->setCustomization(static_cast<uint8>(iDContainer->Atr1ID),value); } int8 sql[50]; sprintf(sql,"%s = '%u'",iDContainer->Atr1Name,value); return(BString(sql)); //changes to the hair object (different hair) are only shown on selection when we update the inventory list // in the creo 6 - in this case the later color change is shown too //when we only change the color there is no change to haircolo }
void ObjectController::_handleTip(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { // Message can appear as follows: // // (uint32)playerID bank <- banktip in case the client knows the target // (uint32)playerID <- inventory tip in case the client knows the target // (string)playerName bank <- banktip in case the client doesn't know the target // // can't inventory-tip someone out of range so we can assume // the client will send the ID rather than the name in case // of an inventory tip. BString attribute, str; message->getStringUnicode16(str); attribute = str; attribute.convert(BSTRType_ANSI); PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); PlayerObject* target = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetId)); BString targetName; BString dataStr; //int32 amount = 0; //uint64 transferType = 0; BStringVector dataElements; BString bank; attribute.getRawData()[attribute.getLength()] = 0; uint32 elementCount = attribute.split(dataElements,' '); //do we have the right number of attributes? if((elementCount <1) || (elementCount >3)) { gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_invalid_param", L"", L"", str.getUnicode16()), player); return; } BString lower = dataElements[elementCount-1]; // Have to convert BEFORE using toLower, since the conversion done there is removed It will assert(). // Either do the conversion HERE, or better fix the toLower so it handles unicode also. dataStr.convert(BSTRType_ANSI); lower.toLower(); //check for banktip if((lower.getCrc() == BString("bank").getCrc())&&(elementCount > 1)) { uint32 amount = atoi(dataElements[elementCount-2].getAnsi()); bool havetarget = false; BString name; if(target && (target != player)) { havetarget = true; name = target->GetCreature()->getFirstName().c_str(); } if(elementCount == 3) { havetarget = true; name = dataElements[0]; } if((amount >0)&& (amount < 999999999)&&(havetarget)) { //now call the treasury, find that offline bloke and get going gTreasuryManager->bankTipOffline(amount,player,name); return; } if(targetId && (!havetarget)) { //please note that this is rather complex as we have a targetid even if we explicitly names a target gMessageLib->SendSystemMessage(L"You may only /tip or /tip bank to other players.", player); return; } } if(target == player) { gMessageLib->SendSystemMessage(L"You may only /tip or /tip bank to other players.", player); return; } if((elementCount == 1)&&(target)) { uint32 amount = atoi(dataElements[0].getAnsi()); if(amount>0 && (amount < 1000001)) { gTreasuryManager->inventoryTipOnline(amount,player,target); return; } } if(targetId && (!target)) { //please note that this is rather complex as we have a targetid even if we explicitely name a target gMessageLib->SendSystemMessage(L"You may only /tip or /tip bank to other players.", player); return; } gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_invalid_param", L"", L"", str.getUnicode16()), player); return; }
void PlayerStructure::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { PlayerObject* player = window->getOwner(); // action is zero for ok !!! if(!player || (action) || player->isIncapacitated() || player->isDead()) { return; } switch(window->getWindowType()) { case SUI_Window_Factory_Schematics: { uint64 ManSchemId = 0; //check for use schematic BString b = window->getOption3(); b.convert(BSTRType_ANSI); if(strcmp(b.getAnsi(),"false") == 0) { WindowAsyncContainerCommand* asyncContainer = (WindowAsyncContainerCommand*)window->getAsyncContainer(); if(!asyncContainer) { return; } if(asyncContainer->SortedList.size()) ManSchemId = asyncContainer->SortedList.at(element); else { SAFE_DELETE(asyncContainer); gMessageLib->SendSystemMessage(::common::OutOfBand("manf_station", "schematic_not_added"), player); return; } SAFE_DELETE(asyncContainer); StructureAsyncCommand command; command.Command = Structure_Command_AddSchem; command.PlayerId = player->getId(); command.StructureId = this->getId(); command.SchematicId = ManSchemId; gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } else if(strcmp(b.getAnsi(),"true") == 0) //remove schematic pressed { WindowAsyncContainerCommand* asyncContainer = (WindowAsyncContainerCommand*)window->getAsyncContainer(); SAFE_DELETE(asyncContainer); StructureAsyncCommand command; command.Command = Structure_Command_RemoveSchem; command.PlayerId = player->getId(); command.StructureId = this->getId(); command.SchematicId = ManSchemId; gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } } break; case SUI_Window_Structure_Status: { //we want to refresh StructureAsyncCommand command; command.Command = Structure_Command_ViewStatus; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case SUI_Window_Structure_Delete: { gStructureManager->createNewStructureDeleteConfirmBox(player,this ); } break; case SUI_Window_Structure_Rename: { inputStr.convert(BSTRType_ANSI); if(!inputStr.getLength()) { //hmmm no answer - remain as it is? return; } if(inputStr.getLength() > 68) { //hmmm no answer - remain as it is? gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "not_valid_name"), player); return; } //inputStr.convert(BSTRType_Unicode16); this->setCustomName(inputStr.getAnsi()); gMessageLib->sendNewHarvesterName(this); //update db!!! // pull the db query int8 sql[255],end[128],*sqlPointer; sprintf(sql,"UPDATE %s.structures SET structures.name = '",gWorldManager->getDatabase()->galaxy()); sprintf(end,"' WHERE structures.ID = %" PRIu64 "",this->getId()); sqlPointer = sql + strlen(sql); sqlPointer += gWorldManager->getDatabase()->escapeString(sqlPointer,inputStr.getAnsi(),inputStr.getLength()); strcat(sql,end); gWorldManager->getDatabase()->executeSqlAsync(0,0,sql); } break; case SUI_Window_Structure_Delete_Confirm: { inputStr.convert(BSTRType_ANSI); if(inputStr.getCrc() == this->getCode().getCrc()) { if((this->checkStatesEither(PlayerStructureState_Destroy))) { //dont start structure destruction more than once return; } this->toggleStateOn(PlayerStructureState_Destroy); //delete it mTTS.todo = ttE_Delete; mTTS.playerId = player->getId(); gStructureManager->addStructureforDestruction(this->getId()); } else { int8 text[255]; sprintf(text,"@player_structure:incorrect_destroy_code"); gUIManager->createNewMessageBox(NULL,"","SWG::ANH",text,player); } //we need to get the input } } }
void GroupManager::_processIsmInviteInRangeResponse(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(message->getUint32()); Player* targetPlayer = gChatManager->getPlayerByAccId(message->getUint32()); uint8 inRange = message->getUint8(); if(targetPlayer == NULL || player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processIsmInviteInRangeResponse player not found"); return; } // If we are not in range, inform the player and return. if(!inRange) { gChatMessageLib->sendSystemMessage(player, L"@error_message:error_invite_ran"); return; } // I must be the group leader and group not full before we bother checking target... GroupObject* group = NULL; uint64 groupId = player->getGroupId(); if (groupId != 0) { group = getGroupById(player->getGroupId()); if (group == NULL) { return; } // Sender in group. // if sender is not leader if(group->getLeader() != player) { gChatMessageLib->sendSystemMessage(player,L"@group:must_be_leader"); return; } // is it full? if(group->getMemberCount() >= 20) { gChatMessageLib->sendSystemMessage(group->getLeader(),L"@group:full"); return; } } // If target have me ignored, auto decline my invitation. BString ignoreName = player->getName(); ignoreName.toLower(); // check our ignorelist if (targetPlayer->checkIgnore(ignoreName.getCrc())) { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("decline_leader"), player, NULL); return; } // if target is member of a group already if(targetPlayer->getGroupId() != 0 && targetPlayer->getGroupMemberIndex() != 0xFFFF) { if(targetPlayer->getGroupId() == groupId) { gChatMessageLib->sendSystemMessage(player,L"This player is already in your group."); } else { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("already_grouped"), player, NULL); } return; } // if target in group and is considering to join a group if ((targetPlayer->getGroupMemberIndex() == 0xFFFF) && (targetPlayer->getGroupId() != 0)) { // considering to join your group if(targetPlayer->getGroupId() == player->getGroupId()) { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("considering_your_group"), player, NULL); } // considering to join another group else { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("considering_other_group"), player, NULL); } return; } // the sender is not in a group, lets create a new one // and insert it in the group map if (groupId == 0) { groupId = this->getNextGroupId(); group = new GroupObject(player, groupId); mGroups.insert(std::make_pair(groupId, group)); } // add the target player as temp member group->addTempMember(targetPlayer); gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("invite_leader"), player, NULL); // tell the zone to display the invite box gChatMessageLib->sendIsmInviteRequest(player, targetPlayer); }
void TravelMapHandler::useTicket(PlayerObject* playerObject, TravelTicket* ticket,Shuttle* shuttle) { uint32 zoneId = gWorldManager->getZoneId(); // in range check if(playerObject->getParentId() != shuttle->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "shuttle_not_available"), playerObject); return; } TicketCollector* collector = dynamic_cast<TicketCollector*>(gWorldManager->getObjectById(shuttle->getCollectorId())); BString port = collector->getPortDescriptor(); if(port.getCrc() == BString("Theed Starport").getCrc()) { shuttle->setShuttleState(ShuttleState_InPort); } if (!shuttle->availableInPort()) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "shuttle_not_available"), playerObject); return; } BString srcPoint = (int8*)((ticket->getAttribute<std::string>("travel_departure_point")).c_str()); uint16 srcPlanetId = static_cast<uint8>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_departure_planet")).c_str()))); uint16 dstPlanetId = static_cast<uint8>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_arrival_planet")).c_str()))); BString dstPointStr = (int8*)((ticket->getAttribute<std::string>("travel_arrival_point")).c_str()); // see if we are at the right location if(srcPlanetId != zoneId || strcmp(srcPoint.getAnsi(),port.getAnsi()) != 0) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "wrong_shuttle"), playerObject); return; } //ok lets travel if(TravelPoint* dstPoint = gTravelMapHandler->getTravelPoint(dstPlanetId,dstPointStr)) { glm::vec3 destination; destination.x = dstPoint->spawnX + (gRandom->getRand()%5 - 2); destination.y = dstPoint->spawnY; destination.z = dstPoint->spawnZ + (gRandom->getRand()%5 - 2); // If it's on this planet, then just warp, otherwize zone if(dstPlanetId == zoneId) { // only delete the ticket if we are warping on this planet. // delete the ticket for all watchers TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(ticket->getParentId())); gContainerManager->deleteObject(ticket, tO); ticket = NULL; gWorldManager->warpPlanet(playerObject,destination,0); } else { gMessageLib->sendClusterZoneTransferRequestByTicket(playerObject,ticket->getId(), dstPoint->planetId); } return; } else { } }
void ObjectController::handleSecureTradeInvitation(uint64 targetId,Message* message) { //targetId is the Id of the one who IS INVITING //receiverId is the Id of the one who GETS INVITED uint32 unknown,error; uint64 receiverId,unknown64; message->getUint32(unknown); message->getUint32(error); message->getUint64(unknown64);//sender (target) id message->getUint64(receiverId); PlayerObject* invitingPlayer = dynamic_cast<PlayerObject*>(mObject); //PlayerObject* invitingPlayer = PlayerObject* invitedPlayer = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(receiverId)); switch(error) { case 2: { // snd invitation returns error as 2 and the id of the invited as 0 :( invitedPlayer = dynamic_cast<PlayerObject*>(invitingPlayer->GetCreature()->getTarget()); error = 0; } break; case 0: { //first invitation set the setInvite to the Inviter //invitedPlayer = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(receiverId)); } break; default: { // Always use a default if message damaged.... DLOG(info) << "ObjController:: Error in trade invitation"; // Since receiver is default NULL, we can use the error message below // return; } } if(!invitedPlayer) { gMessageLib->SendSystemMessage(::common::OutOfBand("ui_trade", "start_fail_target_not_player"), invitingPlayer); return; } if(invitedPlayer->GetCreature()->states.checkStatesEither(CreatureState_Combat | CreatureState_Tumbling | CreatureState_Swimming)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), invitingPlayer); return; } // Can NOT use bitwise operation on non bitwise constants. CreaturePostures are used exclusive. // if(invitedPlayer->states.checkPosturesEither(CreaturePosture_Dead | CreaturePosture_Incapacitated)) if (invitedPlayer->GetCreature()->states.checkPosture(CreaturePosture_Dead) || invitedPlayer->GetCreature()->states.checkPosture(CreaturePosture_Incapacitated)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), invitingPlayer); return; } // Can NOT use bitwise operation on non bitwise constants. // if(invitingPlayer->states.checkPosturesEither(CreaturePosture_Dead | CreaturePosture_Incapacitated)) if (invitingPlayer->GetCreature()->states.checkPosture(CreaturePosture_Dead) || invitingPlayer->GetCreature()->states.checkPosture(CreaturePosture_Incapacitated)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), invitingPlayer); return; } if (error == 0) { if (invitedPlayer->getTradeStatus() == false ) { // If sender is invited by receiver already, then accept even if receiver have sender in the Ignore-list. if (!invitingPlayer->getTrade()->verifyInvitation(invitedPlayer)) { // We are not invited, check Ignore. // If receiver have sender ignored, auto decline trade request. BString ignoreName = invitingPlayer->GetCreature()->getFirstName().c_str(); ignoreName.toLower(); // check receivers ignorelist if (invitedPlayer->checkIgnoreList(ignoreName.getCrc())) { gMessageLib->SendSystemMessage(::common::OutOfBand("ui_trade", "request_player_denied_prose", invitedPlayer->getId(), 0, 0), invitingPlayer); return; } } gTradeManager->addTradeInvitation(invitedPlayer,invitingPlayer); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("ui_trade", "request_player_busy_prose", invitedPlayer->getId(), 0, 0), invitingPlayer); } } }
bool ArtisanManager::handleRequestCoreSample(Object* player,Object* target, Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(player); if(cmdProperties) // unfortunately it's not in this opcode // hardcode for now //mSampleActionCost = cmdProperties->mActionCost; mSampleActionCost = 150; if(playerObject->GetCreature()->getPerformingState() != PlayerPerformance_None || playerObject->checkIfMounted() || playerObject->GetCreature()->isDead() || playerObject->GetCreature()->states.checkState(CreatureState_Combat)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return false; } // can't sample while surveying if(playerObject->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_survey"), playerObject); return false; } // don't allow sampling in buildings if(playerObject->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), playerObject); return false; } uint64 localTime = Anh_Utils::Clock::getSingleton()->getLocalTime(); // don't allow more than one sample at a time if(playerObject->getSamplingState()) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } if(!playerObject->getNextSampleTime() || (int32)(playerObject->getNextSampleTime() - localTime) <= 0) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(resource == NULL || tool == NULL) { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_noresource"), playerObject); return false; } if((resource->getType()->getCategoryId() == 903)||(resource->getType()->getCategoryId() == 904)) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "must_have_harvester"), playerObject); return false; } playerObject->setSamplingState(true); auto terrain = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::terrain::TerrainService>("TerrainService"); if(terrain->IsWater(gWorldManager->getZoneId(), playerObject->mPosition.x, playerObject->mPosition.z)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_swimming"), playerObject); return false; } resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_sampling", L"", L"", resourceName.getUnicode16()), playerObject); // change posture gStateManager.setCurrentPostureState(playerObject->GetCreature(), CreaturePosture_Crouched); // play animation gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("sample_effect")); // schedule execution std::shared_ptr<SimpleEvent> start_sample_event = nullptr; start_sample_event = std::make_shared<SimpleEvent>(EventType("start_sample"), 0, 2000, std::bind(&ArtisanManager::sampleEvent,this, playerObject, resource, tool)); // notify any listeners gEventDispatcher.Notify(start_sample_event); return true; }
bool ArtisanManager::handleRequestSurvey(Object* playerObject,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(playerObject); std::shared_ptr<SimpleEvent> start_survey_event = nullptr; if(cmdProperties) mSurveyMindCost = cmdProperties->mMindCost; // don't allow survey in buildings if(player->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), player); return false; } if(player->GetCreature()->getPerformingState() != PlayerPerformance_None) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } if(player->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_cant"), player); return false; } if(player->getSamplingState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_sample"), player); return false; } // checks if we are in combat, dead or incapacitated if (player->GetCreature()->states.checkState(CreatureState_Combat) || player->GetCreature()->states.checkPosture(CreaturePosture_Dead) || player->GetCreature()->states.checkLocomotion(CreatureLocomotion_Incapacitated)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(tool && resource) { player->setSurveyState(true); // play effect std::string effect = gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("survey_effect")); gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,player); gContainerManager->sendToRegisteredWatchers(player, [effect, player] (PlayerObject* const recipient) { gMessageLib->sendPlayClientEffectLocMessage(effect, player->mPosition, recipient); }); auto ham = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::ham::HamService>("HamService"); uint32 survey_cost = mSurveyMindCost; //are we able to sample in the first place ?? if(!ham->ApplyModifiedHamCosts(player->GetCreature(), 0, 0, survey_cost)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player); //message for stop sampling gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), player); player->getSampleData()->mPendingSurvey = false; player->GetCreature()->updateMovementProperties(); return false; } // send system message resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_survey", L"", L"", resourceName.getUnicode16()), player); // schedule execution start_survey_event = std::make_shared<SimpleEvent>(EventType("start_survey"),0, 5000, std::bind(&ArtisanManager::surveyEvent, this, player, resource, tool)); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_nothingfound")); return false; } // notify any listeners if (start_survey_event) gEventDispatcher.Notify(start_survey_event); return true; }