Ir para conteúdo
  • Cadastre-se

Dúvida cruel entre servidor e sabedoria...


fabaol2jbrasil

Posts recomendados

Olha galera eu tava falando com uns cara hoje e percebi uma coisa mt interessante sobre "Servidor Br"

pra um cara abrir um serve ele precisa entender de java mod por completo em si

ou ele só precisa entender de "html, xml, ini, dat etc..."?

 

Muitos ADM fulero diz pra mim que precisa entender de tudo pro server ter futuro mais uma equipe de 3 a 4 pessoas

pode fazer um server proporcional a um cara que "manja" de tudo?

Editado por fabaol2jbrasil

Estou sem PC!

Link para o comentário
Compartilhar em outros sites


Cara acho que se for abrir um servidor com base L2J e não souber nada absolutamente nada em Java é cilada bino!

Pois bugs sempre vão aparecer, rsrs e se não souber ajeitar é fail, por que scripts eventos, npcs, da pra fazer tudo no pyton se souber não precisa ser diretamente no core ;D.

Link para o comentário
Compartilhar em outros sites

 

então .... até que eu edito o serve todo praticamente todo no NOTEPAD++ mais ainda não é o suficiente....

meu unico recurso é apreender java ou.... voltar a ser player :(

Editado por fabaol2jbrasil

Estou sem PC!

Link para o comentário
Compartilhar em outros sites

cara eu acho que o segredo, é você saber um pouco de tudo, não precisa saber de tudo, até porque ninguém sabe de tudo em l2j, a não ser que você fez um curso em java, sabe tudo de java, mais mesmo assim, se você souber tudo de java não adianta porque a maioria dos servidores de hoje com svn aberta, tipo assim não foi tu que criou, então você não vai saber de tudo, porque foi outra pessoa que criou o código então mesmo você sabendo tudo de java, você não vai saber para que serve cada código ali aplicado desde o inicio da pack, entendeu? agora eu discordo de uma frase ali que o sapoo disse, sobre bugs sempre vão aparecer, bugs não vai aparecer do nada, não tem como, na real o bug já estava ali, e quando você colocou online alguém descobriu ele, mais o bug ali já permanecia, só que você não sabia, então o esquema é testar tudo, mais tudo mesmo, se puder arrume uma equipe boa pra testar tudo, e onde estiver bug, corrija! e sobre a sua pergunta, você vai aprender o dobro que você sabe depois que colocar um servidor online, você vai quebrar a cabeça daqui dali, mesmo depois do servidor estiver pronto, depois de online, você vai arrumar + de 1000 coisas nele ainda.

 

você não precisa saber tudo de servidores, html, xml, ingame, quests, java, fazer custom e etc, me mostre alguma pessoa, mais somente 1 e não equipe, a não ser equipe, mais to dizendo uma única pessoa saber de tudo isso, me mostre 1.

 

sabe porque a ncsoft é grande o bastante, porque lá cada 1 tem o teu cargo, cada pessoa lá tem uma função, e assim gerando uma grande empresa de lineage 2.

Flying_Birds_zps9a0601a7.gif

Link para o comentário
Compartilhar em outros sites

 

Nossa... um conselho mais agradavel que o outro o jeito é apreende o básico de java e enfiar o pé na jaca :onda:

Editado por fabaol2jbrasil

Estou sem PC!

Link para o comentário
Compartilhar em outros sites

Antes de aprender tudo isso, tenha responsabilidade, caráter, respeito , responsabilidade, e um muito importante : Vontade de aprender.

 

*-* Isso eu tenho de sobra , e execesso de honestidade também..... :lala:

Estou sem PC!

Link para o comentário
Compartilhar em outros sites

Antes de mais nada tenha: Fluência sob a língua portuguesa, imparcialidade e responsabilidade, quando se é dono de servidor esqueça dos seus amigos no servidor, seja o mais imparcial possível, tenha isso e você terá 60%

Editado por Brunn0Ferreira

teste de assinatura

Link para o comentário
Compartilhar em outros sites

Fluência sob a língua portuguesa

 

Bom dentro do lineage eu faço de tudo para não errar o português e amigos dentro do server eu esqueço todos! ^_^

 

...

 

Bom eu concordo com você, mais erros javas são raros de aparecer eu acho desnecessário ter que ser fluente em java -.-'

Estou sem PC!

Link para o comentário
Compartilhar em outros sites

Primeiro saiba de cada bug que atrapalhe a jogabilidade, por isso saiba escolher uma source que seja estável.

Depois de saber dos bugs saber corrigir o máximo possível.

Lança um beta pros seus amigos e vai pegando cada bug e de um jeito de corrigir e testar..

Depois disso é hora de pensar em como abrir e como manter o servidor aberto por muito tempo,

Escolha um nome legal e curto que grude na cabeça dos futuros players.

Comece com a publicidade, inscreva-se nos tops, fã-page facebook e o que vc achar melhor.

Escolha um site bonito com temática do jogo, fórum de discussão, e área de reporte de bugs, bots, hacks, e outras coisas relacionadas ao jogo.

O site tem que ter um criador de contas dinâmico e com login no site e que tenha painel pro player fazer tudo, destravar, mudar nick por donate, e por ai vai, e o donate do site arrume um painel onde o player pode comprar tudo pelo site com retorno automático do pag-seguro assim vc não precisa ficar logado pra entregar items, e invente também uma moeda donate para ser entregue automaticamente in-game.

Depois disso se vc tem dinheiro é hora de escolher o melhor dedicado, aquele com menor ping, com bom hardware e que não seja absurdamente caro, de preferencia a servidores com 24gb de ram, uplink de 1gb, e up-time de 99,99%, que os hds seja scsi ou ssd, em raid 10 é caro mais é seguro e rápido e o processador tem que ser xeon e windows server 2008 r2 ou 2012, nao esqueça da proteção DDoS;

Depois disso é hora de por online, escolha uma boa geodata depois disso é configurar sua pack no servidor.

Depois de estar online esqueça aquelas centenas de npcs na cidade arrume um NPC onde tem tudo ou coloque via Alt+B, faça boas zonas de farm, do fácil ao mais hardcore em pt, eventos dinâmicos e diferente de 30 em 30 minutos, escolha um donate razoável que não atrapalhe a jogabilidade e seja balanceado, não mecha com char aio isso é bobagem e estraga a jogabilidade. e esqueça rates altos demais trabalhe abaixo dos 100x de preferencia a 50x ou 25x.

Depois disso escolha uma boa equipe de gms, e de uma diretiva, bloquei o trade dos gms e não deixe que eles influenciem na jogabilidade do servidor, restrinja o kill deles, e a opção deles criarem item no inventario dos players, e a opção deles jogarem items no chão.

Deixe o char GM o mais próximo do que seria um char comum, e não fique anunciando o dia todo, e faça valer as regras do servidor e evite escutar tudo que os players dizem e faça reuniões pelo skype com seus gms,

Destine todas as duvidas, problemas para o forum.

E se for fazer um char para jogar jogue como os outros player e nunca diga que é gm nem pra sua mãe se não servidor perde toda a credibilidade.,

Depois disso mano é só manter o servidor sempre atualizado, acompanhar os reportes do forum e sempre colocar novidade nos eventos, também fazer promoções, sorteios, e acompanhar as sugestões dos players no forum, sugestões nas quais tem que ser analisada e verificar se é viável e fazer uma votação global.

É um servidor para manter no ar pelo menos 5 anos com rentabilidade talvez o investimento inicia seja um pouco alto porem vc ganharam em pouco tempo tudo de volta e se seguir a risca e não vacilar vai se sair bem.

Nunca esqueça o que mata um servidor é corrupção, muita firula, desbalanceamento dos donates, falta de novidades, hardware do servidor fraco que causa lags, e uma geodata ruim e um numero de bugs que nunca é corrigido e que quem conhece sempre aproveita e fode quem não sabe.

Editado por tuningxtreme

Projeto privado Lindvior - Ertheia

Source Godworld.

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...

Antes de ser administrador recomendo que seja um ótimo player, e sobre java, hoje em dia da pra manter um servidor sem saber, agora xml, sql e html é essencial.

A honra nunca se ofende impunemente: nunca existe por metade; inteira é forte, ferida está morta.

Link para o comentário
Compartilhar em outros sites

Oi pessoal!

 

Vim aqui apenas demonstrar minha opinião, e dividi-la em dois tópicos:

 

- Administrador: Responsável pela manutenção da máquina/servidor, e administração em si, tais como configurações do servidor, manuseio de cargos da staff (GM, GMH, GME), entre outras coisas relacionados à parte administrativa do servidor.

 

- Desenvolvedor: Propriamente dito, irá mexer com o desenvolvimento de coisas para o servidor em si. Aí que entra o Java, Python entre outras linguagens essenciais para o desenvolvimento de "toques" diferentes em seu servidor.

 

Claro, um administrador pode ser um desenvolvedor, porém, nem sempre há necessidade de um desenvolvedor 24h no seu server. Eu mesmo, muitas vezes comprava projetos Russos/Europeus, não gastava muito e tinha um ótimo suporte e retorno pela parte dos desenvolvedores do projeto. Óbvio, eu entendo de java, mas me faltava tempo e paciência kkkkkk.

 

Esse é meu ponto de vista galera, mas lógico, todos temos que sentar para aprender, se quisermos que algo dê certo ;).

Abraços!!!

Aew, quem curte MPB, dá uma olhadinha no Canal de minha amiga, lá ela publica covers semanalmente... Valeu!

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

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.