Ir para conteúdo
  • 0
Pepeco

Scripting Monster Friend

Pergunta

Pepeco    4
Pepeco

Base:  TFS 1.2, Versão: 8.6

Qual a sua pergunta? Queria fazer com que um monstro não ataque um certo tipo de pessoa (que seria uma vocação), mas ele sempre fica com o target na pessoa, mesmo eu fazendo varias tentativas, como addFriend, removeTarget e RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE

Eu pesquisei em vários lugares e achei esse tópico que trata exatamente meu problema. Link

Mas no caso dele funcionou, o meu não funcionou.

Monster

Spoiler

<?xml version="1.0" encoding="ISO-8859-1"?>
<monster name="Renegado" nameDescription="a renegado" race="blood" experience="1500" speed="800">
	<health now="15000" max="15000" />
	<look type="156" head="114" body="114" legs="114" feet="114" addons="3" corpse="3065" />
	<targetchange interval="1000" chance="25" />
	<flags>
		<flag summonable="0" />
		<flag attackable="1" />
		<flag hostile="1" />
		<flag illusionable="0" />
		<flag convinceable="0" />
		<flag pushable="0" />
		<flag canpushitems="1" />
		<flag canpushcreatures="1" />
		<flag targetdistance="1" />
		<flag staticattack="90" />
		<flag runonhealth="0" />
	</flags>
	<attacks>
		<attack name="melee" interval="1500" min="-5" max="-10" />
		<attack name="physical" interval="3000" chance="65" range="7" min="-5" max="-10">
			<attribute key="shootEffect" value="greenstar" />
		</attack>
	</attacks>
	<defenses armor="50" defense="20" />
	<loot>
	</loot>
</monster>

 

events/creatures.lua

Spoiler

function Creature:onTargetCombat(target)
	if self:isMonster() and (string.lower(self:getName()) == 'justiceiro' or 'renegado') then
		if string.lower(self:getName()) == string.lower(target:getVocation():getName()) then
			self:removeTarget(target)
			return RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE
		end
	end
	return true
end

 

 

Editado por Pepeco
Spoiler dentro de Spoiler

Compartilhar este post


Link para o post
Compartilhar em outros sites

2 respostass a esta questão

Recommended Posts

  • 1
GryLLo    19
GryLLo

Opa @Pepeco beleza?
Olha só, dei uma olhada por cima aqui pra ti e vou te dizer o que encontrei.

Se você quer que o Player seja completamente ignorado como se estivesse invisível, acredito que o jeito mais prático seja alterar os métodos C++ do seu OT, você também pode criar algumas funções auxiliares para serem chamadas em seus .LUA, mas aí é uma pouco mais avançado acredito.

Caso você não se importe dos monstros seguirem o Player, sem atacá-lo, como se fosse um PET dele, apenas essa linha já é suficiente:

return RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE

Caso eles estejam seguindo o player e atacando, verifique se está passando pelo seu if colocando um PRINT, como faço quando estou testando ou tentando novas personalizações em servidores, um exemplo do uso do print para seu código ficaria assim:

if target:isPlayer() and self:isMonster() then
  print("Um "..self:getName().." esta de olho em "..target:getName())
  return RETURNVALUE_YOUMAYNOTATTACKTHISPLAYER
end

Esse código está fazendo com que TODOS os monstros adicione e retire o target do player, escrevendo no console do servidor (tela preta) por exemplo: "Um Demon esta de olho em Pepeco".

Explicando melhor, o script é mais limitado para fazer coisas novas, tem algumas funções que são chamadas antes desse script .LUA por ter toda uma linha de segmento em C++ antes dos scripts começarem a ser chamados, e isso acaba fazendo com que o monstro aplique o target no player, em seguida chamando a função de follow, e só após isso (e talvez mais algumas outras funções) ele entra nessa função Creature:onTargetCombat, e acaba fazendo com que o monstro siga o personagem de qualquer forma, existe uma função dentro do monster.cpp chamada isOpponent, que verifica assim que alguma criatura entra na tela, se é inimiga ou não, caso queira fazer sua função acredito que comece verificando por ali e fazendo com que o isOpponent retorne FALSE se todos seus if's forem todos TRUE, como escrito no teu tópico.

Você poderia inventar algumas gambiarras, mas acredito que não fique muito legal.


Uns abraços,
GryLLo

Editado por GryLLo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
Pepeco    4
Pepeco

@GryLLo Foi exatamente o que fiz e ele passou por todos os if :/, mas vou tentar fazer isso que você falou sobre o isOpponent, esse foi um grande avanço, vlw u.u, se eu conseguir eu retorno resposta aqui no tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×