Ir para conteúdo
  • Cadastre-se
  • 0

Utilização de costumes via DressMe


Schuster

Pergunta

Pessoal, bom dia!

Estou configurando as famosas skins (costumes) e pretendo publicar em breve um tutorial sobre a adição e configuração, algo que muitos procuram, inclusive eu, que passei um bom tempo atras delas até ter algo realmente funcional.

Este tutorial teria o mod (DressMe) que já temos aqui no fórum e todos arquivos do cliente Interlude, tais como UTX, UKX, arquivos da datapack (SQL, XML e etc) e os arquivos da system (itemname-e.dat, etcitemgrp.dat, armorgrp.dat e etc), algo realmente completo, facilitando a vida de todos por aqui.

Baseado em três ótimos tópicos feitos por @BAN@Christian-SDM e @RootZerO, consegui  finalmente chegar no que eu desejava.

O que ocorre agora talvez seja bem simples para os mais experientes em Java. Sem mais delongas, vamos lá...

Configurei 5 costumes para utilização e testes, conforme imagem abaixo.

spacer.png

As duvidas começam agora...

Ao dar 2 cliques no item para utilizar o costume, alem de não utilizar o costume é exibida a mensagem de que o costume foi desativado, como se já estivesse em uso.

spacer.png

Se der dois cliques novamente, é utilizado o costume com sucesso.

spacer.png

E também, se der mais dois cliques ele desativa o costume com sucesso.

spacer.png

Após já ter utilizado algum costume, desativado e utilizado outro, não informa que o costume foi desativado e é ativado o novo com sucesso.

spacer.png

Caso eu tente mudar de costume já com um ativo, ele desativa o antigo, ao invés de já ativar o novo.

spacer.png

Sendo necessário mais 2 cliques para ativar o costume.

spacer.png

Surge então os questionamentos:

  • Por que informa que desativou o costume ao dar 2 cliques sendo que não foi utilizado nenhum (sendo necessário mais 2 cliques para utilizar)?
  • Por que caso eu tente mudar de costume já com um ativo, ele desativa o antigo e não ativa o novo (sendo necessário mais 2 cliques para utilizar)?

Gostaria que ao dar 2 cliques ele use o costume diretamente, independente se for a primeira utilização ou com um costume já ativo.

Segue o código Java onde acredito ser a parte de utilização do item, já fiz diversas alterações e não consigo fazer com que o item seja utilizado diretamente na primeira utilização e que após ter um ativo seja possível utilizar diretamente outro.

package Dev.ItemSkins;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.network.clientpackets.RequestBypassToServer;

/**
 * @author Juvenil Walker
 *
 */
public class Skin1 implements IItemHandler

{
	
	@Override
	public void useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if(Config.ALLOW_DRESS_ME_SYSTEM)
        {
            if(!(playable instanceof Player))
                return;
            Player activeChar = (Player)playable;
            RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
            
            if (activeChar.isDressMeEnabled())
			{
				activeChar.setDressMeEnabled(false);
				activeChar.broadcastUserInfo();
				activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");
								
			}
			else
			{
				activeChar.setDressMeEnabled(true);
				activeChar.broadcastUserInfo();
				activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");			
				
			}
        }
        else
        	playable.sendMessage("Costumes system is currently disabled.");
    }
	
	public int[] getItemIds()
    {
        return ITEM_IDS;
    }

    private static final int ITEM_IDS[] = {
    	Config.SKIN_ITEM_1
    };
}

Outras funções que pretendo adicionar em breve, é um tempo para a troca de costume, limitando algo entre 15 e 30 segundos para uma nova troca.

Estou utilizando a revisão e source disponibilizada pelo @BAN.

Costumes por @RootZerO.

Configuração do DressMe para 2 cliques por @Christian-SDM.

Peço desculpa pelo tópico massivo, mas com uma explicação mais detalhada, facilita a vida de quem for ajudar. 😁

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

22 respostass a esta questão

Posts recomendados

  • 1

