Ir para conteúdo
Propaganda

Posts Recomendados

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

  • Administrador

Tópico Aprovado!
Somos gratos por sua contribuição, com certeza será útil para toda a comunidade! ❤️  REP+

  • Thanks 1
Link para o comentário
https://tibiadevs.com/forums/topic/226-tfs-15-playermoveitemitemuid-toposition-indexwhereever-false/#findComment-1005
Compartilhar em outros sites

  • Moderador
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

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

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

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

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...