int NpcScriptInterface::luagetDistanceTo(lua_State* L) { //getDistanceTo(uid) ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (!npc) { reportErrorFunc(getErrorDesc(LUA_ERROR_THING_NOT_FOUND)); lua_pushnil(L); return 1; } uint32_t uid = getNumber<uint32_t>(L, -1); Thing* thing = env->getThingByUID(uid); if (!thing) { reportErrorFunc(getErrorDesc(LUA_ERROR_THING_NOT_FOUND)); lua_pushnil(L); return 1; } const Position& thingPos = thing->getPosition(); const Position& npcPos = npc->getPosition(); if (npcPos.z != thingPos.z) { lua_pushnumber(L, -1); } else { int32_t dist = std::max<int32_t>(Position::getDistanceX(npcPos, thingPos), Position::getDistanceY(npcPos, thingPos)); lua_pushnumber(L, dist); } return 1; }
int32_t NpcScriptInterface::luaGetNpcName(lua_State* L) { //getNpcName() ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (npc) { LuaScriptInterface::pushString(L, npc->getName()); } else { pushBoolean(L, false); } return 1; }
int32_t NpcScriptInterface::luaSetNpcFocus(lua_State* L) { //doNpcSetCreatureFocus(cid) uint32_t cid = popNumber(L); ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (npc) { npc->setCreatureFocus(g_game.getCreatureByID(cid)); } return 0; }
int32_t NpcScriptInterface::luaActionTurn(lua_State* L) { //selfTurn(direction) Direction dir = (Direction)popNumber(L); ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (npc) { npc->doTurn(dir); } return 0; }
int32_t NpcScriptInterface::luaSelfGetPos(lua_State* L) { //selfGetPosition() ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (npc) { Position pos = npc->getPosition(); pushPosition(L, pos); } else { lua_pushnil(L); } return 1; }
int32_t NpcScriptInterface::luaCloseShopWindow(lua_State* L) { //closeShopWindow(cid) ScriptEnvironment* env = getScriptEnv(); Player* player = g_game.getPlayerByID(popNumber(L)); if (!player) { reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 1; } Npc* npc = env->getNpc(); if (!npc) { reportErrorFunc(getErrorDesc(LUA_ERROR_CREATURE_NOT_FOUND)); pushBoolean(L, false); return 1; } int32_t buyCallback; int32_t sellCallback; Npc* merchant = player->getShopOwner(buyCallback, sellCallback); //Check if we actually have a shop window with this player. if (merchant == npc) { player->sendCloseShop(); if (buyCallback != -1) { luaL_unref(L, LUA_REGISTRYINDEX, buyCallback); } if (sellCallback != -1) { luaL_unref(L, LUA_REGISTRYINDEX, sellCallback); } player->setShopOwner(NULL, -1, -1); npc->removeShopPlayer(player); } pushBoolean(L, true); return 1; }
int32_t NpcScriptInterface::luaGetNpcPos(lua_State* L) { //getNpcPos() ScriptEnvironment* env = getScriptEnv(); Position pos(0, 0, 0); uint32_t stackpos = 0; Npc* npc = env->getNpc(); if (npc) { pos = npc->getPosition(); stackpos = npc->getParent()->__getIndexOfThing(npc); } pushPosition(L, pos, stackpos); return 1; }
int32_t NpcScriptInterface::luaGetNpcParameter(lua_State* L) { //getNpcParameter(paramKey) std::string paramKey = popString(L); ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (npc) { auto it = npc->m_parameters.find(paramKey); if (it != npc->m_parameters.end()) { LuaScriptInterface::pushString(L, it->second); } else { lua_pushnil(L); } } else { lua_pushnil(L); } return 1; }
int32_t NpcScriptInterface::luaActionFollow(lua_State* L) { //selfFollow(cid) uint32_t cid = popNumber(L); ScriptEnvironment* env = getScriptEnv(); Player* player = g_game.getPlayerByID(cid); if (cid != 0 && !player) { pushBoolean(L, false); return 1; } Npc* npc = env->getNpc(); if (!npc) { pushBoolean(L, false); return 1; } bool result = npc->setFollowCreature(player, true); pushBoolean(L, result); return 1; }
int32_t NpcScriptInterface::luaOpenShopWindow(lua_State* L) { //openShopWindow(cid, items, onBuy callback, onSell callback) int32_t buyCallback = -1; int32_t sellCallback = -1; std::list<ShopInfo> items; Player* player = NULL; ScriptEnvironment* env = getScriptEnv(); Npc* npc = env->getNpc(); if (lua_isfunction(L, -1) == 0) { lua_pop(L, 1); // skip it - use default value } else { sellCallback = popCallback(L); } if (lua_isfunction(L, -1) == 0) { lua_pop(L, 1); // skip it - use default value } else { buyCallback = popCallback(L); } if (lua_istable(L, -1) == 0) { reportError(__FUNCTION__, "item list is not a table."); pushBoolean(L, false); return 1; } lua_pushnil(L); while (lua_next(L, -2) != 0) { ShopInfo item; item.itemId = popField<uint32_t>(L, "id"); item.subType = popField<int32_t>(L, "subType"); if (item.subType == 0) { item.subType = popField<int32_t>(L, "subtype"); } item.buyPrice = popField<uint32_t>(L, "buy"); item.sellPrice = popField<uint32_t>(L, "sell"); item.realName = popFieldString(L, "name"); items.push_back(item); lua_pop(L, 1); } lua_pop(L, 1); player = g_game.getPlayerByID(popNumber(L)); if (!player) { reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 1; } //Close any eventual other shop window currently open. player->closeShopWindow(false); if (!npc) { reportErrorFunc(getErrorDesc(LUA_ERROR_CREATURE_NOT_FOUND)); pushBoolean(L, false); return 1; } npc->addShopPlayer(player); player->setShopOwner(npc, buyCallback, sellCallback); player->openShopWindow(npc, items); pushBoolean(L, true); return 1; }