Lightwood 65 Postado 17 de Novembro 2023 Compartilhar Postado 17 de Novembro 2023 Fala galera, depois de apanhar muito tentando fazer a item:moveTo() funcionar e não conseguir o resultado que eu queria, resolvi adaptar a doMovePlayerItem(cid, itemuid, toPosition[, indexWhereever = false])) presente na 0.3.6, para o TFS 1.5: - Primeiro em luascript.h: static int luaPlayerMoveItem(lua_State* L); Depois em luascript.cpp: registerMethod("Player", "moveItem", LuaScriptInterface::luaPlayerMoveItem); - int LuaScriptInterface::luaPlayerMoveItem(lua_State* L) { // player:moveItem(itemuid, toPosition[, indexWhereever = false]) bool indexWherever = false; if (lua_gettop(L) > 3) indexWherever = lua_toboolean(L, 4); const Position& toPosition = getPosition(L, 3); Item* item = getScriptEnv()->getItemByUID(getNumber<uint32_t>(L, 2)); if (!item) { pushBoolean(L, false); return 1; } Player* player = getUserdata<Player>(L, 1); if (!player) { reportErrorFunc(L, getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 1; } if (indexWherever) { g_game.internalMoveItem(item->getParent(), player, INDEX_WHEREEVER, item, item->getItemCount(), NULL, FLAG_NOLIMIT); } else { uint8_t toIndex = 0; if (toPosition.y & 0x40) toIndex = static_cast<uint8_t>(toPosition.z); else toIndex = static_cast<uint8_t>(toPosition.y); g_game.internalMoveItem(item->getParent(), player, toIndex, item, item->getItemCount(), NULL, FLAG_NOLIMIT); } lua_pushboolean(L, true); return 1; } - Método de uso: player:moveItem(item.uid, {y = CONST_SLOT_FEET, z = 0}) Deste jeito ira forçar o item a ser movido para o slot feet! Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
Administrador TELASKO 2.926 Postado 17 de Novembro 2023 Administrador Compartilhar Postado 17 de Novembro 2023 Tópico Aprovado! Somos gratos por sua contribuição, com certeza será útil para toda a comunidade! ❤️ REP+ 1 Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
Moderador Wang 1.338 Postado 17 de Novembro 2023 Moderador Compartilhar Postado 17 de Novembro 2023 2 horas atrás, Lightwood disse: Fala galera, depois de apanhar muito tentando fazer a item:moveTo() funcionar e não conseguir o resultado que eu queria, resolvi adaptar a doMovePlayerItem(cid, itemuid, toPosition[, indexWhereever = false])) presente na 0.3.6, para o TFS 1.5: - Primeiro em luascript.h: static int luaPlayerMoveItem(lua_State* L); Depois em luascript.cpp: registerMethod("Player", "moveItem", LuaScriptInterface::luaPlayerMoveItem); - int LuaScriptInterface::luaPlayerMoveItem(lua_State* L) { // player:moveItem(itemuid, toPosition[, indexWhereever = false]) bool indexWherever = false; if (lua_gettop(L) > 3) indexWherever = lua_toboolean(L, 4); const Position& toPosition = getPosition(L, 3); Item* item = getScriptEnv()->getItemByUID(getNumber<uint32_t>(L, 2)); if (!item) { pushBoolean(L, false); return 1; } Player* player = getUserdata<Player>(L, 1); if (!player) { reportErrorFunc(L, getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 1; } if (indexWherever) { g_game.internalMoveItem(item->getParent(), player, INDEX_WHEREEVER, item, item->getItemCount(), NULL, FLAG_NOLIMIT); } else { uint8_t toIndex = 0; if (toPosition.y & 0x40) toIndex = static_cast<uint8_t>(toPosition.z); else toIndex = static_cast<uint8_t>(toPosition.y); g_game.internalMoveItem(item->getParent(), player, toIndex, item, item->getItemCount(), NULL, FLAG_NOLIMIT); } lua_pushboolean(L, true); return 1; } - Método de uso: player:moveItem(item.uid, {y = CONST_SLOT_FEET, z = 0}) Deste jeito ira forçar o item a ser movido para o slot feet! o que esse code faz ? pra que serve exatamente? Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
Lightwood 65 Postado 17 de Novembro 2023 Autor Compartilhar Postado 17 de Novembro 2023 5 minutos atrás, Wang disse: o que esse code faz ? pra que serve exatamente? Exemplo, tu pode fazer uma pokebar com o mesmo: Na hora que tu da use na pokeball, tu pode forçar ela a mover para o slot da pokeball. Tem muita coisa que tu pode fazer com isso.. Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
GM Vortex 282 Postado 17 de Novembro 2023 Compartilhar Postado 17 de Novembro 2023 No entanto, no TFS 1.4 e 1.5, já existem as funções 'onMoveItem' e 'onItemMoved'. Qual é a diferença entre 'onMoveItem', 'onItemMoved' e 'seu'? function onMoveItem(player, item, fromPosition, toPosition, fromItem, toItem, fromSlot, toSlot) if toItem.uid == CONST_SLOT_FEET and toSlot == 0 then print("Item movido para o slot de feet na posição 0") end return true end Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
Lightwood 65 Postado 17 de Novembro 2023 Autor Compartilhar Postado 17 de Novembro 2023 1 hora atrás, GM Vortex disse: No entanto, no TFS 1.4 e 1.5, já existem as funções 'onMoveItem' e 'onItemMoved'. Qual é a diferença entre 'onMoveItem', 'onItemMoved' e 'seu'? function onMoveItem(player, item, fromPosition, toPosition, fromItem, toItem, fromSlot, toSlot) if toItem.uid == CONST_SLOT_FEET and toSlot == 0 then print("Item movido para o slot de feet na posição 0") end return true end A diferença é que por exemplo esta que postei tu pode utilizar em action, talkaction, creatureevent, etc.. Um exemplo bem tosco de uma talkaction: function onSay(player, words, param) for _, ball in pairs(player:getPokeballs()) do if (ball:getPokeballInfo().name == "Pikachu") then item = ball end end if item then player:moveItem(item.uid, {y = CONST_SLOT_FEET, z = 0}) else player:sendCancelMessage("Sorry, not possible move this item") end return false end E ela não é para bloquear ou fazer algo para depois que mover o item ou tentar mover o mesmo, ela serve para MOVER o item para o SLOT ou BAG, etc.. Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
Participe da Conversa
Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.