Ir para conteúdo
  • Cadastre-se

Importando e configurando um objeto na Unreal


velvet

Posts recomendados

Importando e configurando um objeto na Unreal

Olá

 

Montei esse tutorial bem BASICO apenas para mostrar como importar um objeto simples dentro do editor da unreal.

Antes de mais nada gostaria de lembrar que o conteúdo desse tutorial não foi criado por mim, eu apenas adaptei de tutoriais dos links:

www.eat3d.com/free

http://udn.epicgames.com

http://waylon-art.com/LearningUnreal/

http://www.ut40k.planetunreal.gamespy.com/..._tutorials.html

credito para os autores originais.

Arquivos para usar no Tutorial

http://dl.getdropbox.com/u/691893/Unreal_Tut001.rar

Max: Dentro do max, após terminar a modelagem, resete os eixos e coloque o modelo no centro da viewport ( 0,0,0 )

File>Export Selected> Nome do arquivo.ASE

Feito isso, exporte todas as texturas como .tga

Abra o Unreal editor ( você tem que ter um jogo que use a engine, como Gears of War, Unreal Tournament 3, 2004, 2007 )

 

No meu caso, eu uso o steam, é só clicar com o botão direito no nome do jogo e pedir para rodar como editor.

Pode demorar um pouco, é um software meio pesado, aqui na minha maquina demora quase 1 minuto.

Essa é a tela do editor. Eu sugiro não desligar as ‘Tips of the day’ sempre tem uma dica ai

IMPORTANDO PARA O EDITOR UNREAL

Unreal Editor:

 

A viewport é meio alien, eu sei, ainda não me acostumei direito, porém já não está tão estranha aos meus olhos, a primeira coisa que você deve notar, é o generic browser que ele abre junto com a engine, se não abrir, vá em View>Browser Windows>Generic, é dentro do generic browser que você vai importar todo o material para começar a editar na unreal! >=)

 

 

File>Import. – procure o arquivo .ASE, que no meu caso é o parede_mesh.ase, de um nome para o seu pacote, um nome para o grupo ( como é um mesh, grupo mesh ) e um nome para esse mesh que você está importando.

Feito isso, clique OK.

Pode levar alguns segundos

Dentro do Generic Browser tem trocentos pacotes, scroll down até achar o seu recém criado pacote.

Por enquanto só temos a mesh da parede ali, sem texturas, sem material, sem nada.

Importaremos as texturas para criarmos o material.

 

 

Novamente, File>Import agora selecione as texturas, Diffuse.tga e Specular.tga, habilite a opção CompressionNoAlpha, pelo simples fato de não termos mapas de alpha nessa textura, isso salva memória dentro da engine, Compression Settings deixe como TC_Default Nomeie o grupo para TEXTURES agora o nome pode deixar o mesmo que está, ele nomeia automaticamente de acordo com o nome do arquivo da textura, clique Ok to All. De novo! File>Import agora o normal map, CompressionSettings = TC_NormalMap CompressionNoAlpha habilitado

OK.

CRIANDO O MATERIAL 1

Ok, agora com todas as texturas importadas, criaremos o material para aplicar no modelo.

 

 

Clique com o botão direito dentro do Generic e clique em ADD NEW MATERIAL.

Group – Material

Name – Mesh_Material

 

Esse é o material editor da Unreal, é aqui onde a mágica acontece .

 

 

Com o botão esquerdo como pode controlar o ‘PAn’ do editor, o scroll do mouse controla o zoom, e clicando sobre um slot segurando o crtl você pode movê-lo. Selecione sua Diffuse no Generic, dento do Material Editor, scroll down até TextureSample.

Clique e arraste o TEXTURESAMPLE para a área cinza do material editor, ele vai criar um slot com sua textura, agora ligue as texturas nos respectivos canais, Diffuse em Diffuse, Specular em SPecular e Normal Na normal

 

Nota: Podem ver pela imagen que meu normal está invertido! para arruma, volte no photoshop, vá à aba channels, selecione apenas o canal green, ctrl+I para inverter, e depois clique novamente em RGB para habilitar todos os canais, salve com o mesmo nome, NORMAL.TGA, de volta na unreal, clique com o botão direito sobre o normal map, e clique em RE-IMPORT TEXTURE. Pronto, o normal está certo agora!

 

