CA

startEvent(cid, event, buffer)

Por caotic, 16 de mar. de 2014 em Linguagens de Programação

startevent
creatureevents
otserv
tibia
script
3
881
caoticC
16 de março de 2014 às 14:46

Eae galera xtibiana!

 

Creatureevents são eventos muitos ultilizados em otserv mais não existe uma forma de chamar um evento por ID em lua.

Então desenvolvi um codigo que chama um evento especifico.

 

Vá em luascript.cpp e procure:

#include "baseevents.h"

Coloque embaixo:

#include "creatureevent.h"

Procure:

extern Spells* g_spells;

Coloque embaixo:

extern CreatureEvents* g_creatureEvents;

Cotinuando em luascript.cpp e procure:

int32_t LuaScriptInterface::luaGetIpByName(lua_State* L)
{
//getIpByName(name)
std::string name = popString(L);


if(Player* player = g_game.getPlayerByName(name))
lua_pushnumber(L, player->getIP());
else
lua_pushnumber(L, IOLoginData::getInstance()->getLastIPByName(name));


return 1;
}

Coloque embaixo:

 

int32_t LuaScriptInterface::luaStartEvent(lua_State* L)
{
ScriptEnviroment* env = getEnv();
std::string buffer = popString(L);
int32_t event = popNumber(L);
if(Creature* creature = env->getCreatureByUID(popNumber(L))) {
lua_pushboolean(L, g_creatureEvents->startEvent(creature, event, buffer));                             
}
}

Continuando em luascript.cpp procure:

//loadmodlib(lib)
lua_register(m_luaState, "loadmodlib", LuaScriptInterface::luaL_loadmodlib);

Coloque embaixo:

//startEvent(cid, event, buffer)
lua_register(m_luaState, "startEvent", LuaScriptInterface::luaStartEvent);

Vá em luascript.h e procure:

static int32_t luaGetContainerSize(lua_State* L);

Procure embaixo:

static int32_t luaStartEvent(lua_State* L);

Vá em creatureevents.cpp e procure:

bool CreatureEvents::playerLogin(Player* player)
{
//fire global event if is registered
bool result = true;
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
{
if(it->second->getEventType() == CREATURE_EVENT_LOGIN &&
!it->second->executeLogin(player) && result)
result = false;
}


return result;
}

Coloque embaixo:

bool CreatureEvents::startEvent(Creature* creature, int32_t event, std::string buffer)
{
bool result = true;
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
{
if(it->second->getEventType() == CREATURE_EVENT_EVENT &&
!it->second->executeEvent(creature, event, buffer) && result)
result = false;
}


return result;
}

Procure:

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

Coloque embaixo:

else if(tmpStr == "event")
m_type = CREATURE_EVENT_EVENT;

Continuando em creatureevents.cpp procure:

case CREATURE_EVENT_PREPAREDEATH:
return "onPrepareDeath";

Coloque embaixo:

case CREATURE_EVENT_EVENT:
return "onEvent";

Procure:

case CREATURE_EVENT_PREPAREDEATH:
return "cid, deathList";

Coloque embaixo:

case CREATURE_EVENT_EVENT:
return "cid, event, buffer";

Procure:

uint32_t CreatureEvent::executeDirection(Creature* creature, Direction old, Direction current)
{
//onDirection(cid, old, current)
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 old = " << old << std::endl;
scriptstream << "local current = " << current << 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[30];
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, old);
lua_pushnumber(L, current);


bool result = m_interface->callFunction(3);
m_interface->releaseEnv();
return result;
}
}
else
{
std::cout << "[Error - CreatureEvent::executeDirection] Call stack overflow." << std::endl;
return 0;
}
}

Coloque embaixo:

uint32_t CreatureEvent::executeEvent(Creature* creature, int32_t event, std::string buffer)
{
//onOutfit(cid, old, current)
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 event = " << event << std::endl;
scriptstream << "local buffer = " << "'" << buffer << "'" << 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[30];
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, event);
            lua_pushstring(L, buffer.c_str());


bool result = m_interface->callFunction(3);
m_interface->releaseEnv();
return result;
}
}
else
{
std::cout << "[Error - CreatureEvent::executeOutfit] Call stack overflow." << std::endl;
return 0;
}
}

Em creatureeevents.h procure:

CREATURE_EVENT_PREPAREDEATH,

Coloque embaixo:

CREATURE_EVENT_EVENT

Procure:

bool playerLogout(Player* player, bool forceLogout);

Coloque embaixo:

bool startEvent(Creature* creature, int32_t event, std::string buffer);

Continuando em creatureevents.h procure:

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

E coloque embaixo:

uint32_t executeEvent(Creature* creature, int32_t event, std::string buffer);

Exemplo:

function onSay(cid, words, param, channel)
if startEvent(cid, 1, "\n") then
return true
end
return false
end
function onEvent(cid, event, buffer)
CREATURE_EVENT_PLAYERS_ON = 1


if event == CREATURE_EVENT_PLAYERS_ON then
local players = getPlayersOnline()
str = ""
for i=1, #players do
local sep = i >= #players and "" or buffer
str = str..getCreatureName(players[i])..sep
end
doShowTextDialog(cid, 1397, str)
return true
end




print("INVALID EVENT\nNumber "..event.."\nBuffer _"..buffer.."_')
return true
end

 

 

Editado Março 16 por caotic

xSONYxX
16 de março de 2014 às 15:41

Não entendi muito bem a funcionalidade disso e nem o script de exemplo, tem como me explicar melhor doido? xd

caoticC
16 de março de 2014 às 19:42

É simples ele chama o evento onEvent basicamente.

Ai você pode gerenciar pelo id do evento.