Créditos: Arcoz
Tenho um servidor RPG (ServerTibia) para protocolo 7.6 no qual a drop rate é 2x, ou seja, a achanse de cair itens é duas vezes mais facil
doque no Tibia.
Como eu teria muito trabalho editando monstro por monstro por monstro a chanse de cair itens, resolvi criar esse code.
Vi o quando ele foi importante para mim e vou publica-lo para os programadores e desenvolvedores que prescisam de dele ou de algo
semelhante.
Em luascript.h
|---- Em class LuaScript
|----|---- Depois de:
public:LuaScript();~LuaScript();
Adicione:
#ifdef ARC_DROP_RATEint DROP_RATE;#endif //ARC_DROP_RATE
Em luascript.cpp
|---- Em int LuaScript::OpenFile(const char *filename)
|----|---- Depois de:
if (lua_dofile(luaState, filename)) return false;
Adicione:
#ifdef ARC_DROP_RATE DROP_RATE = getGlobalNumber("droprate",1);#endif //ARC_DROP_RATE
Em monsters.cpp
|---- Em Item* MonsterType::createLootItem(const LootBlock& lootBlock)
|----|---- Subistitue:
Item* tmpItem = NULL;if(Item::items[lootBlock.id].stackable == true){ unsigned long randvalue = Monster::getRandom(); unsigned long n = 1; if(randvalue < lootBlock.chance1){ if(randvalue < lootBlock.chancemax){ n = lootBlock.countmax; } else{ //if chancemax < randvalue < chance1 n = (unsigned char)(randvalue % lootBlock.countmax + 1); } tmpItem = Item::CreateItem(lootBlock.id, (unsigned short)n); }}else{ if(Monster::getRandom() < lootBlock.chance1){ tmpItem = Item::CreateItem(lootBlock.id); }}return tmpItem;
Por:
Item* tmpItem = NULL;if(Item::items[lootBlock.id].stackable == true){ unsigned long randvalue = Monster::getRandom(); unsigned long n = 1;#ifdef ARC_DROP_RATE if(randvalue < (lootBlock.chance1 * g_config.DROP_RATE)){ if(randvalue < lootBlock.chancemax * g_config.DROP_RATE){#else if(randvalue < lootBlock.chance1){ if(randvalue < lootBlock.chancemax){#endif //ARC_DROP_RATE n = lootBlock.countmax; } else{ //if chancemax < randvalue < chance1 n = (unsigned char)(randvalue % lootBlock.countmax + 1); } tmpItem = Item::CreateItem(lootBlock.id, (unsigned short)n); }}else{#ifdef ARC_DROP_RATE if(Monster::getRandom() < lootBlock.chance1 * g_config.DROP_RATE){#else if(Monster::getRandom() < lootBlock.chance1){#endif //ARC_DROP_RATE tmpItem = Item::CreateItem(lootBlock.id); }}return tmpItem;
Caso queria que a quantidade dos itens contaveis também seja multiplicada:
|----|---- Subistiute:
tmpItem = Item::CreateItem(lootBlock.id, (unsigned short)n);
Por:
#ifdef ARC_DROP_RATE tmpItem = Item::CreateItem(lootBlock.id, (unsigned short)n * g_config.DROP_RATE);#else tmpItem = Item::CreateItem(lootBlock.id, (unsigned short)n);#endif //ARC_DROP_RATE
Vá em Projeto > Opções do Projeto > Parametros, Em Compilador C++ Adicione:
-DARC_DROP_RATE
Recompile todos os códigos fontes.
Agora no config.lua, basta adicionar:
[/code]-- drop rate multiplier (how much faster the itens will drop from monsters)
droprate = 1
Quando quiser que a rate de drop seja 2x, coloque:
-- drop rate multiplier (how much faster the itens will drop from monsters)
droprate = 2
e assim por diante.PS. Como os itens tem chanse de cair de 0,001% até 100,000%, caso queria que a drop rate seja de 100% (todos os itens caiam) coloque:
-- drop rate multiplier (how much faster the itens will drop from monsters)
droprate = 100000
Mas lembresse que se o container do corpo do monstro lotar de itens, ele não coloca mais, ou seja, se um mosntro tem espaço para 8 itens,
mas ele tem chanse de derrubar 9 itens, esse ultimo item não vai aparecer. Para arrumar isso, crie mais de uma "loot bag" nele ou edite o
arquivo items.otb para adicionar mais espaços no conteiner do corpo.