Jump to content
vert

Autopilot Engine

Recommended Posts

PT-Br

Hey jovens!

Estou tendo Java na faculdade e como eu sou apaixonado por L2, estou desenvolvendo uma engine inspirado pelo projeto do @Elfocrash L2JRoboto e por uns videos que ele disponibilizou na descrição do repositório; o projeto em si vai um pouco mais além de apenas um fake players, a ideia é trabalhar com funções pequenas e o mais genérico possível para poder usa-las nos personagens e eles farmarem sozinhos (tipo um bot, mas "legalizado" pelo servidor, por assim dizer...);

 

Vale mencionar que esse trabalho também valerá nota em 2 disciplinas que tenho na faculdade esse semestre hahaha;

 

A Autopilot Engine é para HighFive; comecei a desenvolver ela estudando o código do @Elfocrash.

Atualmente estou terminando a classe Sagittarius e logo logo começo as outras, eu sou bem rigoroso em questão de perfeccionismo e os fake players precisam fazer as escolhas de target, skills e movimentações o mais parecido possível com players;

 

Google Translator:

Hey guys!

I'm having Java in college and as I'm in love with L2, I'm developing an engine inspired by the project @Elfocrash L2JRoboto and some videos that he made available in the description of the repository; the project itself goes a little further than just a fake players, the idea is to work with small functions and as generic as possible to be able to use them in the characters and they do it alone (like a bot but "legalized" by the server, so to speak ...);


It is worth mentioning that this work will also count in 2 subjects that I have in college this semester hahaha;

The Autopilot Engine is for HighFive; I started to develop it by studying the @Elfocrash code.

I am currently finishing the Sagittarius class and soon I start the others, I am very strict about perfectionism and players need to make the target, skills and movements choices as close as possible to players;

Below is a ScreenShot of the test and things noted to be made sequentially.

 

 

 

https://youtu.be/UEoT2T9Z5pI

 

 

spacer.png

 

 

spacer.png

 

Edited by vert
  • Like 5
  • I love it 4

Share this post


Link to post
Share on other sites

Interessante, algo que mais ou menos nos cliente atuais, com aqueles macros...
Mas teve um jogo que teve esse "bot legalizado" se nao me engano foi o Perfect World, aonde o bot rodava infinitamente em x lugar, mas cobrava um preco de 30% se nao me engano... =D

  • Like 1

XD

Share this post


Link to post
Share on other sites
1 minuto atrás, Dwbryel disse:

Interessante, algo que mais ou menos nos cliente atuais, com aqueles macros...
Mas teve um jogo que teve esse "bot legalizado" se nao me engano foi o Perfect World, aonde o bot rodava infinitamente em x lugar, mas cobrava um preco de 30% se nao me engano... =D

Saquei,

A ideia é que ele seja muito configurável, então o dono do servidor poderá colocar os requisitos para os comandos de farm funcionarem; por exemplo: ao usar consome 1 moeda donator... Ou precisa ser vip para usar (assim pode ser cobrado mensal)... Ou por um item de evento (TvT dá um coin ou adena e a cada vez ou cada dia consome um pouco...);

Entre várias ideias que tenho anotado pra essa engine, a principal é simular o um player de forma fiel (seja fazendo loja, vendendo buff, indo farmar, morrer e voltar a farmar, se buffar.... etc...); assim ao abrir um servidor, já vai ser possível instanciar 1k de players e animar os novos players que entrarem; também tenho pensado na questão de os players serem progressivos: instancia um fake player lvl 1 lá nas áreas que nasce, ele vai farmando e upando por conta  indo para determinadas zonas que irei programar e ao decorrer do Up irá trocando de equipamentos quando for na cidade (grade D, C, B, ....);

Já fiz toda a função de definir os equips pela grade do char, mas hoje não é progressivo... Se eu criar um char 65, ele recebe os equips grade A que eu defini, 76... grade S, 80... e assim vai.

  • I love it 1

Share this post


Link to post
Share on other sites

