Ir para conteúdo

Posts Recomendados

Function onGainExp(cid, value)

Criador: knightxd

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 :

CREATURE_EVENT_OUTFIT,

e adicione embaixo :

CREATURE_EVENT_GAINEXP,

Novamente, Procure por

uint32_t executeOutfit(Creature* creature, const Outfit_t& old, const Outfit_t& current);

e adicione embaixo:

uint32_t executeGainExp(Player* player, int32_t value);

Agora, Abra creatureevent.cpp e Procure por :

else if(tmpStr == "outfit")
m_type = CREATURE_EVENT_OUTFIT;

e adicione embaixo:

else if(tmpStr == "gainexp")
m_type = CREATURE_EVENT_GAINEXP;

Procure por:

case CREATURE_EVENT_OUTFIT:
return "onOutfit";

e adicione embaixo:

case CREATURE_EVENT_GAINEXP:
return "onGainExp";

Agora, Procure por:

case CREATURE_EVENT_OUTFIT:
return "cid, old, current";~

e adicione embaixo:

case CREATURE_EVENT_GAINEXP:
return "cid, value";

Agora, Procure por:

std::cout << "[Error - CreatureEvent::executeStatsChange] Call stack overflow." << std::endl;
return 0;
}
}

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

bool Player::gainExperience(double& gainExp

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:

function onGainExp(cid, value)
print(value)
end

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 por BananaFight
Link para o comentário
https://xtibia.com/forum/topic/221481-function-ongainexpcid-value/
Compartilhar em outros sites

  • 1 month later...

Ow, acho que tem alguns erros nisso porque olha o que deu aqui quando tentei compilar.

Pois essa parte:

 

Agora em Player.cpp procure por

bool 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(CreatureEventList::iterator 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!

Editado por Martelix
Link para o comentário
https://xtibia.com/forum/topic/221481-function-ongainexpcid-value/#findComment-1580420
Compartilhar em outros sites

  • 2 weeks later...

^ vc coloco dentro da função bool Player::gainExperience(double& gainExp, bool fromMonster)?

bool Player::gainExperience(double& gainExp, bool fromMonster)
{

embaixo dessa parte, se vc coloco antes do"{" apague e coloque na linha de baixo

 

se der erro no executeGainExp(aqui deu):

tem que por um cast,porque gainexp ta em double e executeGainExp(this, gainExp) usa uint32_t

if(!(*it)->executeGainExp(this, gainExp))

troca por

if(!(*it)->executeGainExp(this, static_cast<uint32_t>(gainExp)))
Editado por lordbug99
Link para o comentário
https://xtibia.com/forum/topic/221481-function-ongainexpcid-value/#findComment-1584441
Compartilhar em outros sites

×
×
  • Criar Novo...