Ir para conteúdo
Propaganda

[TFS 1.5] player:moveItem(itemuid, toPosition[, indexWhereever = false])


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
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
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
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
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
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
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

×
  • Criar Novo...