Tags
Creators
Details
1.15-SNAPSHOT
Compatibility
Changes
📋 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() retorna null, 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()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_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.WOOL com 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_WOOL
Mé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.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:
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: desativado
Implementaçã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 falhava
Soluçã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 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:
// 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 build
Linux/Mac:
export JAVA_HOME=/path/to/jdk8
./gradlew clean build
Resultado
- 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_br
Flags de Inicialização
Para 1.8.8 com Java 8:
java -jar paper-1.8.8.jar
Para 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.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:6MDSMWJM:253ux1B2"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:6MDSMWJM:253ux1B2"
}

