Ir para conteúdo

Mensagens configuráveis sem stress!


ElGaubinho

Posts Recomendados

Criar mensagens configuráveis sempre acaba se tornando uma dor de cabeça em grandes escalas ou se torna chato pela quantidade de vezes que você precisa repetir alguns códigos...

Pensando neste mesmo problema, resolvi deixar a criação de mensagens configuráveis bem simples, ou seja, esqueça ter que carregar e salvar mensagens, verificar se elas já existem para criar, entre outras atividades que se tornam chatas com o tempo.

 

Aqui está uma Util que eu resolvi criar para resolver todo este problema!

Spoiler

package seupacote;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

/**
 * Gerencia mensagens
 * @author Gabriel Anceski
 *
 */
public class MessageMaster {
	private static Plugin plugin;
	private static FileConfiguration messagesYml;
	private static HashMap<String, Message> messages;

	/**
	 * Inicializa o gerenciador de mensagens.
	 * @param plugin Seu plugin.
	 */
	public static void initialize(Plugin plugin) {
		MessageMaster.plugin = plugin;
		messagesYml = loadFile("messages.yml");
		messages = new HashMap<>();

		Message.setYml(messagesYml);

		setupDefaults();

	}

	/**
	 * Defina suas mensagens neste método!
	 */
	private static void setupDefaults() {
		// TODO: Adicione suas mensagens aqui!

		Message exemploDeMensagem = new Message("Aqui você", "poderá adicionar", "quantas linhas quiser!",
				"&bpoderá &c&lusar &etambém, &acódigo de cores!");
		exemploDeMensagem.setPath("exemploDeMensagem").saveAndLoad();

		Message mensagemComPlaceholder = new Message("Mensagem com placeholder também é fácil! %meu_placeholder%");

		// Você pode fazer assim:
		mensagemComPlaceholder.addPlaceholder("%meu_placeholder%", "Viu só?").saveAndLoad();
		mensagemComPlaceholder.setPath("mensagemComPlaceholder");
		// Ou assim:
		mensagemComPlaceholder.addPlaceholder("%meu_placeholder%", "Viu só?");
		mensagemComPlaceholder.setPath("mensagemComPlaceholder");
		mensagemComPlaceholder.saveAndLoad();
		// Ou até mesmo assim (numa única linha!!!):
		new Message("Mensagem com placeholder também é fácil! %meu_placeholder%")
				.addPlaceholder("%meu_placeholder%", "Viu só?").setPath("mensagemComPlaceholder").saveAndLoad();

		// Use este método caso você não usar o método saveToFile na hora de salvar uma mensagem. 
		saveYml(messagesYml, getFile("messages.yml"));

	}

	/**
	 * Envia uma mensagem ao console ou jogador.
	 * @param sender Console ou jogador.
	 * @param messagePath Caminho da mensagem (YAML)
	 */
	public static void send(CommandSender sender, String messagePath) {
		if (!messages.containsKey(messagePath)) {
			if (sender.isOp()) sender.sendMessage("§cOcorreu um erro ao obter a mensagem do caminho: §f" + messagePath);
			return;

		}

		messages.get(messagePath).sendTo(sender);

	}

	/**
	 * Envia uma mensagem para todos os jogadores online.
	 * @param messagePath Caminho da mensagem.
	 */
	public static void sendGlobal(String messagePath) {
		if (!messages.containsKey(messagePath)) throw new NullPointerException("Mensagem inexistente!");
		Bukkit.getOnlinePlayers().forEach(online -> messages.get(messagePath).sendTo(online));

	}

	/**
	 * Envia uma mensagem ao console ou jogador.
	 * @param sender Console ou jogador.
	 * @param msg Mensagem.
	 */
	public static void send(CommandSender sender, Message msg) {
		if (msg == null) throw new NullPointerException("O caminho para acesso da mensagem é inválido!");
		msg.sendTo(sender);

	}

	/**
	 * Obtém uma mensagem através do caminho especificado.
	 * @param path Caminho.
	 * @return Mensagem.
	 */
	public static Message getMessage(String path) {
		if (messages.containsKey(path)) return messages.get(path);
		return null;

	}

	/**
	 * Adiciona uma mensagem à lista de mensagens.
	 * @param msg Mensagem.
	 */
	static void addMessage(Message msg) {
		messages.put(msg.getPath(), msg);

	}

	/**
	 * 
	 * A parte abaixo fica todo o gerenciamento do arquivo de mensagens, nada importante para receber anotações.
	 * 
	 */

	static File getFile(String name) {
		return new File(plugin.getDataFolder(), name);

	}

	private static FileConfiguration loadFile(String name) {
		File raw = new File(plugin.getDataFolder(), name);
		if (!raw.exists()) {
			try {
				raw.createNewFile();
				raw.setWritable(true);

			} catch (Exception e) {
				e.printStackTrace();

			}

		}

		FileConfiguration file = YamlConfiguration.loadConfiguration(raw);
		return file;

	}

	static void saveYml(FileConfiguration file, File rawFile) {
		try {
			if (rawFile.exists()) file.save(rawFile);

		} catch (Exception e) {
			e.printStackTrace();

		}

	}

}

/**
 * Classe que define uma mensagem.
 * @author Gabriel Anceski
 * @see MessageMaster
 */
