Ir para conteúdo

Não dropar slot específico *doCreatureSetDropLoot(cid, doDrop[, slot])


Posts Recomendados

Olá xTibianos, venho hoje contribuir com meu primeiro script em C++.
Sou novo na linguagem, e acredito que poderia ter ficador menor e/ou melhor. 
Tenho pedido bastante ajuda de alguns colegas que entendem do assunto, a quem quiser dar dicas, serão muito bem vindo, estou com os zuvido abertos.

O sistema é simples, serve para que o player não perca um slot específico, ou seja, se o player morrer sem aol, por exemplo, ele pode peder todos os itens, de todos os slots, exceto o item que estiver no slot utilizado na função.

Exemplo: doCreatureSetDropLoot(cid, true, CONST_SLOT_BACKPACK)
O que estiver no slot da backpack não será dropado.
Observe que utilizei true, ao invés de false, isso pq o player ainda vai perder as outras coisas.

Vamos lá...
Em luascript.cpp procure a função:

int32_t LuaScriptInterfaceluaDoCreatureSetDropLoot(lua_State* L)

E substitua toda a função por isso:

Spoiler

int32_t LuaScriptInterface::luaDoCreatureSetDropLoot(lua_State* L)
{
    //doCreatureSetDropLoot(cid, doDrop[, slot])
    int32_t params = lua_gettop(L);
    uint32_t slot = 0;
    if (params > 2)
       slot = (slots_t)popNumber(L);
       
    bool doDrop = popNumber(L);
    ScriptEnviroment* env = getEnv();
    
    Player* player = env->getPlayerByUID(popNumber(L));
    if(!player)
    {
        errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
        lua_pushboolean(L, false);
    }
    else
    { 
         for(int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i)
         {
            if ((slots_t)i == (slots_t)slot) 
            {
                 std::stringstream buffer;
                 buffer << slot;
                 std::string value;
                 value = buffer.str();
                 player->setStorage("19239", value);
                 break;
            }
         }
     player->setDropLoot(doDrop ? LOOT_DROP_FULL : LOOT_DROP_NONE);
     lua_pushboolean(L, true);
     }
    return 1;
}

 


Agora em player.cpp procure isso:

void PlayerdropLoot(Container* corpse)

Substitua tudo por isso:

Spoiler

void Player::dropLoot(Container* corpse)
{
    if(!corpse || lootDrop != LOOT_DROP_FULL)
        return;

    uint32_t start = g_config.getNumber(ConfigManager::BLESS_REDUCTION_BASE), loss = lossPercent[LOSS_CONTAINERS], bless = getBlessings();
    while(bless > 0 && loss > 0)
    {
        loss -= start;
        start -= g_config.getNumber(ConfigManager::BLESS_REDUCTION_DECREAMENT);
        bless--;
    }

    uint32_t itemLoss = (uint32_t)std::floor((5. + loss) * lossPercent[LOSS_ITEMS] / 1000.);
    for(int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i)
    {
      std::stringstream buffer;
      buffer << (slots_t)i;
      std::string value;
      std::string slotn;
      slotn = buffer.str();
      getStorage("19239",value);
      if (value != slotn)
      {
        Item* item = inventory;
        if(!item)
            continue;

        uint32_t rand = random_range(1, 100);
        if(skull > SKULL_WHITE || (item->getContainer() && rand < loss) || (!item->getContainer() && rand < itemLoss))
        {
            g_game.internalMoveItem(NULL, this, corpse, INDEX_WHEREEVER, item, item->getItemCount(), 0);
            sendRemoveInventoryItem((slots_t)i, inventory[(slots_t)i]);
        }
       }
    }
}

 

Prontinho.

Agora em data/creaturescripts/scripts/login.lua, antes do ultimo return true adicione:
setPlayerStorageValue(cid, 19239, 0)

 

Exemplo de uso:

Spoiler

function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)


if isPlayer(cid) then
     if getPlayerVocationName(cid) == 4 and getPlayerLevel(cid) >= 100 then
    
           doCreatureSetDropLoot(cid, true, CONST_SLOT_BACKPACK)

    

     end
end
 

return true
end



Quando eu estiver mais aprimorado, disponibilizo melhores conteúdo, flw ;p

Link para o comentário
Compartilhar em outros sites

29 minutos atrás, Ed'Specter disse:

 

  Mostrar conteúdo oculto

function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)

 

if isPlayer(cid) then

     if getPlayerVocationName(cid) == 4 and getPlayerLevel(cid) >= 100 then

    

           doCreatureSetDropLoot(cid, true, CONST_SLOT_BACKPACK)

    

     end

end

 

return true

end

 

 

Quando eu estiver mais aprimorado, disponibilizo melhores conteúdo, flw ;p

 

 

Boa brother, exelente script....

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...