Ir para conteúdo
  • Cadastre-se

(Resolvido)Kickar players nos Trainers


Ir para solução Resolvido por jefersonzc,

Posts Recomendados

TFS 1.3 - Mark Samman

 

Olá a todos,

Estou com esse problema e não consigo resolver: Quando o player dá exit nos trainers ele não leva kick

Já fiz várias pesquisas aqui e em outros fóruns, mas nenhuma das possibilidades apresentadas me serviu.

 

Tentei esse script:

Mas não funcionou porque aparentemente o meu TFS não possui a função getCreatureNoMove(cid).

 

Tentei também através do config.lua, mas ele não tem nenhuma dessas funções:

  • idleWarningTime
  • idleKickTime
  • stopAttackingAtExit

Tentei adicioná-las mas elas não funcionam.

 

Bom, tenho algumas ideias para resolver o problema, mas não sei por onde começar.

1- A melhor opção seria se eu de fato conseguisse fazer o char parar de atacar quando desse exit. Mas já que não consigo configurar isso pelo confi.lua, como poderia fazer?

2- Posso criar uma rotina que checa se o player está "dançando", mas como verifico se ele mudou de direção? Existe alguma função que verifica o movimento do char no mesmo sqm?

3-  Aceito ideias que não sejam complexas demais (rsrs).

Editado por jefersonzc (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

Bom, resolvi desenvolver eu mesmo uma solução, me baseando nos scripts que encontrei pelo caminho :) Segue abaixo.

 

1. Em data/creaturescripts/scripts/login.lua, acrescente:

player:registerEvent("Idle")

2. Em data/creaturescripts/creaturescripts.xml, acrescente:

<event type="think" name="Idle" script="idle.lua"/>

3. Na pasta data/creaturescripts/scripts, crie o arquivo idle.lua, com o seguinte código:

local room = {
	x1 = 1542,
	x2 = 1608,
	y1 = 1528,
	y2 = 1556,
	z1 = 8,
	z2 = 8
}

function onThink(player, interval)
	local target = player:getTarget()
	
	if (player:getIp() > 0) then
		return true
	else
		local pos = player:getPosition()
		if ((pos.x >= room.x1 and pos.x <= room.x2) and (pos.y >= room.y1 and pos.y <= room.y2) and (pos.z >= room.z1 and pos.z <= room.z2)) then
			doRemoveCreature(player)
		end
	end
	return true
end

 

Depois é só configurar o script com as coordenadas da sua room (onde ficam os trainers). Pronto, qualquer player que der quit ali dentro, esteja ele atacando os trainers ou não, vai levar kick alguns segundos depois.

 

Podem fechar como resolvido ;) 

Link para o post
Compartilhar em outros sites

você poderia resolver também da seguinte forma, se você não atacar o mob ele desloga, então é só parar o ataque ao da exit.

troca sua função onTargetCombat

function Creature:onTargetCombat(target)
    if not self then
        return true
    end
    if(self:getPlayer() and self:getPlayer():getIp() == 0) then
        self:setTarget(nil)
    end

Eu estava com o mesmo problema e um dançarino brabo me ajudou! @Lyu

Link para o post
Compartilhar em outros sites
10 horas atrás, Yinz disse:

você poderia resolver também da seguinte forma, se você não atacar o mob ele desloga, então é só parar o ataque ao da exit.

troca sua função onTargetCombat


function Creature:onTargetCombat(target)
    if not self then
        return true
    end
    if(self:getPlayer() and self:getPlayer():getIp() == 0) then
        self:setTarget(nil)
    end

Eu estava com o mesmo problema e um dançarino brabo me ajudou! @Lyu

 

Opa, bom saber dessa segunda saída. Poderá ser útil ainda. Obrigado. 

Link para o post
Compartilhar em outros sites
  • 1 year later...
Em 30/12/2018 em 12:39, Yinz disse:

