Ir para conteúdo

[TUTORIAL] Cooldown Pra Cada Player.


LuizB

Posts Recomendados

Não Sei Criar Tópico Então Segue As Classes Logo Abaixo:


 

package br.com.seuplugin;

import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;

/**Classe para banir temporáriamente um player, baseado no nome do player, e em segundos.
 * @author FabioZumbi12
 *
 */
public class TempBan {

	static HashMap<String,Integer> tempban = new HashMap<String,Integer>();
	
	
	/**Tempbane um player. Use esse método no seu comando.
	 * @param p Nome do player
	 * @param tempo Tempo do ban em segundos.
	 * @param pl instancia do seu plugin.
	 * @return true se o player ainda não foi banido e foi banido agora. Ou false se ele ja estava tempbanido.
	 */
	public static boolean addTempBan(String p, int tempo, Plugin pl){
		if (!isTempBanned(p)){
			int taskId = runTempban(p, tempo, pl);
			tempban.put(p, taskId);
			return true;
		}
		return false;
	}
	
	/**Adiciona o player á lista de tempbanidos. Use esse método no seu comando.
	 * Irá retornar true se o player ainda não tiver banido, ou false se ja tiver banido. Bom para enviar mensagem dizendo que o player ja ta banido.
	 * @param p Nome do player
	 * @param pl Instancia do seu plugin.
	 * @return true se ja estiver banido e foi desbanido, ou false se o player não estava tempbanido.
	 */
	public static boolean delTempBan(String p, Plugin pl){
		if (isTempBanned(p)){			
			Bukkit.getScheduler().cancelTask(tempban.get(p));
			tempban.remove(p);
			return true;
		}
		return false;
	}
	
	private static int runTempban(final String p, int tempo, final Plugin pl){
		int taskid = Bukkit.getScheduler().scheduleSyncDelayedTask(pl, new Runnable() { 
			public void run() {
				if (isTempBanned(p)){
					delTempBan(p, pl);
				}				
				} 
			},tempo*20);
		return taskid;
	}
	
	
	/**Verifica se o player ta banido.
	 * Use esse metodo ao player se logar, para impedi-lo de se logar se tiver banido.
	 * @param p Nome do player
	 * @return true se tiver, false se não tiver banido
	 */
	public static boolean isTempBanned(String p){
		return tempban.containsKey(p);
	}
}

Classe Exemplo ( De Uso ) :

 

 @Override
	public boolean onCommand(CommandSender sender, Command command,
			String label, String[] args) {

		
		// - /comando <player> <tempo>
		if (args.length == 2){
			TempBan.addTempBan(args[0], Integer.parseInt(args[1], plugin.getInstance()));
		}
		return true;
	}
	
	@EventHandler
	public void onPreLogin(AsyncPlayerPreLoginEvent e){
		String p = e.getName();
		if (TempBan.isTempBanned(p)){
			e.setKickMessage("Você esta temporariamente banido!");
			e.setLoginResult(Result.KICK_OTHER);
		}
	}

È isso, As Classes Pode Ser Usada Pra Tempban, Kits e etc ...

        
                                                

                                                                   Créditos:

 

                    @FabioZumbi12 

Link para o comentário
Compartilhar em outros sites

Guest heromax

Seria mais fácil e daria menos lag se quando ao banir um player temporariamente, o código chamasse a instancia 'Calendar' e setasse numa HashMap o nome do player, e a soma da data e hora atual mais o tempo estipulado na args[1], assim definindo em que data e hora o player seria desbanido, e ao detectar o evento 'AsyncPlayerPreLoginEvent' fazia-se uma busca na HashMap pelo player detectado pelo evento, se o mesmo estivesse na hashmap, verificaria a data atual e hora atual e comparava com a data e hora setada, se data e hora atual fosse menor que a data e hora setada, fazia se um calculo e dava um kick no player com uma mensagem mostrando quanto tempo falta para o ban acabar, se por acaso a data atual fosse maior que setada na HashMap, tiraria o player da HashMap e desbaniria o mesmo, deixando-o entrar.

 

Dessa maneira não precisaríamos usar uma task, evitando mais lag no servidor.

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

Seria mais fácil e daria menos lag se quando ao banir um player temporariamente, o código chamasse a instancia 'Calendar' e setasse numa HashMap o nome do player, e a soma da data e hora atual mais o tempo estipulado na args[1], assim definindo em que data e hora o player seria desbanido, e ao detectar o evento 'AsyncPlayerPreLoginEvent' fazia-se uma busca na HashMap pelo player detectado pelo evento, se o mesmo estivesse na hashmap, verificaria a data atual e hora atual e comparava com a data e hora setada, se data e hora atual fosse menor que a data e hora setada, fazia se um calculo e dava um kick no player com uma mensagem mostrando quanto tempo falta para o ban acabar, se por acaso a data atual fosse maior que setada na HashMap, tiraria o player da HashMap e desbaniria o mesmo, deixando-o entrar.

 

Dessa maneira não precisaríamos usar uma task, evitando mais lag no servidor.

 Se for pra fazer isso, podemos usar o DATE que suporta o tempo em millis (esqueci o nome em pt-br malz) do sistema... Assim só checar o tempo restante em millis...

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...