Não entendi muito bem a funcionalidade disso e nem o script de exemplo, tem como me explicar melhor doido? xd
- Fórum
- OTServ
- Recursos
- Linguagens de Programação
- startEvent(cid, event, buffer)
CA
startEvent(cid, event, buffer)
Por caotic, 16 de mar. de 2014 em Linguagens de Programação
startevent
creatureevents
otserv
tibia
script
3
881
info
Grupo: Visconde
Registrado: 26/12/07
Posts: 272
Reputação: +31
Char no Tibia: [ADM]Sony

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


info
Grupo: Infante
Registrado: 04/03/11
Posts: 1.6k
Reputação: +393
Char no Tibia: No Have
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:
Coloque embaixo:
Procure:
Coloque embaixo:
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:
Coloque embaixo:
Vá em luascript.h e procure:
Procure embaixo:
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:
Coloque embaixo:
Continuando em creatureevents.cpp procure:
Coloque embaixo:
Procure:
Coloque embaixo:
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:
Coloque embaixo:
Procure:
Coloque embaixo:
Continuando em creatureevents.h procure:
E coloque embaixo:
Exemplo:
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 endEditado Março 16 por caotic