
DK KITS
DKKITS is a Spigot/Paper 26.1 plugin that lets you create, edit, and deliver kits via GUI, with per-kit permissions and per-player cooldowns.
Added support for 26.x
O problema era: no editor do kit, a ação era decidida pelo material do item clicado. Como o botão de ícone usa o próprio material do ícone atual, quando ele era CHEST caía em “Editar itens”. Agora o editor decide pelo slot fixo do menu.
Нет описания изменений
🎉 DKKits - Changelog de Atualizações
🔒 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
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:
/dkkit create vip- Configure nome, permissão, itens
/dkkit edit vip- Clique no relógio →
86400(24 horas) - Clique na Esmeralda/Redstone (slot 23) → Ativa cooldown imediato
- Clique no Olho de Ender (slot 25) → Ativa kit oculto
- Pronto! Kit não aparece no
/kit, mas jogadores com permissão podem pegar com/kit vipapós esperar 24h
Dar kit oculto:
/dkkit give <jogador> vip- Corrigido exploit crítico: Jogadores sem permissão
🎉 Novidades do DKKits
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% premiumIntegraçã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
🔒 Bug Crítico Corrigido: Jogadores Sem OP Criando Kits Infinitos 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.
📋 Resumo Executivo
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 GUIsSolução: Criada classe utilitária com múltiplos métodos de fallback
Métodos de detecção de título:
getTitle()noInventoryView(1.14+)title()com Adventure API (Paper moderno)getTitle()noInventory(algumas versões)getName()noInventory(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_TORCHREDSTONE_TORCH_ONÍcone de permissão CLOCKWATCHÍcone de cooldown NAME_TAGNAME_TAGÍcone de renomear Lã colorida (sistema especial):
1.8-1.12: Usa
Material.WOOLcom data values (durability)// 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
Material.LIME_WOOL Material.RED_WOOLMétodo helper:
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):
// 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:
// 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+):
// 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:
// ANTES (1.13+) Enchantment.UNBREAKING // DEPOIS (1.8) Enchantment.DURABILITYResultado: 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:
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:
-
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
-
GlobalRegionScheduler (fallback):
run(plugin, task)execute(plugin, task)
-
BukkitScheduler (Paper/Spigot):
runTask(plugin, task)runTaskLater(plugin, task, delay)
Métodos implementados:
// 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):
debug: false # Padrão: desativadoImplementação:
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:
// 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 falhavaSolução:
// 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 falseResultado: Wizard funciona perfeitamente em 1.8.8
10. Correção de Bug: KitWizardGUI Processando Eventos do KitEditorGUI
Problema: Ao abrir
/dkkit edit inicialem 1.14.1, KitWizardGUI processava os cliquesSintomas:
[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:
// 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:
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:
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:
set JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-8.0.472.8-hotspot gradlew.bat clean buildLinux/Mac:
export JAVA_HOME=/path/to/jdk8 ./gradlew clean buildResultado
- Arquivo JAR:
build/libs/DKKITS-1.0-SNAPSHOT.jar - Compatível com Minecraft 1.8.8 até 1.21+
- Funciona em Paper, Spigot e Folia
📝 Configuração
config.yml
# Ativar logs de debug (padrão: false) debug: false # Idioma do plugin language: pt_brFlags de Inicialização
Para 1.8.8 com Java 8:
java -jar paper-1.8.8.jarPara 1.21+ com Java 21:
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.
added support for English and Brazilian Portuguese - version compatible with all versions
added support for English and Brazilian Portuguese
Нет описания изменений
Нет описания изменений
Нет описания изменений
Нет описания изменений
Нет описания изменений
Нет описания изменений
Нет описания изменений