É bacana o fato de você querer desenvolver algo pra L2J e ainda mais, algo que é da sua faculdade, que vai te proporcionar nota, cada um pensa de um jeito, mas , se fosse eu... eu focaria em desenvolver quem sabe uma engine de eventos, onde todos os eventos são de forma unica e de preferencia, melhorados, já ouviu falar da Nexus Engine? Então, algo daquele nível, mas melhor, eu não perderia muito meu tempo desenvolvendo algo que está "matando" os servidores privados de lineage. Mas claro, cada um com sua opinião, boa sorte com seu desenvolvimento. 

  • Thanks 2

www.l2jservidores.com.br

Interlude / Freya / High Five

Share this post


Link to post
Share on other sites

Saquei fera, o que você diz faz sentido; mas eu particularmente não gosto de eventos custom;

Vou explicar o porque: acho que o servidor (ao menos no HighFive que é a versão que estou usando) já existem vários eventos retail, instancias e coisas para se fazer (fortress, siege, hellbound é um trabalhão pra subir o nível de forma retail... Fantasy isle); o que falta é donos de servidores que sabem usar isso corretamente e de forma consciente; O único evento que acho válido ter (dependendo do estilo do servidor) é TvT e ainda assim os donos de servidores privados acabam por não saber montar o estilo de jogo com a premiação do TvT... Aí o player tem que escolher entre 10 a 20 min de TvT pra ganhar 1 coin ou farmar, pra qualquer item especial precisa de 50 coins.... Entende ? Ai a galera não vai no TvT porque não vale a pena, os players acham que n tem ninguém no servidor e saem. Porque player br hoje é assim infelizmente, qualquer coisinha ta saindo do servidor.

 

Então por isso estou fazendo a autopilot engine ao invés de uma de eventos, pois se os players logarem e virem o servidor cheio e os fake players forem tão bem feitos a ponto do player não saber distinguir se é fake ou não, ele vai querer jogar (tipo maria vai com as outras - se tem player, é porque é bom...);

 

Lembrando que essa é apenas a minha opinião pessoal, não quer dizer que estou certo xD

 

Mas de toda forma, pelo menos eu vou receber as notas na facul e estou aprendendo um pouco de Java com algo que eu gosto hahaha

  • Like 2
  • I love it 2

Share this post


Link to post
Share on other sites

Eu discordo totalmente de tudo que você falou ? Mas respeito sua opinião (y) espero que você consiga e principalmente, que ganhe uma boa nota na facul, só vai ?

 


www.l2jservidores.com.br

Interlude / Freya / High Five

Share this post


Link to post
Share on other sites

Meu sonho que era que meus professores aceitassem projetos do L2 como material para os trabalhos hahahah

No cliente mais recente existe o sistema de macros que fica executando repetições de ações. 
Você ainda pode configurar o "target next" de acordo com as necessidades, por exemplo só atracar mobs, permitir atacar personagens flag/caóticos .

 

Acho que uma das funções cruciais é poder limitar a área do farm, mas talvez vc precisaria de uma técnica de "geo-fancing" para o L2 , que de fato tem um sistema de coordenada próprio em x,y,z , embora uma limitação de x,y + raio já resolveria, sempre que o personagem atingisse esse local ele retornaria para o centro.


Boa sorte @vert

 

  • Like 1
  • Thanks 1

EJoOSOj.gif

Sua pergunta foi respondida? Certifique-se de marcar a resposta como a solução aceita.
Se existe mais de uma resposta, utilize o "vote up" para destacá-la.
Se você achar uma resposta útil, diga obrigado clicando no botão "Gostei".

Share this post


Link to post
Share on other sites

@Grundor sim sim!

Na real eu já implementei, mas ao gravar os videos percebi um detalhe que preciso melhorar...

O target pertence a uma respectiva zona no L2 (o L2World é formado por L2WorldZones), então hoje a lógica do fake é pesquisar pelos alvos nas zonas dentro de uma range de 2k a partir do ponto em que ele deu spawn, depois dar um sort e vê qual é o alvo mais próximo do personagem. Qual o problema hoje ? 2k se mostrou uma range muito grande e se ele estiver na borda da range, ele só ataca os mobs próximos e que estão dentro da range... 

Por sorte trabalho em uma empresa de telemetria como dev a 1 ano, então já tenho uma ideia de como resolver, só preciso aplicar hahaha

E sim, você tem razão Leon, vou usar geofences e bouding box ? 

