A Seal Draw é uma API para Bukkit, BungeeCord e Sponge que permite a criação de Pixel Arts por meio do chat do minecraft.
Ela facilita para que os desenvolvedores possam implementar em seus plugins vários sistemas utilizando Pixel Arts que os próprios jogadores possam fazer dentro do jogo por meio do chat.
Um exemplo de possível sistema utilizando a API, é a criação de emblemas de clãs personalizados.
Atalhos para certas seções desse documento.
Alguns requisitos são necessários para que seja possível utilizar a Seal Draw API.
Esses requisitos se provaram necessários para evitar que o jogador que está a editar uma pixel art receba mensagens de chat durante o processo, o que faria com que o seu desenho se movesse para cima, atrapalhando a edição.
Aqui está a lista do que é necessário para cada ‘software’:
- Nenhuma dependência adicional é necessária.
- Protocolize [download]
- É necessário também adicionar o Protocolize como dependência no plugin que você está criando. O motivo disso é para fazê-lo carregar antes do seu plugin.
- Para isso é só adicionar a linha
depends: ["protocolize-plugin"]
no seubungee.yml
.
- Nenhuma dependência adicional é necessária.
Ainda não existe nenhuma release da Seal Draw API disponível (mesmo que esse README diga que sim algumas linhas para baixo). Caso queira testá-la você deverá fazê-lo compilando você mesmo o source-code com ./gradlew clean build
.
Para começar a usar a API, você precisa primeiro adicioná-la no seu projeto. Aqui estão as dependências para Maven e Gradle:
Maven
<repository>
<id>focamacho-repo</id>
<name>Focamacho Maven Repository</name>
<url>https://repo.focamacho.com/repository/releases/</url>
</repository>
<dependency>
<groupId>com.focamacho</groupId>
<artifactId>sealdrawapi</artifactId>
<version>VERSAO</version>
</dependency>
Gradle
repositories {
maven { url = 'https://repo.focamacho.com/repository/releases/' }
}
dependencies {
compile 'com.focamacho:sealdrawapi:VERSAO'
}
Obs: Troque a palavra VERSAO
pela versão da API desejada. Verifique a última versão disponível nas releases do GitHub.
Para usar a Seal Draw você precisa primeiro criar uma instância da classe SealDrawAPI
.
Para criar a instância da API você precisará fornecer a instância do seu plugin no construtor da classe. Não crie mais de uma instância da API! Crie ela somente uma vez e use essa instância o tempo todo.
Exemplo:
import com.focamacho.sealdrawapi.SealDrawAPI;
public class ExamplePlugin extends JavaPlugin {
//Instância da SealDrawAPI
public static SealDrawAPI api;
@Override
public void onEnable() {
api = new SealDrawAPI(this);
}
}
Com a instância da API você terá acesso a criação de novas "telas de desenhos", as quais eu me referencio como "editor" nos docs disponíveis nas classes do projeto.
Para criar uma tela de desenhos é só usar o método SealDrawAPI#createPaint
, passando junto dela o desenho que você deseja editar.
Para criar um desenho é só criar um objeto da classe Drawing
, passando as informações de número de linhas e colunas do desenho.
ATENÇÃO! NÃO ABUSE DO TAMANHO.
Ao criar desenhos muito grandes você acaba excedendo o limite permitido, fazendo com que, quando um jogador receba a mensagem, ele seja desconectado do servidor por causa do tamanho do pacote que ele recebeu.
É recomendado que você estabeleça um limite de até 16x16 para seus desenhos.
Exemplo:
//Criar o desenho, de tamanho 16x16
Drawing desenho = new Drawing(16, 16);
//Criar uma tela de edição para esse desenho.
Paint paint = api.createPaint(desenho);
//Abre essa tela para um jogador
paint.openPaint(player);
Com um Drawing e um objeto da classe Paint, você já está pronto para criar seus desenhos.
Confira a documentação disponível nessas duas classes para poder se aprofundar mais.
As vezes é necessário definir alguns botões adicionais para os usuários. Por padrão, a Seal Draw API já define os seguintes botões:
- cancel
- confirm
- clean
- color
Você pode editá-los para que exibam o texto e efetue as ações que você quiser. Exemplo:
paint.getButton("confirm")
.setText("&aConfirmar")
.setHover("&aClique para confirmar o desenho.")
.setAction((player, paint) -> {
//Sempre se lembre de fechar o editor ao confirmar.
paint.closePaint(player);
//Aqui você pode definir o que quiser
});
O botão "color" é um caso a parte. Você somente pode editar o seu texto e não suas ações, isso porque ele possui uma função muito específica que é selecionar a cor que o usuário está utilizando no momento.
Para modificar seu texto é usado o método Paint#setColorSelectorText
.
Você também pode criar novos botões pelo método Paint#setButton
.
Todos os botões podem ser definido nas mensagem antes e após o desenho no chat, por meio de seus respectivos placeholders. Exemplo: %cancel%
, %confirm%
, %clean%
.
Você provavelmente vai querer salvar os desenhos que os seus jogadores fizerem. Para isso, você pode convertê-los em uma String, e quando for necessário poderá carregar o desenho novamente a partir dessa String.
Exemplo de como fazer isso quando o jogador clica no botão de confirmar:
//Criar uma tela de edição
Paint paint = api.createPaint(new Drawing(16, 16));
paint.getButton("confirm")
.setAction((player, paint) -> {
//Sempre se lembre de fechar o editor ao confirmar.
paint.closePaint(player);
//Converte o desenho em uma String, você pode salvar esse valor
String desenho = paint.getDrawing().toString();
});
E para gerar um desenho a partir da String é só usar:
Drawing drawing = Drawing.fromString(desenho);
Aqui está um exemplo prático de como a API pode ser usada para criar um sistema de emblemas para Clãs.
//Cria um novo editor e desenho
Paint paint = api.createPaint(new Drawing(8, 8));
//Define uma identação de 28 espaços antes do desenho.
//Isso é feito para centralizá-lo.
paint.setSpaces(28);
//Define as mensagens que são exibidas antes do desenho.
paint.setBeforeMessages(false,
" &d&lBrasão do Clã",
"",
" &aChegou a hora de criar o brasão do seu clã.",
" &aPara isso é só clicar nos quadradinhos abaixo para",
" &acolori-los da forma que você quiser!",
"",
" &eCor selecionada: &%selected%█",
" %colorselector%",
""
);
//Define as mensagens que são exibidas após o desenho.
paint.setAfterMessages(false,
" %undo% %redo%",
" %cancel% %clean% %confirm%",
""
);
//Define a ação ao clicar no botão confirmar.
paint.getButton("confirm").setAction((player, editor) -> {
//Fecha o desenho para o jogador. Nunca esqueça desse detalhe.
editor.closePaint(player);
//Aqui você pode definir todo o resto para criar o clã.
});
//Define a ação ao clicar no botão cancelar.
paint.getButton("cancel").setAction((player, editor) -> {
//Fecha o desenho para o jogador. Nunca esqueça desse detalhe.
editor.closePaint(player);
//Aqui você pode definir todo o resto para cancelar a criação do clã.
});
Esse é o resultado do código acima: