• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

C++ [TFS 0.X] Adjust loot message to party members

potinho

Advanced OT User
Joined
Oct 11, 2009
Messages
1,458
Solutions
17
Reaction score
175
Location
Brazil
I have a loot message in my server. The problem here is loot message isn't sent in party members screen, just in loot channel. I tried to adjust C++ but i cant understand the logic to keep sending message to screen and loot channel for party members, I want to send loot message on party members screen too, like is working for alone players:


C++:
void MonsterType::dropLoot(Container* corpse, int32_t monsterLevel)
{
    ItemList items;
    for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it)
    {
        items = createLoot(*it, monsterLevel);
        if(items.empty())
            continue;

        for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
        {
            Item* tmpItem = *iit;
            if(Container* container = tmpItem->getContainer())
            {
                if(createChildLoot(container, *it, monsterLevel))
                    corpse->__internalAddThing(tmpItem);
                else
                    delete container;
            }
            else
                corpse->__internalAddThing(tmpItem);
        }
    }

    corpse->__startDecaying();
    uint32_t ownerId = corpse->getCorpseOwner();
    if(!ownerId)
        return;

    Player* owner = g_game.getPlayerByGuid(ownerId);
    if(!owner)
        return;

    LootMessage_t message = lootMessage;
    if(message == LOOTMSG_IGNORE)
        message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE);

    if(message < LOOTMSG_PLAYER)
        return;

    std::stringstream ss;
    ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << ".";
    if(owner->getParty())
    {
    owner->getParty()->broadcastPartyLoot(ss.str());
    }
    else
    {
    owner->sendChannelMessage("", ss.str(), MSG_CHANNEL_HIGHLIGHT, uint16_t (12)); // 12 is number for loot channel
    owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
    }
}

C++:
void Party::broadcastPartyLoot(const std::string& loot)
{

    PlayerVector::iterator it;
    leader->sendChannelMessage("", loot, MSG_CHANNEL_HIGHLIGHT, 12); // 12 is number for loot channel
    if(!memberList.empty())
    {
        for(it = memberList.begin(); it != memberList.end(); ++it)
        (*it)-> sendChannelMessage("", loot, MSG_CHANNEL_HIGHLIGHT, 12);
    }
}
 
Solved with those changes:

C++:
void MonsterType::dropLoot(Container* corpse, int32_t monsterLevel)
{
    ItemList items;
    for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it)
    {
        items = createLoot(*it, monsterLevel);
        if(items.empty())
            continue;

        for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
        {
            Item* tmpItem = *iit;
            if(Container* container = tmpItem->getContainer())
            {
                if(createChildLoot(container, *it, monsterLevel))
                    corpse->__internalAddThing(tmpItem);
                else
                    delete container;
            }
            else
                corpse->__internalAddThing(tmpItem);
        }
    }

    corpse->__startDecaying();
    uint32_t ownerId = corpse->getCorpseOwner();
    if(!ownerId)
        return;

    Player* owner = g_game.getPlayerByGuid(ownerId);
    if(!owner)
        return;

    LootMessage_t message = lootMessage;
    if(message == LOOTMSG_IGNORE)
        message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE);

    if(message < LOOTMSG_PLAYER)
        return;

    std::stringstream ss;
    ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << ".";
    if(owner->getParty())
    {
        owner->getParty()->broadcastPartyLoot(ss.str());
    }
    else
    {
        owner->sendChannelMessage("", ss.str(), MSG_CHANNEL_HIGHLIGHT, 12); // 12 is number for loot channel
        owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
    }
}

void Party::broadcastPartyLoot(const std::string& loot)
{
    leader->sendChannelMessage("", loot, MSG_CHANNEL_HIGHLIGHT, 12); // 12 is number for loot channel
    leader->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), loot);

    for(PlayerVector::iterator it = memberList.begin(); it != memberList.end(); ++it)
    {
        (*it)->sendChannelMessage("", loot, MSG_CHANNEL_HIGHLIGHT, 12);
        (*it)->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), loot);
    }
}
 
Back
Top