Obrigado o/

  • Like 2

Share this post


Link to post
Share on other sites

muito bom pra H5 ficaria perfeito.

gostei muito da lista ainda não consegui fazer a minha me manda o seu hahaha

a lista de escolha de class se possível hahaha

vou deixar uma contribuição aqui peço que teste em seu projeto

 

 

	import net.sf.l2j.commons.concurrent.ThreadPool;
	Comandos do AdminFakePlayer
	+        if (command.startsWith("admin_fakegiran")) {
+            activeChar.sendMessage("Giran Walker Fake Player");
+            ThreadPool.schedule(new Runnable()
+            {
+              @Override
+            public void run()
+              {
             +   AdminFakePlayers.WhileLoopExample1.spawn(activeChar.getX(), activeChar.getY(), activeChar.getZ());
          +      FakePlayer fakePlayer = FakePlayerManager.spawnPlayer(activeChar.getX(),activeChar.getY(),activeChar.getZ());
     +           fakePlayer.setFakeAi(new GiranWalkerAI(fakePlayer));
+              }
  +          }, 1L);
+          }
	 
	+            static class WhileLoopExample1
      {
+        public static void spawn(int x, int y, int z)
+        {
+          int i = 10;
+          while (i > 0)
+          {
        +    FakePlayer fakePlayer = FakePlayerManager.spawnPlayer(x, y, z);
  +          fakePlayer.setFakeAi(new GiranWalkerAI(fakePlayer));
      
  +          try
+            {
 +             Thread.sleep(1100L);
+            }
    +        catch (InterruptedException localInterruptedException) {}
+            i--;
+          }
+        }
+      }
	

        _walkNodes.add(new WalkNode(82248, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82072, 147560, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82792, 147832, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82248, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82072, 147560, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81752, 147592, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82760, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82840, 148776, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82808, 149064, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82216, 147688, -3464, Rnd.get(1, 20)));
        _walkNodes.add(new WalkNode(82568, 147656, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82792, 147816, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83080, 147912, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81864, 149416, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82856, 149368, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82216, 149464, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81640, 149624, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81512, 149192, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81208, 149224, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81032, 148680, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81400, 148632, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82440, 149240, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82136, 149240, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81336, 149208, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81368, 148952, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83320, 147976, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83592, 148392, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83688, 148472, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83432, 148568, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83576, 148888, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83400, 149144, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83752, 149512, -3400, Rnd.get(1, 40)));

Edited by Ban

L2-JBAN

Share this post


Link to post
Share on other sites
22 horas atrás, Ban disse:

muito bom pra H5 ficaria perfeito.

gostei muito da lista ainda não consegui fazer a minha me manda o seu hahaha

a lista de escolha de class se possível hahaha