você poderia resolver também da seguinte forma, se você não atacar o mob ele desloga, então é só parar o ataque ao da exit.

troca sua função onTargetCombat


function Creature:onTargetCombat(target)
    if not self then
        return true
    end
    if(self:getPlayer() and self:getPlayer():getIp() == 0) then
        self:setTarget(nil)
    end

Eu estava com o mesmo problema e um dançarino brabo me ajudou! @Lyu

 

 

Poderia me mandar uma pra tfs 1.3?

A minha está na data/lib/core/combat

está correta?

Ela está assim:

 

function Combat:getPositions(creature, variant)
    local positions = {}
    function onTargetTile(creature, position)
        positions[#positions + 1] = position
    end

    self:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile")
    self:execute(creature, variant)
    return positions
end

function Combat:getTargets(creature, variant)
    local targets = {}
    function onTargetCreature(creature, target)
        targets[#targets + 1] = target
    end

    self:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
    self:execute(creature, variant)
    return targets
end
 

Link para o post
Compartilhar em outros sites
  • 5 months later...
Em 30/12/2018 em 11:10, jefersonzc disse:

Bom, resolvi desenvolver eu mesmo uma solução, me baseando nos scripts que encontrei pelo caminho :) Segue abaixo.

 

1. Em data/creaturescripts/scripts/login.lua, acrescente:



player:registerEvent("Idle")

2. Em data/creaturescripts/creaturescripts.xml, acrescente:



<event type="think" name="Idle" script="idle.lua"/>

3. Na pasta data/creaturescripts/scripts, crie o arquivo idle.lua, com o seguinte código:



local room = {
	x1 = 1542,
	x2 = 1608,
	y1 = 1528,
	y2 = 1556,
	z1 = 8,
	z2 = 8
}

function onThink(player, interval)
	local target = player:getTarget()
	
	if (player:getIp() > 0) then
		return true
	else
		local pos = player:getPosition()
		if ((pos.x >= room.x1 and pos.x <= room.x2) and (pos.y >= room.y1 and pos.y <= room.y2) and (pos.z >= room.z1 and pos.z <= room.z2)) then
			doRemoveCreature(player)
		end
	end
	return true
end

 

Depois é só configurar o script com as coordenadas da sua room (onde ficam os trainers). Pronto, qualquer player que der quit ali dentro, esteja ele atacando os trainers ou não, vai levar kick alguns segundos depois.

 

Podem fechar como resolvido ;) 

Vc nao explicou direito como coloca os ids dos tiles?  (onde ficam os trainers). ?? onde coloca?

Poxa vida estou com esse problemas a meses e o pessoal aqui do Tibiaking nao ta nem ai pra essa pergunta parece que todos se esconde !!!!

Como resolver esse problemaaa????


Esssa duvida ainda nao foi resolvida como muitas desse TK de merda!

 

Editado por Heitorzera13 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
18 horas atrás, Heitorzera13 disse:

Vc nao explicou direito como coloca os ids dos tiles?  (onde ficam os trainers). ?? onde coloca?

Poxa vida estou com esse problemas a meses e o pessoal aqui do Tibiaking nao ta nem ai pra essa pergunta parece que todos se esconde !!!!

Como resolver esse problemaaa????


Esssa duvida ainda nao foi resolvida como muitas desse TK de merda!

 

 

Opa! Então meu amigo, vc não precisa configurar ID de tile nenhum. Essa função é executada em tempo real, o que ela faz é ficar checando o player para ver se o IP de conexão dele é igual a 0. Se o IP for 0, significa que o player deu quit ou que a internet dele caiu, daí o script analisa a posição do player dentro do mapa e se essa posição estiver dentro da sala de treinamento significa que é preciso expulsar o player do jogo, forçando o logout. Agora, se ele estiver em qualquer outro canto do mapa, então ele não será expulso.

 

