Ir para conteúdo

Monstros duelando entre si


Skulls

Posts Recomendados

Boa noite galera

 

Como levantei no tópico: http://www.xtibia.com/forum/topic/238784-monstros-se-matando/monstros selvagens são todos tratados como amigos e, portanto, não é possível setar target neles com funções de target normal. Além disso, o callBack onTarget() não funciona para monstros.

 

Desde então estou em busca de uma forma de fazer monstros lutarem entre si sem mexer na source e, com algumas sugestões do Lobo @Night Wolf eu consegui chegar a algo bem satisfatório para o que eu precisava. Portanto, compartilho com você a base do sistema (fiz outras coisas para o meu objetivo que acho bobeira postar aqui, mas a base do sistema de luta está aqui).

 

Então vamos lá.

Primeiramente, esse sistema é baseado em dois eventos: onThink (que repete de x em x segundos) e onAttack(para evitar que o monstro ataque players quando estiver atacando monstros.

 

Vá em creaturescripts e crie as seguintes tags em creaturescripts.xml:

<event type="think" name="monsters" event="script" value="monsters.lua"/>
<event type="attack" name="monstersatt" event="script" value="monsters.lua"/>

Feito isso, vá na pasta lib (data/lib) e crie um arquivo chamado monsterslib.lua. La dentro coloque:

 

  Mostrar conteúdo oculto

 

 

Feito isso, agora crie um arquivo chamado monsters.lua dentro de creaturescripts/scripts, e cole isso dentro

 

  Mostrar conteúdo oculto

 

 

Pronto é isso, você tem um pequeno framework configurável para fazer seus monstros se matarem.

Para implementar o script no monstro basta ir no arquivo .xml dos monstros que deseja incluir esse sistema e colocar, logo após as defense, a tag:

  <script>
      <event name="minionatt"/>
      <event name="minion"/>
  </script>

Abaixo um exemplo de utilização do framework, simulando uma luta de "raças" entre dwarfs e orcs de diferentes tipos:

 

  Mostrar conteúdo oculto

 

 

O código está bem auto explicativo. Qualquer dúvida me avisem.

Espero que gostem.

 

Abraços,

Editado por Skulls
Link para o comentário
Compartilhar em outros sites

O sistema parece estar bom, porem o jeito que você escreve seus códigos é ruim. uma dica, quando for criar um código ao invés de fazer:



> if (true) then
>> if (true) then
>>> if (true) then
>>>> if (true) then
>>>>> Código
>>>> end
>>> end
>> end
> end

Crie seus código assim:



> if (false) then
> return
> end

> if (false) then
> return
> end

> if (false) then
> return
> end

> if (false) then
> return
> end

> Código


Assim facilita muito a leitura, e intendimento e manutenção do código.


Link para o comentário
Compartilhar em outros sites

  Em 19/01/2016 em 05:05, BananaFight disse:

 

O sistema parece estar bom, porem o jeito que você escreve seus códigos é ruim. uma dica, quando for criar um código ao invés de fazer:

> if (true) then
>>  if (true) then
>>>  if (true) then
>>>>  if (true) then 
>>>>>  Código
>>>> end
>>> end
>> end
> end

Crie seus código assim:

> if (false) then
> return
> end

> if (false) then
> return
> end

> if (false) then
> return
> end

> if (false) then
> return
> end

>  Código

Assim facilita muito a leitura, e intendimento e manutenção do código.

 

Bom, eu entendo o seu posicionamento. Mas ai eu acho que é mais uma questão de gosto. Eu gosto de ler os códigos linearmente, por isso escrevo da forma que escrevo, do meu ponto de vista fica mais fácil pra mim verificar tudo que é feito escrevendo em cascata.

 

Mas, vou aceitar a sugestão pois, em termos didáticos, é mais fácil ensinar/mostrar um código para alguém com a sua forma de escrita.

 

Valeu.

 

@@Marco Oliveira

Obrigado cara!

 

Abraços,

editei o que achei pertinente com relação a sugestão do banana.

 

Editado por Skulls
Link para o comentário
Compartilhar em outros sites

ficou realmente bom, acredito que o onThink se tornaria pesado pra esse caso mas não tiro o mérito da forma que vc utilizou. A função verify é facilmente editável e isso é um ponto ultra positivo pois permite fácil implementação com tabelas pra setar raças atacáveis e evitar minions atacando bosses (nome diferente)

Só fica aqui uma questão pessoal: pq não permitir que a setTarget varie de monstro pra monstro? Orcs odeiam trolls mas eles odeiam muito mais os humanos, por exemplo.

Link para o comentário
Compartilhar em outros sites

  Em 19/01/2016 em 18:59, Night Wolf disse:

ficou realmente bom, acredito que o onThink se tornaria pesado pra esse caso mas não tiro o mérito da forma que vc utilizou. A função verify é facilmente editável e isso é um ponto ultra positivo pois permite fácil implementação com tabelas pra setar raças atacáveis e evitar minions atacando bosses (nome diferente)

 

Só fica aqui uma questão pessoal: pq não permitir que a setTarget varie de monstro pra monstro? Orcs odeiam trolls mas eles odeiam muito mais os humanos, por exemplo.

Set target varie de que forma de monstro para monstro?

De qualquer forma minha settarget ficou meio durona mesmo, mas é pq pro que eu preciso só é necessário que ele dê preferencia a criaturas do que a players.

 

Obrigado pelo comentário. Você acha que ficaria pesado? Eu tava achando, mas agora to na duvida. Eu fiz um test clean (com server vazio) com pra la de mil monstros e rodou liso em um pc normal, não dedicado e não servidor.

Editado por Skulls
Link para o comentário
Compartilhar em outros sites

É algo de complexidade n^2 no pior caso, n no melhor caso e nlogn de caso médio, considerando que tem varias coisas rodando em paralelo não é o ideal rs.

Link para o comentário
Compartilhar em outros sites

  • 1 year later...

@Skulls

ola, tentei usar esse código mas na hora de rodar esta dando este erro:

 o que pode ser?

Distro: TFS 0.4

 

Screenshot_1.png

 

e mesmo se eu ignoro esses erros e tento criar o monstro que eu coloquei as tags de evento me aparece o erro abaixo:

 

Screenshot_2.png

 

Screenshot_1.png.708923430a5bf6bb950bc456e4332325.png

Screenshot_2.png.d8cca5318b7bb029fdc379441b5aa2dd.png

Editado por fefuxd
Link para o comentário
Compartilhar em outros sites

  • 3 months later...
  • 7 months later...
×
×
  • Criar Novo...