Deveria ficar assim:

@Override
public void useItem(Playable playable, ItemInstance item, boolean forceUse)
{
	if(Config.ALLOW_DRESS_ME_SYSTEM)
	{
		if(!(playable instanceof Player))
			return;
		
		Player activeChar = (Player)playable;
            
		if (activeChar.getDressMeData() == null || Config.DRESS_ME_CHESTS.get(Config.SKIN_NAME1) != activeChar.getDressMeData().getChestId())
		{    
			RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
			RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
			RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
			RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
			RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
                
			activeChar.setDressMeEnabled(false);
			activeChar.broadcastUserInfo();
			activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");
		}
		else
		{
			activeChar.setDressMeData(null);
			activeChar.setDressMeEnabled(true);
			activeChar.broadcastUserInfo();
			activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");			
		}
	}
	else
		playable.sendMessage("Costumes system is currently disabled.");
}

 

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


  • 0

Ola bom dia!

bom esse codigo das skins soltado aqui no Fórum não foi criação minha, mais acredito que pra você conseguir isso tera que inverter essa parte! deixando assim e sim tera que fazer teste!

if (activeChar.isDressMeEnabled())
{
	activeChar.setDressMeEnabled(true);
	activeChar.broadcastUserInfo();
	activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");

}
else
{

	activeChar.setDressMeEnabled(false);
	activeChar.broadcastUserInfo();
	activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");

}

uma coisa que reparei nesse sistema e que False em vez de desligar faz ligar o custome!

e True que seria pra ligar Desliga o sistema

Ao fazer essa alteração ocorre o risco de nem ativar e nem desativar a skins mais você tera que fazer o teste.

E sim quando tenta usar outro custome primeiro ele tera que desativar o outro, não gostei mesmo desse sistema.
mais em fim amigo e um dos codigos que todos querem usar-lo hoje em dia.

Se nada acontecer tente colocar

if (activeChar.isDressMeEnabled()) por if (activeChar.isOnline())

Link para o comentário
Compartilhar em outros sites

  • 0

Fala @BAN, beleza?

Agradeço o retorno e informo que realizei as alterações propostas, que não surtiram o efeito desejado.

Alterei o if e else, mas aparentemente só inverteu a lógica, continua desativando o costume mesmo sem ter um ativo ou com algum já ativo.

Também fiz o teste substituindo if (activeChar.isDressMeEnabled()) por if (activeChar.isOnline()), onde apenas exibe a mensagem que o costume foi desativado e não ativa após novos 2 cliques.

Talvez tenha uma pessoa que poderia nos ajudar a ajustar essa lógica. 

@Tayran.JavaDev, poderia nos ajudar?

Link para o comentário
Compartilhar em outros sites

  • 0
2 minutos atrás, Schuster disse:

Fala @BAN, beleza?

Agradeço o retorno e informo que realizei as alterações propostas, que não surtiram o efeito desejado.

Alterei o if e else, mas aparentemente só inverteu a lógica, continua desativando o costume mesmo sem ter um ativo ou com algum já ativo.

Também fiz o teste substituindo if (activeChar.isDressMeEnabled()) por if (activeChar.isOnline()), onde apenas exibe a mensagem que o costume foi desativado e não ativa após novos 2 cliques.

Talvez tenha uma pessoa que poderia nos ajudar a ajustar essa lógica. 

@Tayran.JavaDev, poderia nos ajudar?

Eu to na luta nessas skill skins tbm, negão olhando o codigo assim a inversão seria uma solução, poderia mandar uma print do codigo para verificar como ficou

 

Tmj em By Shaka

Link para o comentário
Compartilhar em outros sites

  • 0

@Ricardo Marques,

O código é o mesmo exposto no inicio do tópico.

package Dev.ItemSkins;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.network.clientpackets.RequestBypassToServer;

/**
 * @author Juvenil Walker
 *
 */
public class Skin1 implements IItemHandler

{
	