As coordenadas da sala de treinamento são definidas aqui, e vc precisa alterá-las de acordo com a sala de treinamento do seu servidor.

 

local room = {
	x1 = 1542,
	x2 = 1608,
	y1 = 1528,
	y2 = 1556,
	z1 = 8,
	z2 = 8
}

 

Link para o post
Compartilhar em outros sites

Queria saber como são definidas essas cordenadas?
 

local room = {
	x1 = 1542,
	x2 = 1608,
	y1 = 1528,
	y2 = 1556,
	z1 = 8,
	z2 = 8
}
Editado por Heitorzera13 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
33 minutos atrás, Heitorzera13 disse:

Como são definidas essas cordenadas?
 




local room = {
	x1 = 1542,
	x2 = 1608,
	y1 = 1528,
	y2 = 1556,
	z1 = 8,
	z2 = 8
}

 

Essas coordenadas são a posição onde começa e termina a sua sala. O ideal é que vc abra o seu Map Editor e imagine um retângulo grande o suficiente para envolver toda a sua área de treino (já que nem sempre elas são retangulares, como no meu caso). O X1 e o Y1 são as coordenadas do canto superior esquerdo desse retângulo, e o X2 e o Y2 são as coordenadas do canto inferior direito.

 

Screenshot_2.thumb.png.7e2266144a096169f6b4968b8019359d.png

 

Já o Z1 e o Z2 são referentes aos andares. Como a minha sala só tem um andar, que fica no floor 8, eu coloco o valor 8 nos dois. Mas vamos supor que a minha área de treino fosse um prédio composto pelo térreo, dois andares pra cima e um no subsolo, nesse caso eu usaria Z1 = 6 e Z2 = 9.

 

Espero que tenha ficado mais claro agora ;)

 

Adendo: Se você quiser configurar mais de um "local de quick", que se encontram em lugares distantes um do outro no mapa, terá que configurar uma segunda room (ex.: local room2) e acrescentar um segundo IF relacionado a essa outra sala.

elsif ((pos.x >= room2.x1 and pos.x <= room2.x2) and (pos.y >= room2.y1 and pos.y <= room2.y2) and (pos.z >= room2.z1 and pos.z <= room2.z2)) then
			doRemoveCreature(player)
Editado por jefersonzc (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

RESOLVIDO , excelente explicação muito obrigado pela paciencia ^^
 

Obrigadoooooooooooo amigo ?

ganhou meu respeito. Rep++++

4 horas atrás, jefersonzc disse:

 

Essas coordenadas são a posição onde começa e termina a sua sala. O ideal é que vc abra o seu Map Editor e imagine um retângulo grande o suficiente para envolver toda a sua área de treino (já que nem sempre elas são retangulares, como no meu caso). O X1 e o Y1 são as coordenadas do canto superior esquerdo desse retângulo, e o X2 e o Y2 são as coordenadas do canto inferior direito.

 

Screenshot_2.thumb.png.7e2266144a096169f6b4968b8019359d.png

 

Já o Z1 e o Z2 são referentes aos andares. Como a minha sala só tem um andar, que fica no floor 8, eu coloco o valor 8 nos dois. Mas vamos supor que a minha área de treino fosse um prédio composto pelo térreo, dois andares pra cima e um no subsolo, nesse caso eu usaria Z1 = 6 e Z2 = 9.

 

Espero que tenha ficado mais claro agora ;)

 

Adendo: Se você quiser configurar mais de um "local de quick", que se encontram em lugares distantes um do outro no mapa, terá que configurar uma segunda room (ex.: local room2) e acrescentar um segundo IF relacionado a essa outra sala.



elsif ((pos.x >= room2.x1 and pos.x <= room2.x2) and (pos.y >= room2.y1 and pos.y <= room2.y2) and (pos.z >= room2.z1 and pos.z <= room2.z2)) then
			doRemoveCreature(player)

 

 

 

Editado por Heitorzera13 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

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

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo