예제 #1
0
void TreasuryManager::bankTipOnline(int32 amount, PlayerObject* playerObject, PlayerObject* targetObject )
{
    //check if we have enough money
    int32 surcharge = (int32)((amount/100)*5);

    if((amount+surcharge) > dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getCredits())
    {
        BString s;
        s = targetObject->getFirstName();
        s.convert(BSTRType_Unicode16);
        gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_nsf_cash", L"", s.getUnicode16(), L"", amount), playerObject);
        return;
    }

    Bank* playerBank = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank));
    Bank* targetBank = dynamic_cast<Bank*>(targetObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank));

    playerBank->setCredits(playerBank->getCredits() - (amount+surcharge));
    targetBank->setCredits(targetBank->getCredits() + amount);

    saveAndUpdateBankCredits(playerObject);
    saveAndUpdateBankCredits(targetObject);

    gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_pass_self", 0, targetObject->getId(), 0, amount), playerObject);
    gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_pass_target", 0, playerObject->getId(), 0, amount), targetObject);

    gMessageLib->sendBanktipMail(playerObject,targetObject,amount);
}
예제 #2
0
void ObjectController::_handleRequestWaypointAtPosition(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject*	player	= dynamic_cast<PlayerObject*>(mObject);
    Datapad* datapad			= player->getDataPad();

    //if(!datapad->getCapacity())
    //{
    //	gMessageLib->sendSystemMessage(player,L"","base_player","too_many_waypoints");
    //	return;
    //}

    BStringVector	dataElements;
    BString			dataStr;
    std::string			nameStr;

    message->getStringUnicode16(dataStr);

    // Have to convert BEFORE using split, since the conversion done there is removed It will assert().. evil grin...
    // Either do the conversion HERE, or better fix the split so it handles unicoe also.
    dataStr.convert(BSTRType_ANSI);
    uint32 elementCount = dataStr.split(dataElements,' ');

    if(elementCount < 5)
    {
        if(elementCount < 4)
        {
            return;
        }
        else
        {
            nameStr = gWorldManager->getPlanetNameThis();
            std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), &tolower);
        }
    }
    else
    {
        for(uint i = 4; i < elementCount; i++)
        {
            nameStr.append(dataElements[i].getAnsi());

            if(i + 1 < elementCount)
                nameStr.append(" ");
        }
    }

    BString	planetStr	= dataElements[0].getAnsi();
    //gLogger->log(LogManager::DEBUG,"ObjController::handleCreateWaypointAtPosition: planet %s",planetStr.getAnsi());
    float	x			= static_cast<float>(atof(dataElements[1].getAnsi()));
    float	y			= static_cast<float>(atof(dataElements[2].getAnsi()));
    float	z			= static_cast<float>(atof(dataElements[3].getAnsi()));

    int32 planetId = gWorldManager->getPlanetIdByName(planetStr);

    if(planetId == -1)
    {
        return;
    }

    datapad->requestNewWaypoint(nameStr.c_str(), glm::vec3(x,y,z),static_cast<uint16>(planetId),Waypoint_blue);
}
예제 #3
0
std::string MedicManager::handleMessage(Message* message, std::string regexPattern)
{
    // Read the message out of the packet.
    BString tmp;
    message->getStringUnicode16(tmp);

    // If the string has no length the message is ill-formatted, send the
    // proper format to the client.
    if (!tmp.getLength())
        return "";

    // Convert the string to an ansi string for ease with the regex.
    tmp.convert(BSTRType_ANSI);
    std::string input_string(tmp.getAnsi());

    static const regex pattern(regexPattern);
    smatch result;

    regex_search(input_string, result, pattern);

    // Gather the results of the pattern for validation and use.
    std::string messageType(result[1]);
    if (messageType.length() > 0)
    {
        return messageType;
    }
    return "";
}
예제 #4
0
void TreasuryManager::bankTipOffline(int32 amount,PlayerObject* playerObject,BString targetName)
{

    //============================================
    //check whether we have sufficient funds
    //dont forget the surcharge
    Bank* bank = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank));
    int32 credits = bank->getCredits();

    int32 surcharge = (int32)((amount/100)*5);

    if((amount + surcharge) > credits)
    {
        BString uniName = targetName;
        uniName.convert(BSTRType_Unicode16);

        gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_nsf_bank", L"", L"", uniName.getUnicode16(), amount), playerObject);
        return;
    }
    //now get the player
    int8 name[50];
    mDatabase->Escape_String(name,targetName.getAnsi(),targetName.getLength());

    int8 sql[256];
    sprintf(sql,"SELECT id FROM characters WHERE firstname like '%s'",name);

    TreasuryManagerAsyncContainer* asyncContainer;
    asyncContainer = new TreasuryManagerAsyncContainer(TREMQuery_BankTipgetId,playerObject->getClient());
    asyncContainer->amount = amount;
    asyncContainer->surcharge = surcharge;
    asyncContainer->targetName = targetName;
    asyncContainer->player = playerObject;

    mDatabase->ExecuteSqlAsync(this,asyncContainer,sql);
}
예제 #5
0
BString ObjectController::handleBroadcast(BString message) const
{
    int8 rawData[128];

    int8* replyStr = "OK";
    if (message.getLength())
    {
        // Any valid message?
        int32 elementCount = sscanf(message.getAnsi(), "%80s", rawData);
        if (elementCount > 0)
        {
            message.convert(BSTRType_Unicode16);

            PlayerAccMap::const_iterator it = gWorldManager->getPlayerAccMap()->begin();
            while(it != gWorldManager->getPlayerAccMap()->end())
            {
                const PlayerObject* const player = (*it).second;
                if (player->isConnected())
                {
                    gMessageLib->SendSystemMessage(message.getUnicode16(), player);
                }
                ++it;
            }
        }
        else
        {
            replyStr = "No broadcast supplied";
        }
    }
    else
    {
        replyStr = "No broadcast supplied";
    }
    return replyStr;
}
예제 #6
0
bool CraftingManager::HandleRequestDraftslotsBatch(Object* object,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject*	playerObject	= dynamic_cast<PlayerObject*>(object);
    BString			requestStr;
    BStringVector	dataElements;
    uint16			elementCount;

    message->getStringUnicode16(requestStr);
    requestStr.convert(BSTRType_ANSI);

    elementCount = requestStr.split(dataElements,' ');

    if(!elementCount)
    {
        return false;
    }

    for(uint16 i = 1; i < elementCount; i += 2)
    {
        // since we currently store everything in 1 schematic object, just look up by the crc
        // lookup of weights is done in requestresourceweightsbatch
        uint64 itemId = boost::lexical_cast<uint64>(dataElements[i].getAnsi());
        DraftSchematic* schematic = gSchematicManager->getSchematicBySlotId(static_cast<uint32>(itemId));

        if(schematic)
        {
            gMessageLib->sendDraftslotsResponse(schematic,playerObject);
        }
    }
    return true;
}
예제 #7
0
bool CraftingManager::HandleRequestResourceWeightsBatch(Object* object,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject*	playerObject	= dynamic_cast<PlayerObject*>(object);
    BString			requestStr;
    BStringVector	dataElements;
    uint16			elementCount;

    message->getStringUnicode16(requestStr);
    requestStr.convert(BSTRType_ANSI);

    elementCount = requestStr.split(dataElements,' ');

    if(!elementCount)
    {
        return false;
    }

    for(uint16 i = 0; i < elementCount; i++)
    {
        uint64 itemId = boost::lexical_cast<uint64>(dataElements[i].getAnsi());
        DraftSchematic* schematic = gSchematicManager->getSchematicByWeightId(static_cast<uint32>(itemId));

        if(schematic)
        {
            gMessageLib->sendDraftWeightsResponse(schematic,playerObject);
        }
    }
    return true;
}
예제 #8
0
void ObjectController::broadcastGalaxyMessage(BString theBroadcast, int32 planetId) const
{
    if (theBroadcast.getLength())
    {
        PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
        if (player)
        {
            theBroadcast.convert(BSTRType_Unicode16);

            // let the chatserver handle this.
            Message* newMessage;
            gMessageFactory->StartMessage();
            gMessageFactory->addUint32(opIsmBroadcastGalaxy);
            gMessageFactory->addUint32(planetId);
            gMessageFactory->addString(theBroadcast);
            newMessage = gMessageFactory->EndMessage();
            player->getClient()->SendChannelA(newMessage,player->getAccountId(),CR_Chat,2);
            //this should be fastpath as not being Mission critical and we want to prevent the communication protocol overhead with Acks and resends

            // Convert since we are going to print it.
            // theBroadcast.convert(BSTRType_ANSI);
        }
    }

}
예제 #9
0
void ObjectController::sendAdminFeedback(BString reply) const
{
    PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
    if ((player) && (player->isConnected()))
    {
        if (reply.getLength())
        {
            gLogger->log(LogManager::NOTICE,"Admin (%s): %s", player->getFirstName().getAnsi(), reply.getAnsi());
            reply.convert(BSTRType_Unicode16);
            gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true);
        }
        else
        {
            gLogger->log(LogManager::NOTICE,"Admin (%s):", player->getFirstName().getAnsi());
        }
    }
    else
    {
        if (reply.getDataLength())
        {
            gLogger->log(LogManager::NOTICE,"Admin (anon): %s", reply.getAnsi());
        }
        else
        {
            gLogger->log(LogManager::NOTICE,"Admin (anon):");
        }
    }
}
예제 #10
0
void ObjectController::sendAdminFeedback(BString reply) const
{
    PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
    if ((player) && (player->isConnected()))
    {
        if (reply.getLength())
        {
            reply.convert(BSTRType_Unicode16);
            gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true);
        }
        else
        {
            DLOG(info) << "Admin :" << player->getFirstName().getAnsi();
        }
    }
    else
    {
        if (reply.getDataLength())
        {
            DLOG(info) << "Admin (anon): " << reply.getAnsi();
        }
        else
        {
        }
    }
}
예제 #11
0
void ObjectController::_handleSetWaypointName(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject*	player		= dynamic_cast<PlayerObject*>(mObject);
    BString			name;
    Datapad* datapad			= player->getDataPad();
    WaypointObject*	waypoint	= datapad->getWaypointById(targetId);
    int8			sql[1024],restStr[64],*sqlPointer;

    if(waypoint == NULL)
    {
        DLOG(info) << "ObjController::handlesetwaypointname: could not find waypoint "<< targetId;
        return;
    }

    message->getStringUnicode16(name);

    if(!(name.getLength()))
        return;

    waypoint->setName(name);

    name.convert(BSTRType_ANSI);

    sprintf(sql,"UPDATE %s.waypoints SET name='",mDatabase->galaxy());
    sqlPointer = sql + strlen(sql);
    sqlPointer += mDatabase->escapeString(sqlPointer,name.getAnsi(),name.getLength());
    sprintf(restStr,"' WHERE waypoint_id=%" PRIu64 "",targetId);
    strcat(sql,restStr);

    mDatabase->executeSqlAsync(NULL,NULL,sql);


    gMessageLib->sendUpdateWaypoint(waypoint,ObjectUpdateChange,player);
}
예제 #12
0
void ChatMessageLib::sendGroupSystemMessage(BString name, BString pointer, Player* target, GroupObject* group, bool unicode) const
{
    name.convert(BSTRType_Unicode16);
    uint32	pointerLength = (uint32)ceil((double)(pointer.getLength() / 2));

    Message* newMessage;

    gMessageFactory->StartMessage();
    gMessageFactory->addUint32(opChatSystemMessage);
    gMessageFactory->addUint8(0);
    gMessageFactory->addUint32(0);

    gMessageFactory->addUint32(45 + pointerLength + name.getLength());
    gMessageFactory->addUint16(1);
    gMessageFactory->addUint8(1);
    gMessageFactory->addUint32(0xffffffff);
    gMessageFactory->addString(BString("group"));
    gMessageFactory->addUint32(0);
    gMessageFactory->addString(pointer);
    gMessageFactory->addUint64(0);
    gMessageFactory->addUint64(0);

    if(unicode)
    {
        gMessageFactory->addString(name);
        gMessageFactory->addUint32(0);
        gMessageFactory->addUint64(0);
        gMessageFactory->addUint32(0);
        gMessageFactory->addUint32(0);
    }
    else
    {
        gMessageFactory->addUint32(0);
        gMessageFactory->addUint32(0);
        gMessageFactory->addUint64(0);
        gMessageFactory->addUint32(0);
        gMessageFactory->addString(name);
    }

    gMessageFactory->addUint64(0);
    gMessageFactory->addUint64(0);
    gMessageFactory->addUint32(0);
    gMessageFactory->addUint32(0);
    gMessageFactory->addUint32(0);
    gMessageFactory->addUint16(0);

    newMessage = gMessageFactory->EndMessage();

    if(group == NULL)
    {
        target->getClient()->SendChannelA(newMessage, target->getClient()->getAccountId(), CR_Client, 5);
    }
    else
    {
        group->broadcastMessage(newMessage);
    }
}
예제 #13
0
//======================================================================================================================
//
// Modifies the Admin List
//
void	ObjectController::_handleNameStructure(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)

{
    // requirement we have the structure targeted AND give the name of the recipient on the commandline
    // OR we have the recipient targeted and stand NEXT to the structure were about to transfer

    //do we have a valid donor ?
    CreatureObject* creature  = dynamic_cast<CreatureObject*>(mObject); PlayerObject* player = creature->GetGhost();

    if(!player)
    {
        return;
    }

    //do we have a valid structure ??? check our target first
    uint64 id = player->GetCreature()->getTargetId();
    Object* object = gWorldManager->getObjectById(id);
    PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object);

    if(!structure)
    {
        gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player);
        return;
    }

    //is the structure in Range???
    float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0);
    if(glm::distance(player->GetCreature()->mPosition, structure->mPosition) > fTransferDistance)
    {
        gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player);
        return;
    }

    //find out where our structure is
    BString dataStr;
    message->getStringUnicode16(dataStr);

    BString nameStr;

    dataStr.convert(BSTRType_ANSI);

    sscanf(dataStr.getAnsi(),"%s",nameStr.getAnsi());

    if(nameStr.getLength() > 68)
    {
        gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "not_valid_name"), player);
        return;
    }

    StructureAsyncCommand command;
    command.Command = Structure_Command_RenameStructure;
    command.PlayerId = player->getId();
    command.StructureId = structure->getId();

    gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->GetCreature()->getFirstName(),"ADMIN",command);

}
예제 #14
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);
}
예제 #15
0
void Object::sendAttributes(PlayerObject* playerObject)
{
    if(playerObject->getConnectionState() != PlayerConnState_Connected)
        return;

    if(!mAttributeMap.size() || mAttributeMap.size() != mAttributeOrderList.size())
        return;

    Message*	newMessage;
    BString		value;

    gMessageFactory->StartMessage();
    gMessageFactory->addUint32(opAttributeListMessage);
    gMessageFactory->addUint64(mId);

    gMessageFactory->addUint32(mAttributeMap.size());

    AttributeMap::iterator			mapIt;
    AttributeOrderList::iterator	orderIt = mAttributeOrderList.begin();

    while(orderIt != mAttributeOrderList.end())
    {
        mapIt = mAttributeMap.find(*orderIt);
        //see if we have to format it properly

        gMessageFactory->addString(gWorldManager->getAttributeKey((*mapIt).first));
        value = (*mapIt).second.c_str();
        if(gWorldManager->getAttributeKey((*mapIt).first).getCrc() == BString("duration").getCrc())
        {
            uint32 time;
            sscanf(value.getAnsi(),"%u",&time);
            //uint32 hour = (uint32)time/3600;
            //time = time - hour*3600;
            uint32 minutes = (uint32)time/60;
            uint32 seconds = time - minutes*60;
            int8 valueInt[64];
            sprintf(valueInt,"%um %us",minutes,seconds);
            value = valueInt;

        }

        value.convert(BSTRType_Unicode16);
        gMessageFactory->addString(value);

        ++orderIt;
    }

    //these should not be necessary in precu they start appearing in cu!!!
    //gMessageFactory->addUint32(0xffffffff);

    newMessage = gMessageFactory->EndMessage();

    //must in fact be send as unreliable for attributes to show during the crafting process!!!
    (playerObject->getClient())->SendChannelAUnreliable(newMessage, playerObject->getAccountId(),CR_Client,9);
}
예제 #16
0
void CSRManager::_processGetArticleMessage(Message *message, DispatchClient* client)
{
    BString id;
    message->getStringAnsi(id);
    id.convert(BSTRType_ANSI);

    CSRAsyncContainer* asynccontainer = new CSRAsyncContainer(CSRQuery_FullArticle);
    asynccontainer->mClient = client;
    mDatabase->ExecuteProcedureAsync(this, asynccontainer, "CALL sp_CSRKnowledgeBaseArticleGet(%s);", id.getAnsi());
    
}
void ObjectController::_handleSetSpokenLanguage(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject*	playerObject	= dynamic_cast<PlayerObject*>(mObject);
    BString			tmpStr;

    message->getStringUnicode16(tmpStr);
    tmpStr.convert(BSTRType_ANSI);

    uint32 languageId = boost::lexical_cast<uint32>(tmpStr.getAnsi());
    playerObject->setLanguage(languageId);
    gMessageLib->sendLanguagePlay9(playerObject);
}
예제 #18
0
void FireworkShow::handleUIEvent(BString strAvailable, BString strDelay, UIWindow* window)
{
    if(window == NULL)
    {
        return;
    }
    //uint32 delay = atoi(strDelay.getAnsi());
    strDelay.convert(BSTRType_ANSI);
    int32 delay = atoi(strDelay.getAnsi());
    gLogger->log(LogManager::DEBUG,"strDealay atoi = %i",delay);
    fireworkShowList.at(this->fireworkShowListModify).delay = delay;

}
예제 #19
0
void BankTerminal::handleUIEvent(BString strInventoryCash, BString strBankCash, UIWindow* window)
{

    if(window == NULL)
    {
        return;
    }

    PlayerObject* playerObject = window->getOwner(); // window owner

    if(playerObject == NULL || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead() || playerObject->checkState(CreatureState_Combat))
    {
        return;
    }

    // two money movement deltas stands for credits
    // variations into bank & inventory.
    // casting as signed cause one will be negative.
    // when inventoryDelta + bankDelta is not equal to zero,
    // that means player treasury has changed since
    // the transfer window opened.

    // we get the money deltas by parsing the string returned
    // by the SUI window

    strInventoryCash.convert(BSTRType_ANSI);
    strBankCash.convert(BSTRType_ANSI);

    int32 inventoryMoneyDelta = atoi(strInventoryCash.getAnsi()) - dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getCredits();
    int32 bankMoneyDelta = atoi(strBankCash.getAnsi()) - dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->getCredits();

    // the amount transfered must be greater than zero
    if(bankMoneyDelta == 0 || inventoryMoneyDelta == 0)
    {
        return;
    }

    gTreasuryManager->bankTransfer(inventoryMoneyDelta, bankMoneyDelta, playerObject);
}
예제 #20
0
void MessageLib::sendConstructionComplete(PlayerObject* playerObject, PlayerStructure* structure)
{

    atMacroString* aMS = new atMacroString();

    aMS->addMBstf("player_structure","construction_complete");
    aMS->addDI(playerObject->getLots());
    aMS->addTOstf(structure->getNameFile(),structure->getName());
    aMS->addTextModule();

    BString planet;
    planet = gWorldManager->getPlanetNameThis();
    planet.toLowerFirst();

    BString wText = "";
    BString name = structure->getCustomName();
    name.convert(BSTRType_ANSI);
    wText << name.getAnsi();


    if(!structure->getCustomName().getLength())
    {
        //wText = "@player_structure:structure_name_prompt ";
        wText <<"@"<<structure->getNameFile().getAnsi()<<":"<<structure->getName().getAnsi();
    }

    aMS->setPlanetString(planet);
    aMS->setWP(static_cast<float>(structure->mPosition.x), static_cast<float>(structure->mPosition.y), 0, wText);
    aMS->addWaypoint();


    mMessageFactory->StartMessage();
    mMessageFactory->addUint32(opIsmSendSystemMailMessage);
    mMessageFactory->addUint64(playerObject->getId());
    mMessageFactory->addUint64(playerObject->getId());
    //mMessageFactory->addString(targetObject->getFirstName());
    mMessageFactory->addString(BString("@player_structure:construction_complete_sender"));
    mMessageFactory->addString(BString("@player_structure:construction_complete_subject"));
    mMessageFactory->addUint32(0);
    mMessageFactory->addString(aMS->assemble());
    delete aMS;


    Message* newMessage = mMessageFactory->EndMessage();
    playerObject->getClient()->SendChannelA(newMessage, playerObject->getAccountId(), CR_Chat, 6);





}
예제 #21
0
bool MessageLib::sendBanList(PlayerStructure* structure, PlayerObject* playerObject)
{
    if(!(playerObject->isConnected()))
        return(false);

    Message* newMessage;

    mMessageFactory->StartMessage();
    mMessageFactory->addUint32(opSendPermissionList);
    mMessageFactory->addUint32(structure->getStrucureBanList().size() );

    BString name;
    BStringVector vector = 	structure->getStrucureBanList();
    BStringVector::iterator it = vector.begin();
    while(it != vector.end())
    {
        name = (*it);
        name.convert(BSTRType_Unicode16);
        mMessageFactory->addString(name);

        it++;
    }

    mMessageFactory->addUint32(0); // ???
    //mMessageFactory->addUint16(0);	// unknown
    name = "BAN";
    name.convert(BSTRType_Unicode16);
    mMessageFactory->addString(name);
    mMessageFactory->addUint32(0); // ???

    newMessage = mMessageFactory->EndMessage();

    (playerObject->getClient())->SendChannelA(newMessage, playerObject->getAccountId(), CR_Client, 5);

    structure->resetStructureAdminList();

    return(true);
}
예제 #22
0
void CSRManager::_processCreateTicketMessage( Message* message, DispatchClient* client )
{
    BString playername;
    BString comment;
    BString info;
    BString harrassinguser;
    BString language;

    message->getStringAnsi(playername);
    uint32 category = message->getUint32();
    uint32 subcategory = message->getUint32();
    message->getStringUnicode16(comment);
    message->getStringUnicode16(info);
    message->getStringUnicode16(harrassinguser);
    message->getStringAnsi(language);
    /*uint32 errorcode = */
    message->getUint32();
    uint8 bugreport = message->getUint8();

    comment.convert(BSTRType_ANSI);
    info.convert(BSTRType_ANSI);;
    harrassinguser.convert(BSTRType_ANSI);

    CSRAsyncContainer* asyncContainer = new CSRAsyncContainer(CSRQuery_NewTicket);
    asyncContainer->mClient = client;

    int8 cleanPlayer[4000], cleanComment[4000], cleanInfo[4000], cleanHarrasser[4000], cleanLanguage[4000];
    mDatabase->Escape_String(cleanPlayer, playername.getAnsi(), playername.getLength());
    mDatabase->Escape_String(cleanInfo, info.getAnsi(), info.getLength());
    mDatabase->Escape_String(cleanComment, comment.getAnsi(), comment.getLength());
    mDatabase->Escape_String(cleanHarrasser, harrassinguser.getAnsi(), harrassinguser.getLength());
    mDatabase->Escape_String(cleanLanguage, language.getAnsi(), language.getLength());

    mDatabase->ExecuteProcedureAsync(this, asyncContainer, "CALL sp_CSRTicketAdd('%s', %u, %u, '%s', '%s', '%s', '%s', %d);", cleanPlayer, category, subcategory, cleanComment, cleanInfo, cleanHarrasser, cleanLanguage, bugreport);
    
}
예제 #23
0
void ObjectController::_handleCancelShutdownGalaxy(uint64 targetId, Message* message, ObjectControllerCmdProperties* cmdProperties)
{
    int8 rawData[128];
    rawData[0] = 0;
    BString msgString;
    message->getStringUnicode16(msgString);
    msgString.convert(BSTRType_ANSI);

    // Remove current command and leadig white space.
    msgString = skipToNextField(msgString);

    BString feedback = this->handleCancelShutdownGalaxy(msgString);
    sprintf(rawData,"%s: [%s]", cmdProperties->mCommandStr.getAnsi(), feedback.getAnsi());
    this->sendAdminFeedback(rawData);
}
예제 #24
0
void AdminManager::_processScheduleShutdown(Message* message, DispatchClient* client)
{
    message->ResetIndex();

    BString msg;
    msg.setType(BSTRType_Unicode16);
    msg.setLength(512);

    /* uint32 opCode = */
    message->getUint32();
    uint32 scheduledTime = message->getUint32();
    message->getStringUnicode16(msg);

    msg.convert(BSTRType_ANSI);
    this->addAdminRequest(AdminScheduledShutdown, msg, (int32)scheduledTime);
}
예제 #25
0
void ObjectController::cancelScheduledShutdown(BString cancelShutdownReason) const
{
    PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
    if (player)
    {
        cancelShutdownReason.convert(BSTRType_Unicode16);

        // let the chatserver handle this.
        Message* newMessage;
        gMessageFactory->StartMessage();
        gMessageFactory->addUint32(opIsmCancelShutdown);
        gMessageFactory->addUint32(0);					// Can be used as an option in the future,
        gMessageFactory->addString(cancelShutdownReason);
        newMessage = gMessageFactory->EndMessage();
        player->getClient()->SendChannelA(newMessage,player->getAccountId(),CR_Chat,2);
        //this should be fastpath as not being Mission critical and we want to prevent the communication protocol overhead with Acks and resends
    }
}
예제 #26
0
void Instrument::sendAttributes(PlayerObject* playerObject)
{
    if(!(playerObject->isConnected()))
        return;

    Message* newMessage;

    gMessageFactory->StartMessage();
    gMessageFactory->addUint32(opAttributeListMessage);
    gMessageFactory->addUint64(mId);

    gMessageFactory->addUint32(1 + mAttributeMap.size());

    BString	value;

	wchar_t temp[64];
    swprintf(temp,50,L"%u/%u",mMaxCondition - mDamage,mMaxCondition);

    gMessageFactory->addString(BString("condition"));
    gMessageFactory->addString(temp);

    AttributeMap::iterator			mapIt;
    AttributeOrderList::iterator	orderIt = mAttributeOrderList.begin();

    while(orderIt != mAttributeOrderList.end())
    {
        mapIt = mAttributeMap.find(*orderIt);

        gMessageFactory->addString(gWorldManager->getAttributeKey((*mapIt).first));

        value = (*mapIt).second.c_str();
        value.convert(BSTRType_Unicode16);

        gMessageFactory->addString(value);

        ++orderIt;
    }

    //gMessageFactory->addUint32(0xffffffff);

    newMessage = gMessageFactory->EndMessage();

    (playerObject->getClient())->SendChannelAUnreliable(newMessage, playerObject->getAccountId(), CR_Client, 9);
}
예제 #27
0
void TreasuryManager::bankTipOffline(uint32 amount,PlayerObject* player,BString targetName)
{

    //============================================
    //check whether we have sufficient funds
    //dont forget the surcharge
    auto equip_service = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::equipment::EquipmentService>("EquipmentService");
	//auto inventory	= dynamic_cast<Inventory*>(equip_service->GetEquippedObject(player, "inventory"));
	auto bank		= dynamic_cast<Bank*>(equip_service->GetEquippedObject(player->GetCreature(), "bank"));

	if(!bank)    {
		LOG (error) << "TreasuryManager::bankJoin No bank for " << player->getId();
		return;
	}

    int32 credits = bank->getCredits();

    int32 surcharge = (int32)((amount/100)*5);

    if((amount + surcharge) > credits)
    {
        BString uniName = targetName;
        uniName.convert(BSTRType_Unicode16);

        gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_tip_nsf_bank", L"", L"", uniName.getUnicode16(), amount), player);
        return;
    }
    //now get the player
    int8 name[50];
    mDatabase->escapeString(name,targetName.getAnsi(),targetName.getLength());

    int8 sql[256];
    sprintf(sql,"SELECT id FROM %s.characters WHERE firstname like '%s'",mDatabase->galaxy(),name);

    TreasuryManagerAsyncContainer* asyncContainer;
    asyncContainer = new TreasuryManagerAsyncContainer(TREMQuery_BankTipgetId,player->getClient());
    asyncContainer->amount = amount;
    asyncContainer->surcharge = surcharge;
    asyncContainer->targetName = targetName;
    asyncContainer->player = player;

    mDatabase->executeSqlAsync(this,asyncContainer,sql);
}
예제 #28
0
//=============================================================================
//
// update existing waypoint
// never call this directly - always go over the datapad!!!!!
//
void ObjectFactory::requestUpdatedWaypoint(ObjectFactoryCallback* ofCallback,uint64 wpId,BString name,
        const glm::vec3& coords,uint16 planetId,uint64 ownerId, uint8 activeStatus)
{
    PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(ownerId));
    OFAsyncContainer* asyncContainer = new(mDbAsyncPool.ordered_malloc()) OFAsyncContainer(ofCallback,QFQuery_WaypointUpdate,player->getClient());
    asyncContainer->Id = wpId;

    int8 sql[512],*sqlPointer;
    int8 restStr[128];
    name.convert(BSTRType_ANSI);
    sprintf(sql,"CALL sp_WaypointUpdate('");
    sqlPointer = sql + strlen(sql);
    sqlPointer += mDatabase->escapeString(sqlPointer, name.getAnsi() ,name.getLength());
    sprintf(restStr,"',%"PRIu64",%f,%f,%f,%u,%u)",wpId, coords.x, coords.y, coords.z, planetId, activeStatus);
    strcat(sql,restStr);

    mDatabase->executeProcedureAsync(this,asyncContainer,sql);
    
}
예제 #29
0
void ObjectController::_handleNewbieSelectStartingLocation(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
    PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
    // gLogger->hexDump(message->getData(),message->getSize());

    // Find the planet and position.
    if (gWorldConfig->isTutorial())
    {
        BString name;
        message->getStringUnicode16(name);

        if (!(name.getLength()))
        {
            return;
        }
        name.convert(BSTRType_ANSI);
        player->getTutorial()->warpToStartingLocation(name);
    }
}
예제 #30
0
void CraftingManager::handleCraftCustomization(Object* object,Message* message)
{
    PlayerObject*		player		= dynamic_cast<PlayerObject*>(object);
    CraftingSession*	session		= player->getCraftingSession();
    BString				itemName;
    uint8				hmmm1,hmmm2;
    uint32				amount,color;

    if(!session)
        return;
    player->setCraftingStage(4);

    message->getStringUnicode16(itemName);
    itemName.convert(BSTRType_ANSI);

    message->getUint8(hmmm1);

    message->getUint32(amount);
    message->getUint8(hmmm2);

    CustomizationList* cList;

    cList = session->getManufacturingSchematic()->getCustomizationList();
    CustomizationList::iterator	custIt = cList->begin();

    uint32 i = 0;
    while((custIt != cList->end())&&(i < hmmm2))
    {
        message->getUint32(color);
        message->getUint32(color);
        session->getItem()->setCustomization(static_cast<uint8>((*custIt)->cutomizationIndex),(uint16)color,3);

        i++;
        ++custIt;
    }

    int8 sql[550];
    sprintf(sql, "INSERT INTO item_customization VALUES (%"PRIu64", %u, %u)",session->getItem()->getId(), session->getItem()->getCustomization(1), session->getItem()->getCustomization(2));
    mDatabase->executeAsyncSql(sql);

    session->setProductionAmount(amount);
    session->customize(itemName.getAnsi());
}