Criando plugins no Minecraft usando Typescript
Published: 2024-02-20 12:56:30

Neste post vamos criar o plugin "Porcos Explosivos" para o Minecraft utilizando o Typescript.

## O que são plugins?
Plugins são modificações do servidor Minecraft que permitem alterar o gameplay utilizando recursos do próprio jogo.

A principal diferença entre plugins e mods é que os plugins não requerem que o jogador instale nada em sua máquina. É necessário apenas logar no servidor que o plugin for instalado. Plugins utilizam recursos do próprio jogo para criar novas experiências pros jogadores.

Já os mods permitem desenvolvedores criarem novos recursos como mobs, blocos e etc. Estes requerem instalação.

## Instalação do CustomRealms
CustomRealms é um framework que nos permite criar plugins de Minecraft na linguagem Javascript/Typescript.

Para instalar é necessário ter o NodeJS na máquina.

Para instalá-lo execute o seguinte comando:

```bash 
$ npm install -g @customrealms/cli
```

## Iniciando o projeto

Crie uma pasta vazia com o nome do plugin desejado.

```bash 
$ mkdir explosive-pigs
```

Navegue até a pasta:

```bash 
$ cd explosive-pigs
```

E agora inicie o projeto.

```bash 
$ npm run crx init
```
O comando gerará o projeto com os seguintes arquivos:

```
/explosive-pigs
├── package.json
├── src
│   └── main.ts
├── tsconfig.json
└── webpack.config.js
```

## Escrevendo nosso primeiro plugin
O primeiro passo será definir pra que servirá o nosso plugin. Como o nome sugere, iremos criar porcos explosivos. Quando um usuário bater em um porco, ele irá explodir.

O evento que precisamos é o `EntityDamageByEntityEvent`. Ele é disparado quando uma entidade (qualquer mob) sofre dano por outra entidade. 

Para isso, vamos alterar o código do arquivo `src/main.ts`

```typescript
import { EntityDamageByEntityEvent, ServerEvents } from '@customrealms/core';

ServerEvents.register(EntityDamageByEntityEvent, (event) => {
    
});
```

Continuando com a lógica, agora queremos verificar se a entidade que está sofrendo dano é um porco, e a entidade que está causando dano é um player.

Altere o código para adicionar esta lógica:

```typescript
import { EntityDamageByEntityEvent, ServerEvents } from '@customrealms/core';

ServerEvents.register(EntityDamageByEntityEvent, (event) => {
    const entityType = event.getEntityType();
    const damagerType = event.getDamager()?.getType();

    if (entityType === EntityType.PIG && damagerType === EntityType.PLAYER) {
  // caso ambas condições sejam verdadeiras, iremos criar uma explosão
}
});
```

Seguindo com a última parte da nossa lógica, vamos adicionar a explosão na localização do porco.

```typescript
import { EntityDamageByEntityEvent, ServerEvents } from '@customrealms/core';

ServerEvents.register(EntityDamageByEntityEvent, (event) => {
    const entityType = event.getEntityType();
    const damagerType = event.getDamager()?.getType();

    if (entityType === EntityType.PIG && damagerType === EntityType.PLAYER) {
    const pig = event.getEntity();
        
        pig
            .getWorld()
            .createExplosion(
                pig.getLocation(),
                20
            )
    }
});
```

Agora, com a lógica concluída, vamos fazer o build do plugin.

Execute o comando:

```bash
$ npm run build:jar
```
Aguarde uns instantes. Será gerado o arquivo final do plugin no diretório `/dist`.

## Inicializando o servidor e instalando o plugin

Para instalar o plugin, inicialize o servidor Spigot ou Bukkit. [(Guia oficial do Spigot)](https://www.spigotmc.org/wiki/spigot-installation/).

Copie o arquivo `/dist/explosive-pigs.jar` gerado pelo passo anterior no diretório `/plugins` do servidor Spigot ou Bukkit.

Execute o comando `/reload` no terminal do servidor.

Pronto!

Agora é só logar no servidor no endereço `localhost:25565` e jogar!


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8icqposc3tl2f0clnmqr.gif)