Parabens você e um dos unicos menbros que colabora na area de c++, Com codigos inovadores como esse.
- Forums
- OTServ
- Recursos
- Linguagens de Programação
- onDropLoot(cid, item)
onDropLoot(cid, item)
By caotic, 29 de mar. de 2014 in Linguagens de Programação
info
Group: Infante
Joined: 06/03/13
Posts: 1.6k
Reputation: +319
Gender: Masculino
Tibia Character: Lord Sorte

info
Group: Conde
Joined: 20/09/12
Posts: 711
Reputation: +86
Tibia Character: noé

muito bom kra, realmente vai agradar boa parte do forum creio eu kra, continue assim movimentando a area
info
Group: Cavaleiro
Joined: 24/10/13
Posts: 180
Reputation: +46

Uma Dúvida, o que isso Exatamente faz?
info
Group: Conde
Joined: 14/02/13
Posts: 702
Reputation: +196
Gender: Masculino

Ai eu te pergunto, porque diabos um gênio desses esta como "Assistente"...
Uma Dúvida, o que isso Exatamente faz?
Você pode usar isso por exemplo em 1 poketibia para avisar quando dropa 1 stone enviando 1 efeito para o personagem.
Acho que daria para fazer um AutoLoot com essa função, enfim belo código ![]()
info
Group: Cavaleiro
Joined: 24/10/13
Posts: 180
Reputation: +46

Uma Dúvida, o que isso Exatamente faz?
Você pode usar isso por exemplo em 1 poketibia para avisar quando dropa 1 stone enviando 1 efeito para o personagem.
hmm, vlw
@topic
ótimo conteúdo, obrigado por trazerao xtibia.
@banana
pensei a mesma coisa
info
Group: Visconde
Joined: 11/04/12
Posts: 328
Reputation: +7
Tibia Character: ADM MiHawk

alguem poderia fazer um auto loot para eu poder dar meus rep +? com essa funçao? u.u
Só uma dúvida, isso não funciona em sources para poketibia não, certo?
eu tentei aqui mas da erro, e algumas das linhas que você pede pra procurar, nem existem nas sources do poketibia
Edited Abril 2 by xmaster0
info
Group: Lenda
Joined: 03/10/06
Posts: 2.6k
Reputation: +309
Gender: Masculino
Tibia Character: Knight Orion

Muito bom caotic. Acho que seria uma boa passar mais um parâmetro indicando de que creature o loot dropou.
Só funciona com creatures? Ou com players mortos também executa?
Ai eu te pergunto, porque diabos um gênio desses esta como "Assistente"...
Porque não sabe indentar kakakakak
Acho que daria para fazer um AutoLoot com essa função, enfim belo código
Exatamente, ou bloquear alguns itens em eventos especificos, ou trabalhar com a stamina por scripts e não pelas sources... inúmeras possibilidades ![]()
Acho que daria para fazer um AutoLoot com essa função, enfim belo código
Sim, com essa função e possivel facilmente se fazer um AutoLoot como citado.
Nessa parte:
"
Vá em monster.cpp e procure:
void MonsterType::dropLoot(Container* corpse)
{
Item* tmpItem = NULL;
for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it)
{
uint32_t owner = corpse->getCorpseOwner();
Creature* creature = g_game.getCreatureByID(owner);
if((tmpItem = createLoot(*it)) && g_creatureEvents->dropLoot(creature, tmpItem))
{
if(Container* container = tmpItem->getContainer())
{
if(createChildLoot(container, (*it)))
corpse->__internalAddThing(tmpItem);
else
delete container;
}
else
corpse->__internalAddThing(tmpItem);
}
}
corpse->__startDecaying();
uint32_t ownerId = corpse->getCorpseOwner();
if(!ownerId)
return;
Player* owner = g_game.getPlayerByID(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() && message > LOOTMSG_PLAYER)
owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH)
owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
}
"
faz o que aq? precisa add algo? depois disso
Aqui deu error:
no `bool CreatureEvents::dropLoot(Creature*, Item*)' member function declared in class `CreatureEvents'
Alguem sabe arrumar?
deu isso..
@UP
info
Group: Campones
Joined: 30/08/08
Posts: 57
Reputation: +3
Tibia Character: Termabre Dore

É pra TFS 0.4?
Obrigado.








info
Group: Infante
Joined: 04/03/11
Posts: 1.6k
Reputation: +393
Tibia Character: No Have
Ola galera xtibianaaa.
Event droploot acontece quando um monstro ou player dropa 1 item.
Vamos la:
Vá em creatureevent.cpp e procure:
bool CreatureEvents::playerLogin(Player* player) { //fire global event if is registered bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_LOGIN && !it->second->executeLogin(player) && result) result = false; } return result; }Logo em seguida coloque:
bool CreatureEvents::dropLoot(Creature* creature, Item* item) { bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_DROPLOOT && !it->second->executeDropLoot(creature, item)) result = false; } return result; }Procure:
Coloque em seguida:
Logo apos procure:
Coloque abaixo:
Procure:
Coloque embaixo:
Procure:
uint32_t CreatureEvent::executeLogout(Player* player, bool forceLogout) { //onLogout(cid, forceLogout) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local forceLogout = " << (forceLogout ? "true" : "false") << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushboolean(L, forceLogout); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeLogout] Call stack overflow." << std::endl; return 0; } }Coloque logo apos:
uint32_t CreatureEvent::executeDropLoot(Creature* creature, Item* item) { //onDropLoot(cid, item) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); LuaScriptInterface::pushThing(L, item, env->addThing(item)); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeDropLoot] Call stack overflow." << std::endl; return 0; } }Vá em creatureevent.h e procure:CREATURE_EVENT_PREPAREDEATH,
Coloque abaixo:
Procure:
Coloque abaixo:
Vá em player.h na função:
Troque por esta função:
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) { Item* item = inventory[i]; if(!item) continue; Creature* creature = NULL; bool deny = false;item creature = g_game.getCreatureByID(getID()); CreatureEventList droploot = getCreatureEvents(CREATURE_EVENT_DROPLOOT); for(CreatureEventList::iterator it = droploot.begin(); it != droploot.end(); ++it) { if(!(*it)->executeDropLoot(this, item)) deny = true; } if(!deny) { 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]); } } } }Vá em monster.cpp e procure:
void MonsterType::dropLoot(Container* corpse) { Item* tmpItem = NULL; for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it) { uint32_t owner = corpse->getCorpseOwner(); Creature* creature = g_game.getCreatureByID(owner); if((tmpItem = createLoot(*it)) && g_creatureEvents->dropLoot(creature, tmpItem)) { if(Container* container = tmpItem->getContainer()) { if(createChildLoot(container, (*it))) corpse->__internalAddThing(tmpItem); else delete container; } else corpse->__internalAddThing(tmpItem); } } corpse->__startDecaying(); uint32_t ownerId = corpse->getCorpseOwner(); if(!ownerId) return; Player* owner = g_game.getPlayerByID(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() && message > LOOTMSG_PLAYER) owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH) owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); }Evento em uso:
function onDropLoot(cid, item) local block = {2221, 1221, 2922} for i=1, #block do if item.itemid == block[i] then return false end end return true endEdited Março 30 by caotic