Ir para conteúdo
  • Cadastre-se

Autopilot Engine


vert

Posts recomendados

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

 

Editado por vert
Link para o comentário
Compartilhar em outros 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

XD

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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. 

Um mundo de diversão no Lineage 2

https://www.primeworld.com.br

Discord: Em breve

Comunidade brasileira de Lineage. Interlude Remastered / High Five / Essence 

Classes remasterizadas, sistemas únicos, diversão garantida.

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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 ?

 

Um mundo de diversão no Lineage 2

https://www.primeworld.com.br

Discord: Em breve

Comunidade brasileira de Lineage. Interlude Remastered / High Five / Essence 

Classes remasterizadas, sistemas únicos, diversão garantida.

Link para o comentário
Compartilhar em outros sites

  • L2JBr ADM

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

 

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".

Link para o comentário
Compartilhar em outros 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/

Link para o comentário
Compartilhar em outros 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)));

Editado por Ban
Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

  • 7 months later...
  • 10 months later...

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.

Visitante
Responder

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

  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.

Processando...
  • Registre-se

    Faça parte da maior e  mais antigas comunidades sobre Lineage2 da América Latina.





  • Patrocinadores

  • Quem Está Navegando

    • Nenhum usuário registrado visualizando esta página.
  • Posts

    • Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?    
    • muchas gracias muy lindos NPC 🙂
    • relaxa jovem gafanhoto, testa as quests. e posTa os erros indesejaveis.  
    • Se alguém pudesse me ensinar como codificar as missões, eu ficaria feliz em fazer isso sozinho ou pelo menos ajudar. Eu realmente quero jogar em um servidor onde todas as quests funcionem bem e melhor ainda se você puder fazer quests customizadas!
    • mas no interlude, nem todas as quests de class,  vai mostrar onde tem que ir, ate o reborn nao mostrava quando era interlude, só mostrou depois que eles colocaram client classic pra rodar, e ficou melhor ainda quando virou hellbound em diante, mas ha sim alguma chance de modificar isso direto no script para fazer igualmente, só basta te um pouco de paciencia e persistencia exato
    • 408_PathToElvenwizard dá Orion eu tive que mexer tbm, até modifiquei e consegui deixar ela igual do Classic, com a seta e a marcação no mapa. (não retail IL) Dá pra importar py de várias revs, o foda é que não da regular as quest py através do debug em tempo real, pelo menos eu não consegui rsrs
    • Hasta el momento todas las QUESTS son completables si te guias con un tutorial de youtube. El problema es que tienen bugs de locacion y de subquests que no avanzan o no te marcan correctamente a donde ir en el mapa, cosa que en Retail si se ve como corresponde.
    • estranho, mas pelo menos a galera nunca reclamo das quests quando tinha aberto 5x, geral fez class primeira e segunda job, poucos que compraram a class
    • en RUSaCis-3.5 data pack, las Quests estan en formato .java y son diferentes a como estan redactadas en jOrion y jFrozen 1.5 (ProyectX) package net.sf.l2j.gameserver.scripting.quest; import net.sf.l2j.commons.random.Rnd; import net.sf.l2j.gameserver.enums.Paperdoll; import net.sf.l2j.gameserver.enums.QuestStatus; import net.sf.l2j.gameserver.enums.actors.ClassId; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.Npc; import net.sf.l2j.gameserver.model.actor.Player; import net.sf.l2j.gameserver.network.serverpackets.SocialAction; import net.sf.l2j.gameserver.scripting.QuestState; public class Q224_TestOfSagittarius extends SecondClassQuest { private static final String QUEST_NAME = "Q224_TestOfSagittarius"; // Items private static final int BERNARD_INTRODUCTION = 3294; private static final int HAMIL_LETTER_1 = 3295; private static final int HAMIL_LETTER_2 = 3296; private static final int HAMIL_LETTER_3 = 3297; private static final int HUNTER_RUNE_1 = 3298; private static final int HUNTER_RUNE_2 = 3299; private static final int TALISMAN_OF_KADESH = 3300; private static final int TALISMAN_OF_SNAKE = 3301; private static final int MITHRIL_CLIP = 3302; private static final int STAKATO_CHITIN = 3303; private static final int REINFORCED_BOWSTRING = 3304; private static final int MANASHEN_HORN = 3305; private static final int BLOOD_OF_LIZARDMAN = 3306; private static final int CRESCENT_MOON_BOW = 3028; private static final int WOODEN_ARROW = 17; // Rewards private static final int MARK_OF_SAGITTARIUS = 3293; // NPCs private static final int BERNARD = 30702; private static final int HAMIL = 30626; private static final int SIR_ARON_TANFORD = 30653; private static final int VOKIAN = 30514; private static final int GAUEN = 30717; // Monsters private static final int ANT = 20079; private static final int ANT_CAPTAIN = 20080; private static final int ANT_OVERSEER = 20081; private static final int ANT_RECRUIT = 20082; private static final int ANT_PATROL = 20084; private static final int ANT_GUARD = 20086; private static final int NOBLE_ANT = 20089; private static final int NOBLE_ANT_LEADER = 20090; private static final int BREKA_ORC_SHAMAN = 20269; private static final int BREKA_ORC_OVERLORD = 20270; private static final int MARSH_STAKATO_WORKER = 20230; private static final int MARSH_STAKATO_SOLDIER = 20232; private static final int MARSH_STAKATO_DRONE = 20234; private static final int MARSH_SPIDER = 20233; private static final int ROAD_SCAVENGER = 20551; private static final int MANASHEN_GARGOYLE = 20563; private static final int LETO_LIZARDMAN = 20577; private static final int LETO_LIZARDMAN_ARCHER = 20578; private static final int LETO_LIZARDMAN_SOLDIER = 20579; private static final int LETO_LIZARDMAN_WARRIOR = 20580; private static final int LETO_LIZARDMAN_SHAMAN = 20581; private static final int LETO_LIZARDMAN_OVERLORD = 20582; private static final int SERPENT_DEMON_KADESH = 27090; public Q224_TestOfSagittarius() { super(224, "Test Of Sagittarius"); setItemsIds(BERNARD_INTRODUCTION, HAMIL_LETTER_1, HAMIL_LETTER_2, HAMIL_LETTER_3, HUNTER_RUNE_1, HUNTER_RUNE_2, TALISMAN_OF_KADESH, TALISMAN_OF_SNAKE, MITHRIL_CLIP, STAKATO_CHITIN, REINFORCED_BOWSTRING, MANASHEN_HORN, BLOOD_OF_LIZARDMAN, CRESCENT_MOON_BOW); addQuestStart(BERNARD); addTalkId(BERNARD, HAMIL, SIR_ARON_TANFORD, VOKIAN, GAUEN); addMyDying(ANT, ANT_CAPTAIN, ANT_OVERSEER, ANT_RECRUIT, ANT_PATROL, ANT_GUARD, NOBLE_ANT, NOBLE_ANT_LEADER, BREKA_ORC_SHAMAN, BREKA_ORC_OVERLORD, MARSH_STAKATO_WORKER, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE, MARSH_SPIDER, ROAD_SCAVENGER, MANASHEN_GARGOYLE, LETO_LIZARDMAN, LETO_LIZARDMAN_ARCHER, LETO_LIZARDMAN_SOLDIER, LETO_LIZARDMAN_WARRIOR, LETO_LIZARDMAN_SHAMAN, LETO_LIZARDMAN_OVERLORD, SERPENT_DEMON_KADESH); } @Override public String onAdvEvent(String event, Npc npc, Player player) { String htmltext = event; QuestState st = player.getQuestList().getQuestState(QUEST_NAME); if (st == null) return htmltext; // BERNARD if (event.equalsIgnoreCase("30702-04.htm")) { st.setState(QuestStatus.STARTED); st.setCond(1); playSound(player, SOUND_ACCEPT); giveItems(player, BERNARD_INTRODUCTION, 1); if (giveDimensionalDiamonds39(player)) htmltext = "30702-04a.htm"; } // HAMIL else if (event.equalsIgnoreCase("30626-03.htm")) { st.setCond(2); playSound(player, SOUND_MIDDLE); takeItems(player, BERNARD_INTRODUCTION, 1); giveItems(player, HAMIL_LETTER_1, 1); } else if (event.equalsIgnoreCase("30626-07.htm")) { st.setCond(5); playSound(player, SOUND_MIDDLE); takeItems(player, HUNTER_RUNE_1, 10); giveItems(player, HAMIL_LETTER_2, 1); } // SIR_ARON_TANFORD else if (event.equalsIgnoreCase("30653-02.htm")) { st.setCond(3); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_1, 1); } // VOKIAN else if (event.equalsIgnoreCase("30514-02.htm")) { st.setCond(6); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_2, 1); } return htmltext; } @Override public String onTalk(Npc npc, Player player) { String htmltext = getNoQuestMsg(); QuestState st = player.getQuestList().getQuestState(QUEST_NAME); if (st == null) return htmltext; switch (st.getState()) { case CREATED: if (player.getClassId() != ClassId.ROGUE && player.getClassId() != ClassId.ELVEN_SCOUT && player.getClassId() != ClassId.ASSASSIN) htmltext = "30702-02.htm"; else if (player.getStatus().getLevel() < 39) htmltext = "30702-01.htm"; else htmltext = "30702-03.htm"; break; case STARTED: int cond = st.getCond(); switch (npc.getNpcId()) { case BERNARD: htmltext = "30702-05.htm"; break; case HAMIL: if (cond == 1) htmltext = "30626-01.htm"; else if (cond == 2 || cond == 3) htmltext = "30626-04.htm"; else if (cond == 4) htmltext = "30626-05.htm"; else if (cond > 4 && cond < 8) htmltext = "30626-08.htm"; else if (cond == 8) { htmltext = "30626-09.htm"; st.setCond(9); playSound(player, SOUND_MIDDLE); takeItems(player, HUNTER_RUNE_2, 10); giveItems(player, HAMIL_LETTER_3, 1); } else if (cond > 8 && cond < 12) htmltext = "30626-10.htm"; else if (cond == 12) { htmltext = "30626-11.htm"; st.setCond(13); playSound(player, SOUND_MIDDLE); } else if (cond == 13) htmltext = "30626-12.htm"; else if (cond == 14) { htmltext = "30626-13.htm"; takeItems(player, BLOOD_OF_LIZARDMAN, -1); takeItems(player, CRESCENT_MOON_BOW, 1); takeItems(player, TALISMAN_OF_KADESH, 1); giveItems(player, MARK_OF_SAGITTARIUS, 1); rewardExpAndSp(player, 54726, 20250); player.broadcastPacket(new SocialAction(player, 3)); playSound(player, SOUND_FINISH); st.exitQuest(false); } break; case SIR_ARON_TANFORD: if (cond == 2) htmltext = "30653-01.htm"; else if (cond > 2) htmltext = "30653-03.htm"; break; case VOKIAN: if (cond == 5) htmltext = "30514-01.htm"; else if (cond == 6) htmltext = "30514-03.htm"; else if (cond == 7) { htmltext = "30514-04.htm"; st.setCond(8); playSound(player, SOUND_MIDDLE); takeItems(player, TALISMAN_OF_SNAKE, 1); } else if (cond > 7) htmltext = "30514-05.htm"; break; case GAUEN: if (cond == 9) { htmltext = "30717-01.htm"; st.setCond(10); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_3, 1); } else if (cond == 10) htmltext = "30717-03.htm"; else if (cond == 11) { htmltext = "30717-02.htm"; st.setCond(12); playSound(player, SOUND_MIDDLE); takeItems(player, MANASHEN_HORN, 1); takeItems(player, MITHRIL_CLIP, 1); takeItems(player, REINFORCED_BOWSTRING, 1); takeItems(player, STAKATO_CHITIN, 1); giveItems(player, CRESCENT_MOON_BOW, 1); giveItems(player, WOODEN_ARROW, 10); } else if (cond > 11) htmltext = "30717-04.htm"; break; } break; case COMPLETED: htmltext = getAlreadyCompletedMsg(); break; } return htmltext; } @Override public void onMyDying(Npc npc, Creature killer) { final Player player = killer.getActingPlayer(); final QuestState st = checkPlayerState(player, npc, QuestStatus.STARTED); if (st == null) return; switch (npc.getNpcId()) { case ANT: case ANT_CAPTAIN: case ANT_OVERSEER: case ANT_RECRUIT: case ANT_PATROL: case ANT_GUARD: case NOBLE_ANT: case NOBLE_ANT_LEADER: if (st.getCond() == 3 && dropItems(player, HUNTER_RUNE_1, 1, 10, 500000)) st.setCond(4); break; case BREKA_ORC_SHAMAN: case BREKA_ORC_OVERLORD: if (st.getCond() == 6 && dropItems(player, HUNTER_RUNE_2, 1, 10, 500000)) { st.setCond(7); giveItems(player, TALISMAN_OF_SNAKE, 1); } break; case MARSH_STAKATO_WORKER: case MARSH_STAKATO_SOLDIER: case MARSH_STAKATO_DRONE: if (st.getCond() == 10 && dropItems(player, STAKATO_CHITIN, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, MITHRIL_CLIP, REINFORCED_BOWSTRING)) st.setCond(11); break; case MARSH_SPIDER: if (st.getCond() == 10 && dropItems(player, REINFORCED_BOWSTRING, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, MITHRIL_CLIP, STAKATO_CHITIN)) st.setCond(11); break; case ROAD_SCAVENGER: if (st.getCond() == 10 && dropItems(player, MITHRIL_CLIP, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, REINFORCED_BOWSTRING, STAKATO_CHITIN)) st.setCond(11); break; case MANASHEN_GARGOYLE: if (st.getCond() == 10 && dropItems(player, MANASHEN_HORN, 1, 1, 100000) && player.getInventory().hasItems(REINFORCED_BOWSTRING, MITHRIL_CLIP, STAKATO_CHITIN)) st.setCond(11); break; case LETO_LIZARDMAN: case LETO_LIZARDMAN_ARCHER: case LETO_LIZARDMAN_SOLDIER: case LETO_LIZARDMAN_WARRIOR: case LETO_LIZARDMAN_SHAMAN: case LETO_LIZARDMAN_OVERLORD: if (st.getCond() == 13) { if (((player.getInventory().getItemCount(BLOOD_OF_LIZARDMAN) - 120) * 5) > Rnd.get(100)) { playSound(player, SOUND_BEFORE_BATTLE); takeItems(player, BLOOD_OF_LIZARDMAN, -1); addSpawn(SERPENT_DEMON_KADESH, player, false, 300000, true); } else dropItemsAlways(player, BLOOD_OF_LIZARDMAN, 1, 0); } break; case SERPENT_DEMON_KADESH: if (st.getCond() == 13) { if (player.getInventory().getItemIdFrom(Paperdoll.RHAND) == CRESCENT_MOON_BOW) { st.setCond(14); playSound(player, SOUND_MIDDLE); giveItems(player, TALISMAN_OF_KADESH, 1); } else addSpawn(SERPENT_DEMON_KADESH, player, false, 300000, true); } break; } } }  
×
×
  • Criar Novo...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.