SHOW:
|
|
- or go back to the newest paste.
| 1 | 211,6 → 211,8 | |
| 2 | _type = CREATURE_EVENT_DEATH; | |
| 3 | else if(type == "preparedeath") | |
| 4 | _type = CREATURE_EVENT_PREPAREDEATH; | |
| 5 | + else if(type == "extendedopcode") | |
| 6 | + _type = CREATURE_EVENT_EXTENDED_OPCODE; | |
| 7 | ||
| 8 | return _type; | |
| 9 | } | |
| 10 | 330,6 → 332,8 | |
| 11 | return "onDeath"; | |
| 12 | case CREATURE_EVENT_PREPAREDEATH: | |
| 13 | return "onPrepareDeath"; | |
| 14 | + case CREATURE_EVENT_EXTENDED_OPCODE: | |
| 15 | + return "onExtendedOpcode"; | |
| 16 | case CREATURE_EVENT_NONE: | |
| 17 | default: | |
| 18 | break; | |
| 19 | 401,6 → 405,8 | |
| 20 | return "cid, corpse, deathList"; | |
| 21 | case CREATURE_EVENT_PREPAREDEATH: | |
| 22 | return "cid, deathList"; | |
| 23 | + case CREATURE_EVENT_EXTENDED_OPCODE: | |
| 24 | + return "cid, opcode, buffer"; | |
| 25 | case CREATURE_EVENT_NONE: | |
| 26 | default: | |
| 27 | break; | |
| 28 | 2145,3 → 2145,57 | |
| 29 | return 0; | |
| 30 | } | |
| 31 | } | |
| 32 | + | |
| 33 | +uint32_t CreatureEvent::executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer) | |
| 34 | +{
| |
| 35 | + //onExtendedOpcode(cid, opcode, buffer) | |
| 36 | + if(m_interface->reserveEnv()) | |
| 37 | + {
| |
| 38 | + ScriptEnviroment* env = m_interface->getEnv(); | |
| 39 | + if(m_scripted == EVENT_SCRIPT_BUFFER) | |
| 40 | + {
| |
| 41 | + env->setRealPos(creature->getPosition()); | |
| 42 | + std::stringstream scriptstream; | |
| 43 | + scriptstream << "local cid = " << env->addThing(creature) << std::endl; | |
| 44 | + scriptstream << "local opcode = " << (int)opcode << std::endl; | |
| 45 | + scriptstream << "local buffer = " << buffer.c_str() << std::endl; | |
| 46 | + | |
| 47 | + scriptstream << m_scriptData; | |
| 48 | + bool result = true; | |
| 49 | + if(m_interface->loadBuffer(scriptstream.str())) | |
| 50 | + {
| |
| 51 | + lua_State* L = m_interface->getState(); | |
| 52 | + result = m_interface->getGlobalBool(L, "_result", true); | |
| 53 | + } | |
| 54 | + | |
| 55 | + m_interface->releaseEnv(); | |
| 56 | + return result; | |
| 57 | + } | |
| 58 | + else | |
| 59 | + {
| |
| 60 | + #ifdef __DEBUG_LUASCRIPTS__ | |
| 61 | + char desc[35]; | |
| 62 | + sprintf(desc, "%s", player->getName().c_str()); | |
| 63 | + env->setEvent(desc); | |
| 64 | + #endif | |
| 65 | + | |
| 66 | + env->setScriptId(m_scriptId, m_interface); | |
| 67 | + env->setRealPos(creature->getPosition()); | |
| 68 | + | |
| 69 | + lua_State* L = m_interface->getState(); | |
| 70 | + m_interface->pushFunction(m_scriptId); | |
| 71 | + lua_pushnumber(L, env->addThing(creature)); | |
| 72 | + lua_pushnumber(L, opcode); | |
| 73 | + lua_pushlstring(L, buffer.c_str(), buffer.length()); | |
| 74 | + | |
| 75 | + bool result = m_interface->callFunction(3); | |
| 76 | + m_interface->releaseEnv(); | |
| 77 | + return result; | |
| 78 | + } | |
| 79 | + } | |
| 80 | + else | |
| 81 | + {
| |
| 82 | + std::cout << "[Error - CreatureEvent::executeRemoved] Call stack overflow." << std::endl; | |
| 83 | + return 0; | |
| 84 | + } | |
| 85 | +} |