Com o material pronto, clique no Sinal de ”check” verde, o primeiro da esquerda para a direita.agora vamos aplicar o material clique 2 vezes no seu mesh para abrir o mesh editor.

 

Agora para aplicar a textura, abra LODINFO e abra todas as abas dentro, a ultima aba tem a opção material, de volta no generic browse seleciona seu material com um clique, e depois clique na seta verde para ele usar o material que você selecionou

Pronto, agora estamos com o mesh e material prontos para de fato usarmos no nosso ”mapa”.

ADICIONANDO MESH NO ‘MAPA’

 

 

Com a mesh selecionada, clique na viewport, e escolha a opção igual na imagem. Você vai notar que o modelo está em wire frame, aperte G para ligar a visão em real time.

Você vai perceber, que o modelo está sem nenhuma fonte de luz, por isso não esta aparecendo, habilite a opção unlit para ”apagar as luzes” assim o modelo fica com o self illumination ligado e você pode ve-lo na viewport.

Nota: a perspective view é bem chata, alias, é muito chata de controlar, o botão esquerdo da um zoom e pan ao mesmo tempo, o direito move a câmera, o scroll do mouse para zoom, para controlar eu tive que fazer uma combinação de movimentos entre o esquerdo, direito, pra cima pra baixo meia lua com soco forte, depois de um tempo você se acostuma, você pode controlar também pelas setas do mouse.

Bom, importamos o mesh e os materiais, mas ta muito chato de olhar, para tornar as coisas mais legais, vamos adicionar alguns pontos de luz.

ILUMINANDO O OBJETO NO ‘MAPA’

 

Clique com o botão direito na viewport, Add Actor, Add Ligh Point, ou então, segure a tecla L e clique no seu mesh, ele vai criar a luz no mesmo lugar do mesh.

Agora se clicarmos em Lit novamente para ver a iluminação nada acontece, isso porque ainda temos que associar a luz ao mesh, clique duas vezes no mesh, ou clique 1 vez no objeto e aperte f4 , ele vai abrir as propriedades desse objeto, navegue até a opção Collision> COllision Component> Lighting, habilite bCastDynamicShadow, depois mais pra baixo tem a opção LightingChannels, habilite a opção STATIC.

Outra forma de habilitar a luz, é abrindo as propriedades da luz,light>lighcomponent>lightingchannels> habilite DYNAMIC.

As duas maneiras dão o mesmo resultado ( para a luz, não sei dizer para outras funções, ainda.. )

 

Novamente, nas propriedades da Luz, tem algumas opções importantes que você pode mudar e brincar para consseguir um resultado bacana, Brightness,radius, FalloffExponent e light color são as que voce pode alterar para obter resultados bons e rápidos, deixe a opção CastDynamicShadows habilitada para umas sombras ‘dah hora’.

Brightness: define quanto sua luz brilhará.

FalloffExponent: ele controla a ”queda” da luz sobre o objeto, deixe o brilho bem forte e aumente bem o fallof, voce tem um controle melhor da ilmunação, quanto mais alto mais escuro a luz fica, quanto menos o valor, mais claro.

radius: o radius serve para voce controlar o alcance da luz

Light Color:essa é a opção mais difícil de configurar, clique na lupa ao lado da cor e escolhe a cor que você quer! ufa…

Bem, configurada a primeira luz, faça algumas copias dela e posicione pelo mapa para ver um efeito melhor, mude a configuração das outras luzes para obter uns efeitos legais ( para duplicar, clique no obj, segure a tecla alt e mova o objeto, ele vai automaticamente duplicar aquele objeto e move-lo, ou então vá até EDIT>Duplicate)

Voce pode adicionar outros tipos de luzes, como spot, directional e skylight.

 

Abra o Generic Browser, abra a aba actor classes, aumente a opção lights, pode ver varias opções de luzes, clique em Spotlight, e depois na viewport com o botão direito clique em add spotlight here agora posicione a spotlight na viewport, voce vai perceber novamente que ela não está afetando o objeto, precisamos ligar a opção DYNAMIC dentro de LighComponents>LightingChannels.

