Ow, acho que tem alguns erros nisso porque olha o que deu aqui quando tentei compilar.
Pois essa parte:
Agora em Player.cpp procure porbool Player
gainExperience(double& gainExp
Em "player.cpp" só contém isso:
bool Player::gainExperience(double& gainExp, bool fromMonster)
E essa parte do código acredito que esteja errada:
if(gainExp >= 1)
{
bool deny = false;
CreatureEventList gainExpEvents = this->getCreatureEvents(CREATURE_EVENT_GAINEXP);
for(CreatureEventListiterator it = gainExpEvents.begin(); it != gainExpEvents.end(); ++it)
{
if(!(*it)->executeGainExp(this, gainExp))
deny = true;
}
if(deny)
return false;
}
Primeiro eu tentei da forma que você fez, mas deu um erro de sintaxe, depois eu dexei assim:
{
if(gainExp >= 1)
...
E meu apareceu esses erros:
player.cpp: Na função membro ‘bool Player::gainExperience(double&, bool)’:
player.cpp:3890:7: aviso: unused variable ‘deny’ [-Wunused-variable]
player.cpp:3897:2: erro: ‘deny’ was not declared in this scope
player.cpp:3900:5: erro: ‘deny’ was not declared in this scope
player.cpp: No escopo global:
player.cpp:3885:6: aviso: unused parameter ‘fromMonster’ [-Wunused-parameter]
player.cpp:3904:1: erro: expected unqualified-id before ‘{’ token
player.cpp: Na função membro ‘bool Player::gainExperience(double&, bool)’:
player.
Enfim, estes são os erros que encontrei...
Espero que você arrume pois realmente quero usar essa função, obrigado!



info
Grupo: Conde
Registrado: 14/02/13
Posts: 702
Reputação: +196
Gênero: Masculino
Function onGainExp(cid, value)
Descrição:
Esta função é ativada quando uma criatura ganha EXP.
E você pode retornar falso (return false) para que está criatura não ganhe EXP.
Instalação:
Creatureevent.h
procure por :
e adicione embaixo :
Novamente, Procure por
e adicione embaixo:
Agora, Abra creatureevent.cpp e Procure por :
e adicione embaixo:
Procure por:
e adicione embaixo:
Agora, Procure por:
e adicione embaixo:
Agora, Procure por:
embaixo adicione:
uint32_t CreatureEvent::executeGainExp(Player* player, int32_t value) { //onGainExp(cid, value) 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 value = " << value << 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->setEvent(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_pushnumber(L, value); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeGainExp] Call stack overflow." << std::endl; return 0; } }Agora em Player.cpp procure por
e embaixo adicione:
if(gainExp >= 1) { bool deny = false; CreatureEventList gainExpEvents = this->getCreatureEvents(CREATURE_EVENT_GAINEXP); for(CreatureEventList::iterator it = gainExpEvents.begin(); it != gainExpEvents.end(); ++it) { if(!(*it)->executeGainExp(this, gainExp)) deny = true; } if(deny) return false; }Exemplo de uso:
Não esqueça de registrar o evento no onlogin
Considerações finais: Sim eu sei que já existe um sistema igual no xtibia, porem ele esta errado, este funciona em qualquer source.
Desculpem pessoal, mais o xtibia tinha cortado um pedaço do tutorial, e ele estava incompleto, Agora ja foi corrigido.
Editado Setembro 22 por BananaFight