Example #1
0
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);
}
Example #2
0
//========================================================================================
//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++;
    }

}
Example #3
0
bool Object::hasInternalAttribute(BString key)
{
    if(mInternalAttributeMap.find(key.getCrc()) != mInternalAttributeMap.end())
        return(true);

    return(false);
}
Example #4
0
bool Object::hasAttribute(BString key) const
{
    if(mAttributeMap.find(key.getCrc()) != mAttributeMap.end())
        return(true);

    return(false);
}
Example #5
0
bool WorldConfig::hasConfiguration(BString key) const
{
    if(mConfigurationMap.find(key.getCrc()) != mConfigurationMap.end())
        return(true);

    return(false);
}
Example #6
0
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();
}
Example #7
0
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());
}
Example #8
0
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() << "]";
}
Example #9
0
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);
}
Example #10
0
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;
}
Example #11
0
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;
}
Example #12
0
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;
}
Example #13
0
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;
}
Example #14
0
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;
    }
}
Example #15
0
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);
  
}
Example #16
0
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;
}
Example #17
0
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();
    }
}
Example #19
0
void Object::addAttribute(BString key,std::string value)
{
    mAttributeMap.insert(std::make_pair(key.getCrc(),value));
    mAttributeOrderList.push_back(key.getCrc());
}
Example #20
0
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));

}
Example #21
0
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);
}
Example #22
0
void Object::addInternalAttribute(BString key,std::string value)
{
    mInternalAttributeMap.insert(std::make_pair(key.getCrc(),value));
}
Example #23
0
//=============================================================================
//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

}
Example #24
0
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;


}
Example #25
0
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
    }
    }
}
Example #26
0
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);

}
Example #27
0
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
    {
    }
}
Example #28
0
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);
        }

    }
    
}
Example #29
0
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;
}
Example #30
0
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;
}