Lightwood 66 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! Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/ Compartilhar em outros sites Mais opções de compartilhamento...
Administrador TELASKO 2.945 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 Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1005 Compartilhar em outros sites Mais opções de compartilhamento...
Moderador Wang 1.344 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? Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1006 Compartilhar em outros sites Mais opções de compartilhamento...
Lightwood 66 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.. Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1007 Compartilhar em outros sites Mais opções de compartilhamento...
GM Vortex 284 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 Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1008 Compartilhar em outros sites Mais opções de compartilhamento...
Lightwood 66 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.. Link para o comentário https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1009 Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora