29 minutos atrás, Ed'Specter disse:
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....




info
Grupo: Conde
Registrado: 18/01/12
Posts: 988
Reputação: +327
Gênero: Masculino
Char no Tibia: Xerife Woody
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:
E substitua toda a função por isso:
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:
Substitua tudo por isso:
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:
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