DK Kits
What it is: A powerful plugin to create, edit, and give kits via GUI, with per-kit permissions, per-player cooldowns, pagination, hidden kits, and immediate cooldown support. Fully compatible with Minecraft 1.8.8 to 1.21+ (Paper, Spigot, and Folia).
How it works
Creation Wizard
- Set name via chat
- Toggle permission requirement
- Set permission node (if needed)
- Capture items from your inventory
- Confirm creation
Editing
- Rename kit (with conflict checking)
- Toggle permission and set node
- Edit items via GUI
- Set cooldown in seconds
- Toggle Immediate Cooldown (players must wait before first claim)
- Toggle Hidden Kit (doesn't appear in
/kitGUI) - Set custom display name with color codes
- Set custom display item
Claiming
- Players open the GUI with
/kitor/kit <name> - Permission (if enabled) and cooldown are enforced
- Hidden kits only accessible via command or admin give
- Paginated interface for many kits
Commands
Player Commands
/kit- Opens the kit list GUI (paginated)/kit <name>- Claims a specific kit by name
Admin Commands
/dkkit create- Starts the kit creation wizard/dkkit list- Lists all kits (requires admin permission)/dkkit delete <name>- Deletes a kit (requires admin permission)/dkkit edit- Opens selection GUI to choose a kit to edit/dkkit edit <name>- Opens the editor for the specified kit/dkkit give <player> <kit>- Gives a kit to a player (bypasses cooldown and permissions)/dkkit menu- Opens position configuration GUI for kits
Permissions
Admin Permission
dkkits.admin (default: op)
- Allows
/dkkit list,/dkkit delete,/dkkit edit,/dkkit give,/dkkit menu - By default, also allows
/dkkit create(configurable) - Can see and use hidden kits
Per-kit Permission (optional)
Each kit can have a custom node, e.g. dkkits.kit.vip
- If the kit's permission toggle is ON, players must have this node to claim the kit
- Works with both GUI and command claiming
Configuration (config.yml)
# Language (pt_br or en)
language: en
# Admin permission node
admin-permission: dkkits.admin
# Allow non-admin players to create kits
# WARNING: Keep false to prevent abuse
allow-player-create: false
# Enable debug logs
debug: false
# GUI Configuration
gui:
# Create button (anvil) position (0-53)
create-button-slot: 53
# Kits per page (max 45 recommended)
kits-per-page: 45
# Previous page button position
previous-page-slot: 48
# Next page button position
next-page-slot: 50 All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
|
R
1.26
|
9h ago | 1 | |||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 |
api-version: ‘26.1’: older servers reject plugins that declare a newer API. The reported Folia implements 1.21.11. This corresponds to the behavior documented by PaperMC.## 🔒 Segurança
- Corrigido exploit crítico**: Jogadores sem permissão
dkkits.adminconseguiam criar kits infinitos clicando na bigorna no/kit - Bigorna de criar kit agora só aparece para quem tem permissão
## ✨ Novas Funcionalidades
### 1. Sistema de Páginas no
/kit- Menu de kits agora suporta paginação automática
- Configurável no
config.yml: gui.kits-per-page- Quantos kits por página (padrão: 45)gui.previous-page-slot- Posição do botão "Página Anterior" (padrão: 48)gui.next-page-slot- Posição do botão "Próxima Página" (padrão: 50)- Título mostra número da página: "Kits (1)", "Kits (2)", etc.
### 2. Bigorna Configurável
- Posição da bigorna (botão criar kit) agora é configurável
gui.create-button-slotnoconfig.yml(padrão: 53)- Bigorna só aparece para quem tem permissão de criar kits
### 3. Cooldown Imediato (First Use Delay)
- Nova opção no editor de kits (slot 23)
- Quando ativado, jogador precisa esperar o cooldown ANTES de pegar o kit pela primeira vez
- Exemplo: Kit com 3600s e cooldown imediato = jogador espera 1 hora antes de pegar pela primeira vez
- Perfeito para kits diários/semanais
- Ícone: Esmeralda (ativado) / Redstone (desativado)
### 4. Kits Ocultos/Privados
- Nova opção no editor de kits (slot 25)
- Kits ocultos NÃO aparecem no
/kit(GUI) - Apenas admins podem dar com
/dkkit give - Jogadores com permissão podem pegar via
/kit <nome> - Ideal para kits VIP que você não quer mostrar publicamente
- Ícone: Olho de Ender (oculto) / Pérola de Ender (visível)
### 5. Comando
/kit <nome>- Agora
/kitsem argumentos abre a GUI /kit vippega o kit "vip" diretamente- Funciona com cooldown, permissões e kits ocultos
- Cooldown imediato também funciona via comando
### 6. Editor Expandido
- GUI do editor agora tem 36 slots (4 linhas) em vez de 27
- Novos botões:
- Slot 23**: Cooldown Imediato (toggle)
- Slot 25**: Kit Oculto (toggle)
- Todos os botões antigos mantidos
## 🐛 Correções de Bugs
- Corrigido: Itens da GUI do editor ficavam "pegáveis" após clicar em qualquer botão
- Corrigido: Listeners de GUI acumulavam causando conflitos
- Corrigido: KitItemsEditorGUI não cancelava eventos corretamente
- Melhorado: Sistema de registro/desregistro de listeners
## 🌍 Internacionalização
- Todos os novos textos adicionados aos arquivos de mensagens
- Suporte completo para português e inglês
- Novas chaves:
editor.first-use-delaye variaçõeseditor.hiddene variações- Todas configuráveis em
messages_pt_br.ymlemessages_en.yml
## ⚙️ Configurações Novas
``
yaml
gui:
# Posição do botão de criar kit (bigorna)
create-button-slot: 53
# Quantos kits por página
kits-per-page: 45
# Posição do botão de página anterior
previous-page-slot: 48
# Posição do botão de próxima página
next-page-slot: 50
`
## 📝 Como Usar as Novas Funcionalidades
- Criar kit VIP oculto com cooldown imediato:**
1. /dkkit create vip
2. Configure nome, permissão, itens
3. /dkkit edit vip
4. Clique no relógio → 86400 (24 horas)
5. Clique na Esmeralda/Redstone (slot 23) → Ativa cooldown imediato
6. Clique no Olho de Ender (slot 25) → Ativa kit oculto
7. Pronto! Kit não aparece no /kit, mas jogadores com permissão podem pegar com /kit vip após esperar 24h
- Dar kit oculto:**
`
/dkkit give <jogador> vip
``### Novo Comando:
/dkkit giveAdicionado o comando
/dkkit give <jogador> <kit> (ou /dkkit dar <jogador> <kit>) que permite aos administradores dar kits diretamente para jogadores!- Funcionalidades:**
- ✅ Dá qualquer kit para qualquer jogador online
- ✅ Verifica automaticamente se o jogador tem espaço no inventário
- ✅ Se não couber tudo, dropa os itens extras no chão
- ✅ Mensagens de confirmação tanto para quem deu quanto para quem recebeu
- ✅ Suporte completo ao **PlaceholderAPI** - você pode usar placeholders no nome do jogador!
- Exemplos de uso:**
/dkkit give Steve starter
/dkkit dar Alex vip
/dkkit give %player_name% iniciante
/dkkit give %vault_rank% premium
`
- Integração com PlaceholderAPI:**
O comando agora suporta placeholders do PlaceholderAPI no argumento do jogador. Isso significa que você pode usar este comando em outros plugins (como sistemas de recompensa, quests, etc.) e usar placeholders para definir dinamicamente qual jogador vai receber o kit!
- Permissão necessária:**
dkkits.admin` (padrão: op)- Mensagens de erro:**
- Avisa se o jogador não está online
- Avisa se o kit não existe
- Avisa se o jogador não tem espaço no inventário
Problema: Jogadores sem permissão dkkits.admin conseguiam clicar na bigorna (ANVIL) na interface /kit e criar kits infinitamente, permitindo abuso do sistema.
Causa: No KitListGUI.java, a verificação de permissão não estava sendo feita quando o jogador clicava na bigorna.
O plugin DKKits foi completamente refatorado para funcionar em todas as versões do Minecraft de 1.8.8 até 1.21+, incluindo suporte total para Paper e Folia. As principais mudanças incluem:
- ✅ Compatibilidade de materiais entre versões
- ✅ Sistema de detecção de GUI por estrutura (fallback para títulos null)
- ✅ Correção de bugs de duplicação de kits
- ✅ Implementação completa do scheduler do Folia
- ✅ Sistema de debug configurável
- ✅ Separação correta de eventos entre diferentes GUIs
## 🔧 Atualizações Técnicas Detalhadas
### 1. Configuração do Build (build.gradle)
- Objetivo**: Permitir compilação com Java 8 para compatibilidade máxima
- Mudanças**:
- Java alterado de 21 para 8
- API do Spigot alterada de
1.21para1.16.5 - Configurado
sourceCompatibilityetargetCompatibilitypara Java 8 - Mantido repositórios Maven para Paper e Spigot
- Resultado**: Plugin compila com Java 8 e gera bytecode compatível com JVM 8+
### 2. Plugin Metadata (plugin.yml)
- Objetivo**: Declarar compatibilidade correta com versões antigas
- Mudanças**:
api-versionalterado de1.21para1.13folia-supportedmantido comotrue- Comandos e permissões preservados
- Resultado**: Plugin carrega corretamente em servidores 1.8.8 até 1.21+
### 3. Sistema de Compatibilidade de Inventário (InventoryCompat.java)
- Objetivo**: Resolver problema de títulos nulos em versões 1.8-1.14
- Problema**: Em versões antigas (especialmente 1.14.1),
getTitle()retornanull, impedindo identificação de GUIs
- Solução**: Criada classe utilitária com múltiplos métodos de fallback
- Métodos de detecção de título**:
getTitle() no InventoryView (1.14+)2.
title() com Adventure API (Paper moderno)3.
getTitle() no Inventory (algumas versões)4.
getName() no Inventory (1.8-1.13)- Sistema de detecção por estrutura** (quando título é null):
- KitListGUI**:
- Detecta por ANVIL no slot 53
- Verifica ausência de BARRIER no slot 45
- Tamanho: 54 slots
- KitWizardGUI - Tela de Permissão**:
- Detecta por WOOL nos slots 11 e 15
- Verifica se sessão não tem itens ainda
- Tamanho: 27 slots
- KitWizardGUI - Tela de Itens**:
- Detecta por BARRIER no slot 45
- Tamanho: 54 slots
- KitWizardGUI - Tela de Confirmação**:
- Detecta por WOOL nos slots 11 e 15
- Verifica se sessão já tem itens definidos
- Tamanho: 27 slots
- KitEditorGUI**:
- Detecta por NAME_TAG no slot 10
- Detecta por CHEST no slot 14
- Detecta por PAPER no slot 20
- Tamanho: 27 slots
- Resultado**: Todas as GUIs funcionam perfeitamente mesmo quando
getTitle()retorna null
### 4. Compatibilidade de Materiais
- Objetivo**: Usar nomes corretos de materiais para cada versão
- Materiais atualizados**:
| Material Moderno | Material Legado (1.8) | Uso |
|-----------------|----------------------|-----|
|
REDSTONE_TORCH | REDSTONE_TORCH_ON | Ícone de permissão ||
CLOCK | WATCH | Ícone de cooldown ||
NAME_TAG | NAME_TAG | Ícone de renomear |- Lã colorida** (sistema especial):
- 1.8-1.12**: Usa
Material.WOOLcom data values (durability)
java
// Verde (Lime)
ItemStack greenWool = new ItemStack(Material.WOOL, 1, (short) 5);
// Vermelho (Red)
ItemStack redWool = new ItemStack(Material.WOOL, 1, (short) 14);
`
- 1.13+**: Usa tipos específicos
`java
Material.LIME_WOOL
Material.RED_WOOL
`
- Método helper**:
`java
private Material getMaterialCompat(String modernName, String legacyName) {
try {
return Material.valueOf(modernName);
} catch (IllegalArgumentException e) {
return Material.valueOf(legacyName);
}
}
`
- Resultado**: Todos os itens aparecem corretamente em todas as versões
### 5. Remoção de APIs Modernas
- Objetivo**: Eliminar dependências de Java 9+ e Minecraft 1.13+
- ItemFlag** (não existe em 1.8):
`java
// ANTES (não funciona em 1.8)
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
// DEPOIS (com reflexão)
try {
Class<?> itemFlagClass = Class.forName("org.bukkit.inventory.ItemFlag");
Object hideAttributes = itemFlagClass.getEnumConstants()[0];
meta.getClass().getMethod("addItemFlags", itemFlagClass)
.invoke(meta, hideAttributes);
} catch (Exception ignored) {}
`
- Lambdas convertidos para classes anônimas**:
`java
// ANTES
requestText(playerId, input -> {
// código
});
// DEPOIS
requestText(playerId, new java.util.function.Consumer<String>() {
public void accept(String input) {
// código
}
});
`
- List.of() substituído** (só existe em Java 9+):
`java
// ANTES
List<String> list = List.of("item1", "item2");
// DEPOIS
List<String> list = Arrays.asList("item1", "item2");
// ou
List<String> list = new ArrayList<>();
list.add("item1");
list.add("item2");
`
- Enchantment.UNBREAKING**:
`java
// ANTES (1.13+)
Enchantment.UNBREAKING
// DEPOIS (1.8)
Enchantment.DURABILITY
`
- Resultado**: Código compila e executa em Java 8 sem erros
### 6. Scheduler Folia (Compatibilidade Completa)
- Objetivo**: Funcionar tanto em Paper/Spigot quanto em Folia
- Detecção automática**:
`java
public static boolean isFolia() {
try {
Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
`
- Implementação com múltiplos fallbacks**:
1. **EntityScheduler** (preferencial para Folia):
run(plugin, task, null, 0L) - 4 parâmetrosrun(plugin, task, null) - 3 parâmetrosrun(plugin, task) - 2 parâmetrosexecute(plugin, task) - método alternativo
2. **GlobalRegionScheduler** (fallback):
run(plugin, task)execute(plugin, task)
3. **BukkitScheduler** (Paper/Spigot):
runTask(plugin, task)runTaskLater(plugin, task, delay)
- Métodos implementados**:
`java
// Executa tarefa imediatamente
runTaskForPlayer(Player player, Runnable task)
// Executa com delay
runTaskLaterForPlayer(Player player, Runnable task, long delay)
// Abre inventário de forma segura
openInventoryForPlayer(Player player, Inventory inventory)
`
- Resultado**: Plugin funciona perfeitamente em Paper, Spigot e Folia
### 7. Sistema de Debug Configurável
- Objetivo**: Permitir debug sem poluir logs em produção
- Configuração** (config.yml):
`yaml
debug: false # Padrão: desativado
`
- Implementação**:
`java
public boolean isDebugEnabled() {
return getConfig().getBoolean("debug", false);
}
// Uso
if (plugin.isDebugEnabled()) {
plugin.getLogger().info("Debug message");
}
`
- Logs de debug incluem**:
- Detecção de métodos do scheduler Folia
- Passos de criação de kits (nome, permissão, itens)
- Processamento de eventos de GUI
- Detecção de títulos de inventário e fallbacks
- Cliques em lã e detecção de data values
- Identificação de GUIs por estrutura
- Resultado**: Logs limpos em produção, debug detalhado quando necessário
### 8. Correção de Bug: Duplicação de Kits
- Problema**: Kit sendo criado duas vezes ao confirmar wizard
- Um kit com nome correto
- Um kit com nome
null (falhava)
- Causa**: Double-click processando evento duas vezes
- Solução**:
`java
// Verificar se já está processando
if (session.getName() == null) {
// Sessão já foi processada e limpa
player.closeInventory();
return;
}
// Processar criação do kit
Kit kit = new Kit(kitName);
// ... configurar kit ...
// Limpar sessão ANTES de fechar inventário
plugin.clearCreationSession(player.getUniqueId());
creationSessions.remove(player.getUniqueId());
// Enviar mensagem e fechar
player.sendMessage("Kit criado!");
player.closeInventory();
`
- Resultado**: Kits criados apenas uma vez, sem duplicatas
### 9. Correção de Bug: Wizard não Respondia a Cliques em 1.8.8
- Problema**: Cliques em lã verde/vermelha não faziam nada na tela de permissão
- Causa**:
GuiUtil.simpleItem() criava novo ItemStack sem durability, então comparação falhava
- Solução**:
`java
// Criar ItemStack com durability diretamente
Material woolType = getMaterialCompat("LIME_WOOL", "WOOL");
ItemStack greenWool = new ItemStack(woolType, 1, (short) 5);
ItemMeta greenMeta = greenWool.getItemMeta();
if (greenMeta != null) {
greenMeta.setDisplayName("§aYes");
greenWool.setItemMeta(greenMeta);
}
// No click handler, verificar data value
short data = clicked.getDurability();
if (data == 5 || clicked.getType().name().contains("LIME")) {
// Verde clicado
}
`
- Logs de debug adicionados**:
`
[DKKITS] Permission step - Clicked item: RED_WOOL durability: 14
[DKKITS] Wool clicked! Data value: 14, Type: RED_WOOL
[DKKITS] Red wool detected - setting permission required to false
`
- Resultado**: Wizard funciona perfeitamente em 1.8.8
### 10. Correção de Bug: KitWizardGUI Processando Eventos do KitEditorGUI
- Problema**: Ao abrir
/dkkit edit inicial em 1.14.1, KitWizardGUI processava os cliques
- Sintomas**:
`
[DKKITS] KitWizardGUI - Click detected. Title: 'null'
[DKKITS] KitWizardGUI - Raw slot: 16
[DKKITS] KitWizardGUI - Detected permission screen by WOOL...
`
- Causa**:
- KitWizardGUI verificava sessão DEPOIS de começar a processar evento
- Não excluía explicitamente KitEditorGUI
- Ambas as GUIs têm 27 slots
- Solução**:
- 1. Detecção explícita de KitEditorGUI**:
`java
// Verificar se NÃO é KitEditorGUI antes de processar
if (topInv.getSize() == 27) {
ItemStack slot10 = topInv.getItem(10);
ItemStack slot14 = topInv.getItem(14);
ItemStack slot20 = topInv.getItem(20);
Material nameTagMat = getMaterialCompat("NAME_TAG", "NAME_TAG");
if (slot10 != null && slot10.getType() == nameTagMat &&
slot14 != null && slot14.getType() == Material.CHEST &&
slot20 != null && slot20.getType() == Material.PAPER) {
// É KitEditorGUI, não processar aqui
return;
}
}
`
- 2. Reordenação de checks**:
- Verificar tipo de GUI PRIMEIRO
- Verificar sessão DEPOIS
- 3. Log de debug**:
`java
if (plugin.isDebugEnabled()) {
plugin.getLogger().info("KitWizardGUI - Ignoring KitEditorGUI event");
}
`
- Resultado**: KitWizardGUI não interfere mais com KitEditorGUI
### 11. Armazenamento de Nome do Kit no KitEditorGUI
- Problema**: KitEditorGUI dependia do título do inventário para obter nome do kit
- Causa**: Título era null em 1.14.1
- Solução**:
`java
public class KitEditorGUI implements Listener {
private final DKKits plugin;
private final String kitName; // Armazenar nome
private KitEditorGUI(DKKits plugin, String kitName) {
this.plugin = plugin;
this.kitName = kitName; // Salvar no construtor
}
@EventHandler
public void onClick(InventoryClickEvent event) {
// Usar kitName em vez de extrair do título
Kit kit = plugin.getKitManager().get(kitName);
}
}
`
- Resultado**: KitEditorGUI funciona independente do título do inventário
## 🎯 Funcionalidades Testadas e Funcionando
### ✅ Versão 1.8.8 (Paper)
- Criação de kits via wizard
- Edição de kits existentes
- Listagem de kits
- Uso de kits
- Sistema de permissões
- Sistema de cooldown
- Todas as GUIs funcionando
- Lã colorida com data values
### ✅ Versão 1.14.1 (Paper)
- Criação de kits via wizard
- Edição de kits existentes
- Listagem de kits
- Uso de kits
- Sistema de permissões
- Sistema de cooldown
- Detecção de GUI por estrutura (título null)
- Separação correta de eventos entre GUIs
### ✅ Versão 1.21+ (Paper/Folia)
- Todas as funcionalidades acima
- Scheduler Folia funcionando
- Materiais modernos
- Adventure API (quando disponível)
## 🛠️ Compilação
### Requisitos
- Java 8 (JDK 8)
- Gradle (incluído via wrapper)
### Comandos
- Windows**:
`cmd
set JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-8.0.472.8-hotspot
gradlew.bat clean build
`
- Linux/Mac**:
`bash
export JAVA_HOME=/path/to/jdk8
./gradlew clean build
`
### Resultado
- Arquivo JAR:
build/libs/DKKITS-1.0-SNAPSHOT.jarCompatível com Minecraft 1.8.8 até 1.21+ Funciona em Paper, Spigot e Folia
## 📝 Configuração
### config.yml
`yaml
# Ativar logs de debug (padrão: false)
debug: false
# Idioma do plugin
language: pt_br
`
### Flags de Inicialização
- Para 1.8.8 com Java 8**:
`bash
java -jar paper-1.8.8.jar
`
- Para 1.21+ com Java 21**:
`bash
java -jar paper-1.21.jar
``## 🐛 Bugs Corrigidos
| # | Bug | Status | Versão Afetada |
|---|-----|--------|----------------|
| 1 | Duplicação de kits ao confirmar wizard | ✅ Corrigido | Todas |
| 2 | Wizard não respondia a cliques em lã | ✅ Corrigido | 1.8.8 |
| 3 | Título null em inventários | ✅ Corrigido | 1.8-1.14 |
| 4 | KitWizardGUI processando eventos do KitEditorGUI | ✅ Corrigido | 1.14.1 |
| 5 | Materiais incompatíveis | ✅ Corrigido | 1.8-1.12 |
| 6 | Scheduler Folia não funcionando | ✅ Corrigido | Folia |
## 📊 Estatísticas do Projeto
- Versões suportadas**: 1.8.8 até 1.21+ (13+ versões)
- Servidores compatíveis**: Spigot, Paper, Folia
- Arquivos modificados**: 12
- Linhas de código adicionadas**: ~500
- Bugs corrigidos**: 6
- Sistemas de compatibilidade**: 4 (Materiais, Inventário, Scheduler, GUI)
- Tempo de desenvolvimento**: Múltiplas sessões
- Testes realizados**: 3 versões (1.8.8, 1.14.1, 1.21+)
## 🎉 Conclusão
O plugin DKKits agora é **totalmente compatível** com Minecraft 1.8.8 até 1.21+, funcionando perfeitamente em Paper, Spigot e Folia.
Todos os sistemas foram testados e validados:
- ✅ Criação de kits
- ✅ Edição de kits
- ✅ Listagem de kits
- ✅ Uso de kits
- ✅ Sistema de permissões
- ✅ Sistema de cooldown
- ✅ Todas as interfaces gráficas
- ✅ Compatibilidade com Folia
O plugin está pronto para uso em produção em qualquer versão do Minecraft de 1.8.8 em diante.