class Message {
	private static FileConfiguration messagesYml;

	/**
	 * Define qual vai ser o arquivo que irá armazenar as mensagens.
	 * @param file Arquivo.
	 */
	static void setYml(FileConfiguration file) {
		messagesYml = file;

	}

	private List<String> message;
	private String path;
	private HashMap<String, String> placeholders;

	/**
	 * Cria uma nova mensagem.
	 * @param message Mensagens que você deseja enviar ao jogador.
	 */
	public Message(String... message) {
		this.message = Arrays.asList(message);
		this.placeholders = new HashMap<>();
		addDefaultPlaceholders();

	}

	/**
	 * Adiciona alguns placeholders padrões.
	 */
	private void addDefaultPlaceholders() {
		placeholders.put("&", "§");
		placeholders.put("%pluginTag%", "[Seu plugin]");

	}

	/**
	 * Define a mensagem na config.
	 * Este método não salva o arquivo da config, apenas o define!
	 */
	public void saveAndLoad() {
		if (path == null || path.equalsIgnoreCase(""))
			throw new NullPointerException("O caminho para acesso da mensagem é inválido!");
		if (!messagesYml.contains(path)) messagesYml.set(path, message);
		else message = messagesYml.getStringList(path);

		MessageMaster.addMessage(this);

	}

	/**
	 * Salva a mensagem no arquivo YAML.
	 */
	public void saveToFile() {
		saveAndLoad();
		MessageMaster.saveYml(messagesYml, MessageMaster.getFile("messages.yml"));

	}

	/**
	 * Define o caminho da mensagem no arquivo YAML.
	 * @param path Caminho.
	 * @return Mesma mensagem que você está usando.
	 */
	public Message setPath(String path) {
		this.path = path;
		return this;

	}

	/**
	 * Adiciona um placeholder à mensagem.
	 * Caso o placeholder já exista, ele muda o substituinte.
	 * @param placeholder Placeholder, da maneira que você quiser, sugiro usar algo entre '%'. Ex: %teste_de_placeholder%
	 * @param replacer Para que valor o placeholder vai ser trocado.
	 * @return Mesma mensgem que você está usando.
	 */
	public Message addPlaceholder(String placeholder, String replacer) {
		placeholders.put(placeholder, replacer);
		return this;

	}

	/**
	 * Envia a mensagem para o console ou algum jogador.
	 * @param target Alvo.
	 */
	public void sendTo(CommandSender target) {
		for (String string : message) {
			for (Entry<String, String> entry : placeholders.entrySet())
				string = string.replace(entry.getKey(), entry.getValue());
			target.sendMessage(string);

		}

	}

	/**
	 * @return Obtém o caminho da mensagem, arquivo YAML.
	 */
	public String getPath() {
		return path;

	}

}

 

 

 

 

 

Basicamente, a criação de mensagens se torna muito simples!
Basta seguir o modelo que já está no código:

 

		// Caso você criar as mensagens no método setupDefaults, use o método saveToFile ao invés de saveAndLoad!!!

		Message exemploDeMensagem = new Message("Aqui você", "poderá adicionar", "quantas linhas quiser!", "&bpoderá &c&lusar &etambém, &acódigo de cores!");
		exemploDeMensagem.setPath("exemploDeMensagem").saveAndLoad();



		Message mensagemComPlaceholder = new Message("Mensagem com placeholder também é fácil! %meu_placeholder%");

		// Você pode fazer assim:
		mensagemComPlaceholder.addPlaceholder("%meu_placeholder%", "Viu só?").saveAndLoad();
		mensagemComPlaceholder.setPath("mensagemComPlaceholder");
		// Ou assim:
		mensagemComPlaceholder.addPlaceholder("%meu_placeholder%", "Viu só?");
		mensagemComPlaceholder.setPath("mensagemComPlaceholder");
		mensagemComPlaceholder.saveAndLoad();
		// Ou até mesmo assim (numa única linha!!!):
		new Message("Mensagem com placeholder também é fácil! %meu_placeholder%")
				.addPlaceholder("%meu_placeholder%", "Viu só?").setPath("mensagemComPlaceholder").saveAndLoad();

		// Use este método caso você não usar o método saveToFile na hora de salvar uma mensagem. 
		saveYml(messagesYml, getFile("messages.yml"));

 

 

E para enviar à um jogador é muito simples, basta você acessar o método send da classe MessageMaster!

 

void seuMetodo(Player jogador) {
  MessageMaster.send(jogador, "exemploDeMensagem");
  
  // Ou para todos os jogadores
  MessageMaster.sendGlobal("exemploDeMensagem");
  
}

 

Espero que tenham entendido e façam ótimo proveito, qualquer dúvida é só entrar em contato ?

Editado por Gabriel__
Link para o comentário
Compartilhar em outros sites

3 horas atrás, GoncaloAngelino disse:

Aparenta ser bom, poderoa colocar umas prints.

 

3 horas atrás, ProfessorMS disse:

Bom PL mano, coloca algumas prints dele in-game! Tmj o/

Esta é uma util para desenvolvedores então não teria muito o que mostrar.

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, a class='ipsType_brandedLink' href='https://gamersboard.com.br/login/' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='Sign In Now'>acesse agora para postar com sua conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

Processando...
×
×
  • Criar Novo...