	@Override
	public void useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if(Config.ALLOW_DRESS_ME_SYSTEM)
        {
            if(!(playable instanceof Player))
                return;
            Player activeChar = (Player)playable;
            RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
            
            if (activeChar.isDressMeEnabled())
{
	activeChar.setDressMeEnabled(true);
	activeChar.broadcastUserInfo();
	activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");

}
else
{

	activeChar.setDressMeEnabled(false);
	activeChar.broadcastUserInfo();
	activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");

}
        }
        else
        	playable.sendMessage("Costumes system is currently disabled.");
    }
	
	public int[] getItemIds()
    {
        return ITEM_IDS;
    }

    private static final int ITEM_IDS[] = {
    	Config.SKIN_ITEM_1
    };
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

O código usado é esse ?

https://pastebin.pl/view/22ad08d2

O ideal seria trocar todo esse código do Dressme, mas...

Caso seja, você pode tentar fazer o seguinte:

Em todos os itemHandlers de skin:

troque essa linha:

if (activeChar.isDressMeEnabled())

por essa:

if (activeChar.getDressMeData() == null || Config.DRESS_ME_CHESTS.get(Config.SKIN_NAME1) != activeChar.getDressMeData().getChestId())

Lembrar de trocar o "Config.SKIN_NAME1" pela correspondente de cada handler.

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

  • 0
1 hora atrás, KhayrusS disse:

O código usado é esse ?

https://pastebin.pl/view/22ad08d2

O ideal seria trocar todo esse código do Dressme, mas...

Caso seja, você pode tentar fazer o seguinte:

Em todos os itemHandlers de skin:

troque essa linha:


if (activeChar.isDressMeEnabled())

por essa:


if (activeChar.getDressMeData() == null || Config.DRESS_ME_CHESTS.get(Config.SKIN_NAME1) != activeChar.getDressMeData().getChestId())

Lembrar de trocar o "Config.SKIN_NAME1" pela correspondente é cada handler.

parabéns a chamda fico incrivel se o valor for nulo e ele faz isso.

sim o certo e trocar esse sistema estou crindo um diferente com a chamda mais facil de ser usada!

Link para o comentário
Compartilhar em outros sites

  • 0

@KhayrusS,

Efetuei as alterações que você propôs e não funcionou. Os costumes não são ativados ao dar 2 cliques.

Buscando identificar a ativação automática, sem ter utilizado ou com outro já ativo, consegui fazer com que ative diretamente nos primeiros dois cliques, tanto no primeiro uso quanto em um novo uso, alterando no arquivo RequestBypassToServer.java, mudando o if para true e o else para false.

		else if (_command.equals("bp_changedressmestatus"))
		{
			if (player.isDressMeEnabled())
			{
				player.setDressMeEnabled(true);
				player.broadcastUserInfo();
			}
			else
			{
				player.setDressMeEnabled(false);
				player.broadcastUserInfo();
			}
			
			Dressme.sendMainWindow(player);
		}	

Porem, agora não desativa a skin, já tentei diversas mudanças e sem sucesso.

Visto que a lógica deste código não está legal, teria um mod para me indicar?

Link para o comentário
Compartilhar em outros sites

  • 0

Infelizmente não tenho.

Agora que você falou que não deu certo, olhei o que esse trecho de código faz:

RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);

Não sei quem fez, mas esse mod troca a skin antes mesmo de verificar se pode ser ativada ou não.

Se quiser tentar mais uma vez. Faz a mudança que indiquei e mais essa:

pega todo esse código:


    RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
    RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
    RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
    RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
    RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);

e coloca dentro do if

ficando algo assim:

if (activeChar.getDressMeData() == null || Config.DRESS_ME_CHESTS.get(Config.SKIN_NAME1) != activeChar.getDressMeData().getChestId()) {
		RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
		RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
		RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
		RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
		RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
        
		activeChar.setDressMeEnabled(true);
		activeChar.broadcastUserInfo();
		activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");
} 
else
{
	activeChar.setDressMeData(null);
	activeChar.setDressMeEnabled(false);
	activeChar.broadcastUserInfo();
	activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");

}
        

 