vou deixar uma contribuição aqui peço que teste em seu projeto

 


 

 

	import net.sf.l2j.commons.concurrent.ThreadPool;
	Comandos do AdminFakePlayer
	+        if (command.startsWith("admin_fakegiran")) {
+            activeChar.sendMessage("Giran Walker Fake Player");
+            ThreadPool.schedule(new Runnable()
+            {
+              @Override
+            public void run()
+              {
             +   AdminFakePlayers.WhileLoopExample1.spawn(activeChar.getX(), activeChar.getY(), activeChar.getZ());
          +      FakePlayer fakePlayer = FakePlayerManager.spawnPlayer(activeChar.getX(),activeChar.getY(),activeChar.getZ());
     +           fakePlayer.setFakeAi(new GiranWalkerAI(fakePlayer));
+              }
  +          }, 1L);
+          }
	 
	+            static class WhileLoopExample1
      {
+        public static void spawn(int x, int y, int z)
+        {
+          int i = 10;
+          while (i > 0)
+          {
        +    FakePlayer fakePlayer = FakePlayerManager.spawnPlayer(x, y, z);
  +          fakePlayer.setFakeAi(new GiranWalkerAI(fakePlayer));
      
  +          try
+            {
 +             Thread.sleep(1100L);
+            }
    +        catch (InterruptedException localInterruptedException) {}
+            i--;
+          }
+        }
+      }
	

 

 

  Mostrar conteúdo oculto

 

        _walkNodes.add(new WalkNode(82248, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82072, 147560, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82792, 147832, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82248, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82072, 147560, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81752, 147592, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82760, 148600, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82840, 148776, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82808, 149064, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82216, 147688, -3464, Rnd.get(1, 20)));
        _walkNodes.add(new WalkNode(82568, 147656, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82792, 147816, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83080, 147912, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81864, 149416, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82856, 149368, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82216, 149464, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81640, 149624, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81512, 149192, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81208, 149224, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81032, 148680, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81400, 148632, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82440, 149240, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(82136, 149240, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81336, 149208, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(81368, 148952, -3464, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83320, 147976, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83592, 148392, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83688, 148472, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83432, 148568, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83576, 148888, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83400, 149144, -3400, Rnd.get(1, 40)));
        _walkNodes.add(new WalkNode(83752, 149512, -3400, Rnd.get(1, 40)));

 

 

Eu ainda não cheguei nos walkers, estou fazendo as funções básicas primeiro...

 

A lista das classes é só ver uns exemplos, não tem como eu te passar o código todo porque eu não terminei ainda; a minha engine é pra highfive, para qual é a sua ? está usando a l2jroboto ?

No html você coloca um botão assim:

<combobox width=130 var=fakeclass list="Sagittarius;MoonlightSent;" />

Lembrando que a opção no list pode ter no máximo 16 caracteres, por isso não escrevi "Moonlight Sentinel"; ai no botão vc passa o valor da lista como parametro:

<button value="Spawn Fake" action="bypass admin_fakespawn $fakeclass htm" width=80 height=30 />

pra ver como pegar vc tem que dar um split lá no comando de adm:

        if (command.startsWith("admin_fakespawn")) {
            if(command.contains(" ")) {
                String args[] = command.split(" ");

                String occupation = args[1];
                String htm = args[2];

                spawnFakePlayer(occupation, activeChar);

                if(htm.equalsIgnoreCase("htm")) {
                    showFakeDashboard(activeChar);
                }
            }
            return true;
        }

Eu entendi como o //gmshop e o //admin funciona passando os parametros e fiz esse; é só vc dar uma olhada neles com calma que dá pra replicar xD

  • I love it 2

Share this post


Link to post
Share on other sites
8 horas atrás, vert disse:

Eu ainda não cheguei nos walkers, estou fazendo as funções básicas primeiro...

 

A lista das classes é só ver uns exemplos, não tem como eu te passar o código todo porque eu não terminei ainda; a minha engine é pra highfive, para qual é a sua ? está usando a l2jroboto ?

No html você coloca um botão assim:

<combobox width=130 var=fakeclass list="Sagittarius;MoonlightSent;" />

Lembrando que a opção no list pode ter no máximo 16 caracteres, por isso não escrevi "Moonlight Sentinel"; ai no botão vc passa o valor da lista como parametro:

<button value="Spawn Fake" action="bypass admin_fakespawn $fakeclass htm" width=80 height=30 />

pra ver como pegar vc tem que dar um split lá no comando de adm:

        if (command.startsWith("admin_fakespawn")) {
            if(command.contains(" ")) {
                String args[] = command.split(" ");

                String occupation = args[1];
                String htm = args[2];

                spawnFakePlayer(occupation, activeChar);

                if(htm.equalsIgnoreCase("htm")) {
                    showFakeDashboard(activeChar);
                }
            }
            return true;
        }

Eu entendi como o //gmshop e o //admin funciona passando os parametros e fiz esse; é só vc dar uma olhada neles com calma que dá pra replicar xD

Rapaz eu fico muito grato.

o meu e Interlude e sim e o mesmo sistema mais ja estou com o meu a 6 messes e bom acho que vai ter trabalho com a Geodata com os walker em fim você pega o loc mais eles travão se forem RAMDOM na linha agente traça um roda sem obstáculos ate que vai os RAMDOM as vezes a geodata leva ele e ele realmente da uma bugada bom não entendi muito bem como configurar aquela geodata que ele informa na engine em essa que te mandei teste ela essas todas estão funcionando ja testei deixar mais semana eles continuaram fazendo seu trabalho...

obrigado pela ajuda irei tentar replicar xD

  • Like 1

L2-JBAN

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...




     



×
×
  • Create New...