NO

[Resolvido] Mover Pokemon tfs 1.3

Por nociam, 27 de mai. de 2018 em Resolvidos

8
2.8k
nociamN
27 de maio de 2018 às 16:06

Boa tarde.

 

Pensei em fazer um ordem para pokemon mas estou com um bug alguém tem ideia de como resolver.

 

Problema: quanto do ordem em 1 sqm ele vai certinho mas quanto e mais longe ele se teleporta.

 

0b587004b6fcaccfb2a683bebce78f9b.gif

 

Código c++:

 

int LuaScriptInterface::luaGamePlayerMovePokemon(lua_State* L)
{
	// Game.playerMovePokemon(pokemon, toPosition)
	Creature* pokemon = getCreature(L, 1);
	if (pokemon->getMonster()) {
		const Position& position = getPosition(L, 2);

		Tile* toTile = g_game.map.getTile(position);
		g_game.internalMoveCreature(*pokemon, *toTile, FLAG_NOLIMIT);
	}

	return 1;
}

código lua:

 

function onUse(player, item, fromPosition, target, toPosition, isHotkey)

	local poke = player:getSummons()[1] 
	Game.playerMovePokemon(poke, toPosition)
	
	return true
end

 

Editado Maio 27 por nociam

PoRaIP
27 de maio de 2018 às 16:49

Alguma configuração do config.lua ou na source para teleportar summons para perto quando tiver longe em X sqms.

nociamN
27 de maio de 2018 às 17:36

Se observar nao e esse o caso, ao dar ordem em 1 sql ele vai, quanto e pra mais longe ele vai mais nao vai caminhando ele se teleporta ate o local o certo e ir andando ate o local.

Editado Maio 27 por nociam

PoRaIP
27 de maio de 2018 às 18:13
Melhor resposta

Ah sim, nem tinha analisado o código, só o gif, rs. Pensei que você tava arrastando ele pra testar, awoejawei.

Enfim, a função internalMoveCreature é usada para mover criaturas (quase igual a função internalTeleport) sem usar o algoritmo de Path Finding.
Em C++:

int LuaScriptInterface::luaGamePlayerMovePokemon(lua_State* L)
{
	// Game.playerMovePokemon(pokemon, toPosition)
	Creature* pokemon = getCreature(L, 1);
        const Position& position = getPosition(L, 2);

	if (pokemon->getMonster()) {
                std::forward_list<Direction> dirList;
                if(pokemon->getPathTo(position, dirList, 0, 0, true, true))
                      pokemon->startAutoWalk(dirList);
	}

	return 1;
}        

 

Lua: (Esse código ta mais elaborado do que o C++)

local pokemonsMoveTo = {}

function Player:movePokemonByList(pokemon, dirList, index)
	if self and pokemon and #dirList >= index then
		local speed = pokemon:getSpeed() * 3
		pokemon:move(dirList[index], 16)
		index = index + 1

		pokemonsMoveTo[self:getId()] = addEvent(function()
			self:movePokemonByList(pokemon, dirList, index)
		end, speed)
	end
end

function Player:movePokemon(pos)
	local pokemon = self:getSummons()
	if #pokemon == 0 then
		return false
	end

	if pokemonsMoveTo[self:getId()] then
		stopEvent(pokemonsMoveTo[self:getId()])
		pokemonsMoveTo[self:getId()] = nil
	end

	local dirList = pokemon[1]:getPathTo(pos, 0, 0, true, true)
	self:movePokemonByList(pokemon[1], dirList, 1)
	return true
end

 

Editado Maio 27 por PoRaI

nociamN
27 de maio de 2018 às 18:28

Estranho nesse modo ele so vai pra baixo.

código c++

5169930ba65173a655ca3345cbe04cbf.gif

 

 

código lua

a79a6f7521d9f357390f3e7ef07613c2.gif

Editado Maio 27 por nociam

PoRaIP
27 de maio de 2018 às 18:53

atualizei ambos os scripts, testa aí e me fala.

nociamN
27 de maio de 2018 às 20:04

100% obrigado os 2 modos no lua foi so ajustar o tempo.

FrenviusF
27 de maio de 2018 às 21:50
A questão neste tópico de suporte foi respondida e/ou o autor do tópico resolveu o problema. Este tópico está fechado e foi movido para Suporte - Resolvidos. Se você tiver outras dúvidas, crie um novo tópico.