setPlayerExpRate(cid, rate)
Olá pessoal esse é meu primeiro tópico como Coloborador XTibia, este código não foi criado por mim, mas eu fiz uma modificação para que ele funcionasse para o TFS, a partir de semana que vem vou trazer codes meus, e modificações em codes feitas por mim, estou trazendo este code por que acho legal =D.
Ele tem a função de adicionar um Extra Exp ao player que estiver usando algum item é quase igual ao amuleto da experiencia, mas tem umas melhoriase o item é configurado pelos movements.xml . Então agora vamos ao que interessa.
Em player.cpp acima de:
idleTime = 0;
Adicione o seguinte:
expRate = 1;
Procure por isto:
return (result * g_config.getNumber(ConfigManager::RATE_EXPERIENCE) );
E substitua por isto aqui:
return ((result * g_config.getNumber(ConfigManager::RATE_EXPERIENCE)) * expRate);
Ao final de player.cpp adicione isto:
void Player::changePlayerExpRate(uint32_t rate) { expRate = rate; }
Em Player.h acima de:
void resetIdleTime() {idleTime = 0;}
Adicione isto:
uint32_t getExpRate() const {return expRate;} void changePlayerExpRate(uint32_t rate);
Acima disto:
int32_t idleTime;
Adicione isto:
uint32_t expRate;
Em creature.cpp procure isto:
return attacker->getPlayer() ? ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_game.getExperienceStage(attacker->getPlayer()->getLevel()))) : ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_config.getNumber(ConfigManager::RATE_EXPERIENCE) ));
E substitua por isto:
return attacker->getPlayer() ? (((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_game.getExperienceStage(attacker->getPlayer()->getLevel()))) * attacker->getPlayer()->getExpRate()) : ((uint64_t)std::floor(getDamageRatio(attacker) * lostExperience * g_config.getNumber(ConfigManager::RATE_EXPERIENCE)));
Em luascript.cpp acima de:
lua_register(m_luaState, "escapeString", LuaScriptInterface::luaEscapeString);
E adicione isto:
lua_register(m_luaState, "setPlayerExpRate", LuaScriptInterface::luaSetPlayerExpRate);
E no final de luascript.cpp adicione isto:
int32_t LuaScriptInterface::luaSetPlayerExpRate(lua_State* L) { uint32_t rate = popNumber(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getScriptEnv(); Player* player = env->getPlayerByUID(cid); if(player){ player->changePlayerExpRate(rate); lua_pushnumber(L, LUA_ERROR); } else{ reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushnumber(L, LUA_ERROR); } return 1; }
Em luascript.h acima de:
static int32_t luaEscapeString(lua_State* L);
Adicione isto:
static int32_t luaSetPlayerExpRate(lua_State* L);
Como usar?
Simples.... só usar o script abaixo =D
Vá em data/movements/scripts/ e crie um arquivo com o nome de extraExp.lua e adicione isto dentro:
function onEquip(cid, item) setPlayerExpRate(cid, 4) end function onDeEquip(cid, item) setPlayerExpRate(cid, 1) end
Agora em movements.xml adicione isto:
<movevent event="Equip" itemid="2179" slot="ring" function="onEquipItem" script="extraExp.lua.lua"/> <movevent event="DeEquip" itemid="2179" slot="ring" function="onDeEquipItem" script="extraExp.lua"/>
Como funciona?
Simpres....se a rate do server for 35 se o player tiver usando o item que da extra exp vai ficar assim 35 * 4 = 140 de exp =D
Bom uso..
E até a próxima