
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Dependências: · Carregador: Bukkit, Spigot, Paper, Purpur, Folia · Versão do Minecraft: 1.16 - 1.21.11+ · Versão do mod: 23.2 Os servidores…
Dependências: · Carregador: Bukkit, Spigot, Paper, Purpur, Folia · Versão do Minecraft: 1.16 - 1.21.11+ · Versão do mod: 23.2 Os servidores multijogador de Minecraft precisam de uma auditoria detalhada das ações dos jog
Dependências:
· Carregador: Bukkit, Spigot, Paper, Purpur, Folia
· Versão do Minecraft: 1.16 - 1.21.11+
· Versão do mod: 23.2
Os servidores multijogador de Minecraft precisam de uma auditoria detalhada das ações dos jogadores para evitar alterações não autorizadas do mapa e o roubo de itens de valor do jogo. O núcleo vanilla do servidor não registra o histórico de edição do terreno nem a movimentação de itens nos contêineres, por isso os administradores não têm como identificar os infratores ou desfazer as destruições sem restaurar completamente os arquivos do mapa a partir de cópias de segurança. O plugin de servidor CoreProtect registra todos os eventos de alteração do mundo, cria índices detalhados das ações dos usuários e executa reversões (rollbacks) pontuais do espaço com base em consultas paramétricas complexas. A ferramenta funciona em modo assíncrono, gravando as transações em uma fila para proteger a thread principal do servidor contra atrasos.
1. Bancos de dados e arquitetura assíncrona de registro
O plugin CoreProtect intercepta os eventos do servidor por meio dos manipuladores de eventos da API Bukkit/Paper. Para evitar o bloqueio da thread principal do servidor (Server Thread) durante o processamento de milhares de registros por segundo, o plugin utiliza um modelo de registro assíncrono. Os eventos (destruição de um bloco, alteração do inventário de um baú, uso de um comando) são primeiro colocados em um buffer dinâmico interno DataQueue. Uma thread consumidora em segundo plano (Consumer Thread) lê as transações do buffer e as grava no banco de dados por meio de transações em lote (Batch processing), o que reduz a carga sobre o dispositivo de armazenamento.
O plugin oferece suporte ao trabalho com dois sistemas de gerenciamento de banco de dados (SGBD):
1. SQLite (local por padrão): Todas as informações são gravadas no arquivo database.db no diretório do plugin. O SQLite não requer a instalação de serviços de terceiros, o que o torna conveniente para pequenos servidores locais com baixo nível de transações.
2. MySQL / MariaDB (servidor externo): Utiliza uma conexão de rede com um servidor de banco de dados separado. Esta solução é o padrão industrial para grandes servidores e redes de servidores com elevado número de jogadores online (a partir de 50 jogadores). O MySQL garante alta velocidade de execução de consultas indexadas e elimina a fragmentação do armazenamento local.
Esquema das tabelas do banco de dados
O CoreProtect cria um conjunto de tabelas relacionais para otimizar o armazenamento de dados. Em vez de salvar cadeias de texto completas para cada registro, o plugin utiliza tabelas-dicionário para os nomes únicos de jogadores, mundos, tipos de blocos e entidades.
Tabela | Finalidade | Campos principais |
|---|---|---|
| Dicionário de nomes de usuário |
|
| Dicionário de mundos de jogo |
|
| Registro de alterações de blocos no mundo |
|
| Transações de itens em contêineres |
|
| Log de sessões de autenticação (entrada/saída) |
|
| Conteúdo das placas de texto |
|
| Registros de morte e surgimento de criaturas |
|
Todas as coordenadas x, y, z são indexadas em conjunto com o identificador do mundo wid para garantir uma busca instantânea de transações dentro de um raio determinado.
2. Sintaxe de comandos e parâmetros de filtragem
A interação com o banco de dados do CoreProtect ocorre por meio de comandos de texto. As operações principais são: inspeção, busca, reversão e cancelamento da reversão.
Modo inspetor /co inspect ou /co i)
O comando alterna o cliente para o modo de auditoria local. Após a ativação, o jogador pode interagir com o mundo para obter os logs:
· O clique esquerdo em um bloco existente mostra no chat o nick de quem o colocou, a data, a hora e as coordenadas.
· O clique direito em uma superfície vazia (ou bloco) mostra o histórico dos blocos que antes ocupavam aquele espaço ou que foram removidos.
· O clique direito em um contêiner (baú, fornalha, barril, shulker) mostra o log da movimentação de itens.
Parâmetros de filtragem das consultas /co rollback, /co restore, /co lookup)
Para a seleção de dados, o plugin utiliza parâmetros combinados no formato parâmetro:valor. Os parâmetros são separados por espaços:
1. Usuário u:<nome>): Indica o jogador a ser verificado. É possível indicar vários nomes separados por vírgula (por exemplo, u:Stevie,Alex). Para reverter eventos naturais, são usados identificadores técnicos:
· u:#fire – propagação do fogo.
· u:#lava – derramamento de lava.
· u:#water – derramamento de água.
· u:#creeper – explosão de um creeper.
· u:#tnt – explosão de dinamite.
· u:#enderman – deslocamento de blocos por um enderman.
2. Tempo t:<valor>): Intervalo de tempo para a análise. Suporta as unidades de medida: s (segundos), m (minutos), h (horas), d (dias), w (semanas), y (anos). É permitido combinar unidades, por exemplo: t:2w4d6h (2 semanas, 4 dias e 6 horas).
3. Raio r:<número>): Raio da zona de busca em blocos ao redor do executor do comando. Também suporta valores especiais:
· r:#global – busca em todo o banco de dados (dentro de todos os chunks carregados).
· r:#world – busca dentro do mundo de jogo atual.
· r:#chunk – busca no chunk atual do jogador.
· r:#selection (ou r:#we) – limita a busca aos limites da grade de seleção atual do WorldEdit.
4. Ação a:<tipo>): Filtra os registros de acordo com o tipo de operação:
· a:block – colocação e destruição de blocos.
· a:+block – apenas colocação de blocos.
· a:-block – apenas destruição de blocos.
· a:container – transações de inventário.
· a:+container – adição de itens a um contêiner.
· a:-container – retirada de itens de um contêiner.
· a:kill – morte de animais e monstros.
· a:spawn – surgimento de entidades.
· a:chat – mensagens no chat.
· a:command – comandos inseridos.
· a:session – autenticação de jogadores.
5. Blocos b:<material>): Limita a busca aos materiais indicados (por exemplo, b:stone,oak_planks).
6. Exclusão e:<material>): Exclui materiais do processamento (por exemplo, e:tnt).
Pré-visualização da reversão e cancelamento de operações
Para minimizar os erros durante as reversões em larga escala, o CoreProtect oferece suporte a um sistema de simulação visual:
1. A execução do comando de reversão com a flag #preview (por exemplo, /co rollback u:Griefer t:2h r:20 #preview) não altera os arquivos do mapa. Em vez disso, o cliente recebe os pacotes de alteração de blocos na sessão de renderização atual. O administrador vê o mundo no estado "após a reversão", enquanto para os demais jogadores os blocos permanecem inalterados.
#preview
/co apply
2. Para aplicar o resultado, utiliza-se o comando /co apply.
3. Para cancelar a pré-visualização, utiliza-se o comando /co cancel.
4. Para desfazer uma reversão física já executada, aplica-se o comando /co undo, que retorna as coordenadas ao estado anterior à execução de /co rollback.
3. Descrição completa do arquivo de configuração config.yml
O arquivo de configuração gerencia os limites, os parâmetros de registro e a conexão com os bancos de dados.
Bloco de parâmetros gerais (General Settings)
· verbose: true – exibe no console um relatório detalhado sobre cada coordenada modificada durante a execução das reversões. Se definido como false é exibido apenas o número total de blocos alterados.
· check-updates: true – verifica na inicialização se há novas versões do plugin nos servidores do desenvolvedor.
· api-enabled: true – permite que plugins de terceiros interajam com os dados do CoreProtect.
· default-radius: 10 – raio de reversão padrão se esse parâmetro não for indicado no comando.
· max-radius: 250 – limita o raio máximo para um único comando. O valor 0 remove a limitação.
Bloco de parâmetros de registro (Logging Settings)
Esses parâmetros determinam quais eventos exatamente são gravados no banco de dados. Desativar os logs desnecessários ajuda a reduzir o tamanho do banco de dados:
· block-place: true / block-break: true – registro da colocação e destruição comuns de blocos pelos jogadores.
· natural-break: true – registro da queda de blocos em consequência de deslocamentos ou da destruição de blocos de suporte (por exemplo, quebrar o bloco no qual uma tocha estava apoiada).
· block-movement: true – registro da queda gravitacional de areia, cascalho ou concreto.
· pistons: true – registro do deslocamento de blocos por meio de pistões.
· block-burn: true – registro da destruição de blocos pelo fogo.
· block-ignite: true – registro do incêndio de blocos pelos jogadores por meio de isqueiro ou bolas de fogo.
· explosions: true – registro de explosões de dinamite, creepers, camas no Nether ou cristais do End.
· entity-kills: true – registro da morte de aldeões, animais, monstros e suportes de armadura.
· player-chat: true / player-command: true – registro das mensagens no chat e dos comandos de console.
· player-session: true – registro do horário de entrada e saída dos jogadores do servidor.
· container-transactions: true – registro das operações de movimentação de itens em baús, fornalhas, funis e shulkers.
Bloco do banco de dados (Database Settings)
· use-mysql: false – seletor do tipo de banco de dados. Se definido como true o plugin se conecta a um SGBD MySQL externo.
· table-prefix: co_ – prefixo para os nomes das tabelas SQL.
· mysql-host: localhost – endereço IP ou nome de domínio do servidor de banco de dados MySQL.
· mysql-port: 3306 – porta de rede para a conexão.
· mysql-database: minecraft – nome do banco de dados de destino.
· mysql-username: root – nome de usuário do banco de dados.
· mysql-password: password – senha do usuário.
· mysql-ssl: false – ativa a criptografia SSL da conexão com o servidor de banco de dados.
4. API para desenvolvedores de plugins
O CoreProtect oferece aos desenvolvedores acesso ao seu banco de dados por meio da classe CoreProtectAPI. Isso permite que outros plugins (por exemplo, WorldEdit ou sistemas de proteção) registrem suas próprias alterações ou realizem uma busca automática no histórico.
Inicialização da API
Para conectar-se à API, utiliza-se o método de inicialização:
import net.coreprotect.CoreProtect; |
Principais métodos da interface API
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – registra a colocação de um bloco no banco de dados em nome do usuário indicado.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – registra a destruição de um bloco.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – registra a operação de adição (true) ou retirada (false) de itens de um contêiner.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – realiza uma busca de acordo com os filtros indicados e retorna um array de resultados.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – inicia uma reversão assíncrona das alterações no mundo.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – inicia uma restauração assíncrona das alterações.
· boolean hasPlaced(String user, Block block, int time, int offset) – verifica se o jogador indicado colocou este bloco dentro de um determinado tempo.
· boolean hasRemoved(String user, Block block, int time, int offset) – verifica se o jogador indicado destruiu este bloco.
5. Desempenho, compatibilidade e manutenção
Ao trabalhar com o CoreProtect em servidores com elevado número de jogadores online, os administradores levam em conta as particularidades da interação com as arquiteturas de servidor modernas:
· Suporte ao Folia: O núcleo de servidor Folia utiliza um agendamento multithread por regiões (Regionized multithreading), que exige dos plugins uma rigorosa segurança de threads ao trabalhar com o mundo. O CoreProtect está adaptado para funcionar no Folia: a execução das operações /co rollback e /co restore ocorre por meio do agendador de regiões (Region Scheduler), o que previne conflitos de acesso aos chunks e erros críticos do tipo ConcurrentModificationException.
· Clustering MultiPaper: Em servidores do tipo MultiPaper, o CoreProtect é configurado para utilizar um único banco de dados MySQL externo. Isso ajuda a sincronizar o histórico de ações dos jogadores nos diferentes nós do cluster.
· Limpeza do banco de dados (Purge): O banco de dados local SQLite com o tempo se fragmenta e cresce, retardando a execução dos comandos. O comando /co purge t:30d remove os registros com mais de 30 dias. Após a limpeza do banco de dados SQLite, o arquivo database.db não diminui de tamanho automaticamente, pois o SGBD SQLite mantém as páginas livres para registros futuros. Para reduzir fisicamente o arquivo no disco, é necessário executar o comando VACUUM por meio do console do banco de dados ou parar o servidor e realizar a compressão por meio de utilitários de terceiros. O uso do MySQL elimina esse problema, pois o SGBD MySQL libera de forma mais eficiente o espaço em disco não utilizado.
Conclusão
O CoreProtect é o padrão para os sistemas de registro e restauração nos servidores de Minecraft Java Edition. Diferentemente de alternativas como LogBlock (que suporta apenas o trabalho com MySQL e se limita ao registro de blocos) ou Prism (que possui uma estrutura de configuração mais complexa), o CoreProtect oferece um funcionamento totalmente autônomo com SQLite, um rastreamento detalhado do conteúdo dos contêineres e, além disso, um sistema único de pré-visualização de reversões #preview. A única limitação técnica do plugin é a carga significativa sobre o dispositivo de armazenamento durante a limpeza de grandes bancos de dados locais SQLite, por isso recomenda-se aos grandes projetos utilizar SGBD MySQL dedicados em discos NVMe rápidos. O plugin é adequado tanto para pequenos servidores privados entre amigos quanto para projetos de grande escala com centenas de jogadores ativos.
Instalação
Uma instalação típica leva cerca de 5 minutos. O fluxo é o mesmo; só mudam o loader e o build correspondente.
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.