A spot light além das configurações da luz normal, brightness, color etc, tem outras 2 interessantes, como a InnerConeAngle e OuterConeAngle.

 

 

Ambas servem para definir como a luz se comportará no objeto, se você deixar a inner perto da outer, a luz vai ficar com a sombra bem marcada, voce pode controlar isso para deixar a sombra mais suave ou mais marcada, de acordo com o que voce precisa.

MATERIAL 2

 

Bom, está legal até agora, conseguimos iluminar de uma maneira que deixa o objeto interessante na visão real time, mas ainda da pra deixar mais interessante, pra isso agente vai adicionar umas ”perfumarias” no material.

Vamos usar nosso specular junto com outras opções para criarmos um specular colorido. abra o material editor desconecte a textura specular do canal specular ( botão direito break link )

 

Nos vamos precisar de 2 “material expression” para isso, Constant vector 3 ( para adicionarmos cores, vector 3 pois ele trabalho com R,G e B , o vector 2, com R e G , e o constant apenas trabalha com o canal de alpha ) e o Multiply.

Clique e arraste as opções Constant Vector 3 e Multiply para a área de trabalho do material editor.Usaremos o constant vector 3 para definir a cor do specular, clique uma vez nesse slot, habilite agora a opção bRealtimePreview, e mude para uma cor que lhe agrade, no meu caso R-2, G-3, B-4

Usaremos o multiply para unir nosso specular a cor que acabamos de criar com o Constant, para isso ligue a textura do specular na opção A do multiply e o constant na Opção B, voce vai perceber que o slot do multiply ficou com a textura do specular e com a cor do constant, ligue agora o multiply no canal specular, e pode perceber a diferença na hora.

Ficou bonito e interessante, porem um pouco forte e não está parecendo natural, podemos controlar a intensidade desse specular se adicionarmos um constant ao canal specularPower, a principio ele vai estourar o specular, porem se voce aumentar o valor do R para algo em torno de 10 ou 15 ele vai controlar de uma forma mais natural o resultado, faça alguns testes e veja qual valor se encaixa melhor!

Podemos também usar um Constante Vector 3 para adicionar uma cor diferente ao diffuse! Os passos são os mesmos do specular, é são conectar o multiply novo ao diffuse.

É importante manter o material editor organizado, para facilitar a leitura, esse material está super simples com poucos nodes, imagina o material usado no Gears of war por exemplo, deve dar medo, sem uma organização o jogo nunca teria saído.

 

Em cada textura e material expression tem a opção DESC ( DESCRIPTION/descrição) então sempre coloque os nomes das texturas e relacione os material expressions com cada uma das texturasm por exemplo ” Multiply do SPecular”, outra coisa que ajuda muito a manter a organização são as Comment Box, segure control e clique nos nodes Diffuse Color e Diffuse Multiply, e aperte C, faça um comentário sobre esses nodes para facilitar para o outro artista se localizar, ou até mesmo para você não se perder depois.

Feito isso, clique no checker verde para salvar o material e mostrá-lo em real time.

Nota: ainda não descobrir como controlar a intensidade do normal map, mas assim que eu achar algo atualizo aqui

Nota2: Não esqueçam que a cor das luzes influenciam diretamente no material, se a luz estiver vermelha ofuscante de cabaré, e o seu material com uma textura verde água, “APAGA A LUZ!”

 

ADICIONANDO UM PONTO DE PARTIDA

 

Bom isso tudo que fizemos não tem a mínima graça se não colocarmos de fato dentro do jogo, para fazer isso, precisamos adicionar um PlayerStart.

 

Posicione o ícone do playerstart de frente para a parede, feito isso clique no ícone do joystick no painel de menus.

 

Quando a janela do editor in game aparece, 3 coisas acontecem, 1 voce cai, infinitamente, 2 a mensagem LIGTHING NEEDS TO BE REBUILT aparece, isso acontece porque não fizemos o bake das luzes, e 3 fica uma bagunça divina na tela, segundo o pessoal da EAT3D isso é um problema de redraw da engine, eles adicionaram algumas atualizações para que não tivesse um redraw em nada que estivesse contra o background, para concertar isso tudo, vamos por partes

 

1 – pra agente não cair infinitamente pelo editor, precisamos adicionar, nada mais nada menos que um ‘chão’. Para criá-lo, clique no seu mesh, e clique em cube na aba da esquerda da tela, voce vai notar que um cubo pequeno foi adicionado no mesmo lugar do mesh.Clique com o botão direito no ícone do cubo ( no ícone, não no cubo ), agora mexa nas configurações para ajustar o tamanho altura e profundidade do seu chão.

 

Feito isso, posicione o ‘chão’ debaixo de sua parede, agora para fazer com que não caiamos mais, vamos adicionar um BlockingVolume, selecione o cubo na viewport, clique com o botão direito no ícone da imagem e selecione BlockingVolume.

Clique novamente no ícone do joystick e você vai notar que o primeiro erro já esta concertado.

Nota: Minha parede ficou minúscula dentro da engine, se seu objeto estiver muito pequena, clique nele, f4 para abrir as propriedades, aba Display>DrawScale3D, altere os valores de x y e z para um tamanho mais adequado, no meu caso 2 2 2

2 – Toda vez que voce muda alguma configuração de luz, voce tem que dar um bake ou um build nela, para isso vá no menu BUIL> BUILD ALL.

 

3 – Esse é um pouco mais trabalhoso, para arrumar o problema de redraw do background vamos adicionar um elemento chama CSG:ADD, ele vai servir como nossa parede, selecione aquele cubo que voce usou como chão, posicione-o em cima da parede e das luzes ( se precisar redimensione ), e clique em CSG:ADD, repare que foi criado outra box cinza.

 

Agora o que voce tem que fazer é construir em volta do seu objeto uma espécie de caixa, para fazer isso voce movimenta o box para o lugar correto e clica em CSG:ADD, lembre-se de fechar por completo, em todos os lados e de usar o mesmo tamanho e largura para todos.

 

Note que agora a textura da parede também ficou no chão e nas paredes, isso acontece porque provavelmente ao clicar em CSG:ADD o material da parede estava selecionado no Generic Browser, então ele adiciona o objeto já com o material que você estava selecionando.

 

 

Na perspective view, aperte G novamente, selecione a ‘parede’, botão direito > select all surfaces, aperte f5 para abrir as propriedades e desabilite a opção Accepts Lights e em LightingChannels desabilite a opção BSP, clique em apply, agora BUild>Build All.

 

 

Outra opção é Você clicar na surface e ir na opção apply material, eu escolhi um material default, mas você pode colocar o que quiser.Lembrando que o material tem que estar selecionado dentro do Generic Browser.Feito isso, Build>Build All, voce pode clicar novamente no joystick, vai repara que agora voce pode andar pelo cenário livremente e sem problemas de redraw ou ‘quedas’

 

A imagem acima é um exemplo que fiz, utilizei também uma skylight, para usar a skylight não feche o ”teto” se não a luz não funciona.

Se você aperta Tab. dentro do ‘In game editor’ vai abrir o console, alguns comandos úteis são

setres ( largura )X( altura ) para redimensionar a tela da forma que voce quiser, por exemplo setres 800×600

togglehud para tirar os creditos que fica no topo da tela.

Agora não se esqueça de salvar tudo que você fez haha, no generic browser, file>save

Bom é isso ai, acho que é uma boa introdução pra galera que tem curiosidade!

Gostaria de lembrar que o conteúdo desse tutorial não foi criado por mim, eu apenas adaptei de tutoriais dos links:

www.eat3d.com/free

http://udn.epicgames.com

http://waylon-art.com/LearningUnreal/

http://www.ut40k.planetunreal.gamespy.com/..._tutorials.html

Abaixo, um video de um personagem que fiz dentro da engine, o material está configurado usando os nodes que eu mostrei aqui, o resultado é bem legal.

http://www.vimeo.com/3475573

Espero ter ajudado, assim que eu for aprendendo mais eu vou postando mais, mas

Acho que com esse tutorial da pra fazer alguma coisa já!

Abraços

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


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