Note o "activeChar.setDressMeData(null);" no else, para permitir que após remoção você consiga recolocar a mesma skin

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

  • 0

@KhayrusS,

Realizei as alterações e o item não ativa, apenas exibe a mensagem que foi ativado.

spacer.png

Segue código do item 1 (Hunter).

package Dev.ItemSkins;


import net.sf.l2j.Config;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.network.clientpackets.RequestBypassToServer;

/**
 * @author Juvenil Walker
 *
 */
public class Skin1 implements IItemHandler

{

	
	@Override
	public void useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if(Config.ALLOW_DRESS_ME_SYSTEM)
        {
            if(!(playable instanceof Player))
                return;
            Player activeChar = (Player)playable;
            RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
            RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
            
            if (activeChar.getDressMeData() == null || Config.DRESS_ME_CHESTS.get(Config.SKIN_NAME1) != activeChar.getDressMeData().getChestId()) {
        		RequestBypassToServer.setPart(activeChar, "helmet", Config.SKIN_NAME1);
        		RequestBypassToServer.setPart(activeChar, "chest", Config.SKIN_NAME1);
        		RequestBypassToServer.setPart(activeChar, "legs", Config.SKIN_NAME1);
        		RequestBypassToServer.setPart(activeChar, "gloves", Config.SKIN_NAME1);
        		RequestBypassToServer.setPart(activeChar, "boots", Config.SKIN_NAME1);
                
        		activeChar.setDressMeEnabled(true);
        		activeChar.broadcastUserInfo();
        		activeChar.sendMessage("You have disabled costume " + Config.NAME1 + ".");
        } 
        else
        {
        	activeChar.setDressMeData(null);
        	activeChar.setDressMeEnabled(false);
        	activeChar.broadcastUserInfo();
        	activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");

        }
        }
        else
        	playable.sendMessage("Costumes system is currently disabled.");
    }
	
	public int[] getItemIds()
    {
        return ITEM_IDS;
    }

    private static final int ITEM_IDS[] = {
    	Config.SKIN_ITEM_1
    };
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

@KhayrusS, funcionou da forma que eu desejava! 😁

Muito obrigado pela ajuda e pela resolução do problema. 👊

Segue vídeo com a utilização dos costumes.

Agora, caso ainda deseje me ajudar, gostaria de impor um tempo para utilização de outro costume, evitando que o player fique floodando os costumes.

Exemplo, player utilizou o costume Hunter e na sequencia já mudou para o Ninja, da mesma forma que fiz no vídeo. Seria interessante se houvesse uma proteção sinalizando ao player que só é possível utilizar um novo costume em um determinado tempo, seja ele configurado direto no código fonte ou por config.

Seria possível isso? 

Novamente te agradeço pelo empenho!

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

  • 0
53 minutos atrás, Schuster disse:

@KhayrusS, funcionou da forma que eu desejava! 😁

Muito obrigado pela ajuda e pela resolução do problema. 👊

Segue vídeo com a utilização dos costumes.

Agora, caso ainda deseje me ajudar, gostaria de impor um tempo para utilização de outro costume, evitando que o player fique floodando os costumes.

Exemplo, player utilizou o costume Hunter e na sequencia já mudou para o Ninja, da mesma forma que fiz no vídeo. Seria interessante se houvesse uma proteção sinalizando ao player que só é possível utilizar um novo costume em um determinado tempo, seja ele configurado direto no código fonte ou por config.

Seria possível isso? 

Novamente te agradeço pelo empenho!

toppppppppppppppppp

Tmj em By Shaka

Link para o comentário
Compartilhar em outros sites

  • 0
Em 30/04/2020 at 01:22, Schuster disse:

