Ir para conteúdo

onSetOpponnent(cid, monster)


Posts Recomendados

Ola galera xtibanaana.

O creatureevent onsetopponent acontence quando uma criatura seta outra como opponent para ir prosseguir como target.

 

Vá em creatureevent.cpp e procure:

else if(tmpStr == "preparedeath")
m_type = CREATURE_EVENT_PREPAREDEATH;

Adicione embaixo:

else if(tmpStr == "opponent")
m_type = CREATURE_EVENT_OPPONENT;

Procure:

case CREATURE_EVENT_PREPAREDEATH:
return "onPrepareDeath";

Coloque embaixo:

case CREATURE_EVENT_OPPONENT:
return "onSetOpponent";

Continuado procure:

case CREATURE_EVENT_PREPAREDEATH:
return "cid, deathList";

Coloque abaixo:

case CREATURE_EVENT_OPPONENT:
return "cid, monster";

Adicione a função:

uint32_t CreatureEvent::executeSetOpponent(Creature* creature, Creature* target)
{
//onSetOpponent(cid, monster)
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;


scriptstream << "local target = " << env->addThing(target) << 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", creature->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));
lua_pushnumber(L, env->addThing(target));


bool result = m_interface->callFunction(2);
m_interface->releaseEnv();


return result;
}
}
else
{
std::cout << "[Error - CreatureEvent::executePrepareDeath] Call stack overflow." << std::endl;
return 0;
}
}

Vá em creatureevent.h e procure:

CREATURE_EVENT_PREPAREDEATH,

Adicione embaixo:

CREATURE_EVENT_OPPONENT

Procure:

uint32_t executeAttack(Creature* creature, Creature* target);

Coloque embaixo:

uint32_t executeSetOpponent(Creature* creature, Creature* target);

Vá em monster.cpp e procure a função:

 

bool Monster::isOpponent(const Creature* creature)

Substitua por essa:

bool Monster::isOpponent(const Creature* creature)
{     
      bool opponent = true;
    CreatureEventList attackEvents = getCreatureEvents(CREATURE_EVENT_OPPONENT);
    Creature* target = g_game.getCreatureByID(creature->getID());
for(CreatureEventList::iterator it = attackEvents.begin(); it != attackEvents.end(); ++it)
{   
if(!(*it)->executeSetOpponent(target, this))
opponent = false;
}


if (!opponent) {
return false;
}


return (isSummon() && getMaster()->getPlayer() && creature != getMaster()) || ((creature->getPlayer()
&& !creature->getPlayer()->hasFlag(PlayerFlag_IgnoredByMonsters)) ||
(creature->getMaster() && creature->getMaster()->getPlayer()));
}

Exemplo:

function onSetOpponent(cid, target)
local blockedpass = {"Fire Devil", "Demon", "Lord Dragon"}
if table.find(blockedpass, getCreatureName(target)) then
return true
end
return true
end
Editado por caotic
Link para o comentário
Compartilhar em outros sites

onTarget?

Na verdade onSetOpoonent acontence antes do player ir para o targerlist.

 

...

falto sim xD

 

bem..

ja foi colocado

Editado por caotic
Link para o comentário
Compartilhar em outros sites

Na verdade onSetOpoonent acontence antes do player ir para o targerlist.

 

...

falto sim xD

 

bem..

ja foi colocado

 

Então ela só pode ser utilizada por monstros, afinal eles que possuem targetlist e friendlist, correto?

Editado por Garou
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...