Exemplo, player utilizou o costume Hunter e na sequencia já mudou para o Ninja, da mesma forma que fiz no vídeo. Seria interessante se houvesse uma proteção sinalizando ao player que só é possível utilizar um novo costume em um determinado tempo, seja ele configurado direto no código fonte ou por config.

Seria possível isso? 

 

Sim é possível, em Player.java é necessário criar um proprieadade para salvar o momento em que o dressMe foi utilizado:

 

private long dressMeLastChange;

public void setDressMeLastChange(long timestamp) {
	dressMeLastChange = timestamp;
}

public long getDressMeLastChange() {
	return dressMeLastChange;
}
	

Nos handlers depois de :

Player activeChar = (Player)playable;

adiciona:

if(System.currentTimeMillis() - activeChar.getDressMeLastChange() < Config.DRESSME_MIN_TIME) {
   activeChar.sendMessage("You can't change too fast");
   return false;
}
                                                                                           

depois de:

activeChar.sendMessage("You have activated costume " + Config.NAME1 + ".");
		

adiciona:

activeChar.setDressMeLastChange(System.currentTimeMillis());

 

A parte da configuração fica por sua conta, não conheço o código da Acis

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

  • 0

Top esse mod eu tenho ele mais eu queria alterar pra quando clicar no item ele ir para o inventory no lugar da mask ou sei lá pq se ele ficar assim ele gera tipo um bug exemplo clica na skin pra usar e da trade ne outro personagem e passa a skin fica no personagem que e estava ! ja tentei mecher no xml/ itens mais quando eu altero la para usar no acessorio quando clicar a skin ja buga não aparece á aparencia 

Link para o comentário
Compartilhar em outros sites

  • 0
On 4/30/2020 at 7:22 AM, Schuster said:

@KhayrusS, funcionou da forma que eu desejava! 😁

Muito obrigado pela ajuda e pela resolução do problema. 👊

Segue vídeo com a utilização dos costumes.

Agora, caso ainda deseje me ajudar, gostaria de impor um tempo para utilização de outro costume, evitando que o player fique floodando os costumes.

Exemplo, player utilizou o costume Hunter e na sequencia já mudou para o Ninja, da mesma forma que fiz no vídeo. Seria interessante se houvesse uma proteção sinalizando ao player que só é possível utilizar um novo costume em um determinado tempo, seja ele configurado direto no código fonte ou por config.

Seria possível isso? 

Novamente te agradeço pelo empenho!

where i can found the full code ?

3467403207.png

Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se do de vocês, mais quando utilizava a l2jdrem vip, esse sistema de skin tipo skill se você usa-se ele, e passava por trade o item, a aparência ficava. Presenciei isso com server online. Falta elabora uma restrição. Porisso alguns server russo usam ao invés desse, eles colocaram como um exemplo uma tattoo. A lucera se nao me engano o sistema é assim.

        <set template ="true"/>
        <set temp_hair="7683"/>
        <set temp_face="6394"/>
        <set temp_chest="6373"/>
        <set temp_legs="6374"/>
        <set temp_gloves="6375"/>
        <set temp_feet="6376"/>

👀🙏🦮🚗🏃‍♂️☀️🎧♐📳⚽🚲🏓☕🎣🚭🏳️

Link para o comentário
Compartilhar em outros sites

  • 0
Em 04/07/2020 at 19:52, junin00 disse:

Não sei se do de vocês, mais quando utilizava a l2jdrem vip, esse sistema de skin tipo skill se você usa-se ele, e passava por trade o item, a aparência ficava. Presenciei isso com server online. Falta elabora uma restrição. Porisso alguns server russo usam ao invés desse, eles colocaram como um exemplo uma tattoo. A lucera se nao me engano o sistema é assim.

        <set template ="true"/>
        <set temp_hair="7683"/>
        <set temp_face="6394"/>
        <set temp_chest="6373"/>
        <set temp_legs="6374"/>
        <set temp_gloves="6375"/>
        <set temp_feet="6376"/>

Basta nas configurações do item você procurar a linha que fala sobre não passar em trade!!

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 esta pergunta...

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





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