Ir para conteúdo

[Resource] GenericCooldown v0.5 - Cooldown com key e value!


Lüigi!

Posts Recomendados

Olá caro pessoal! Como vai?

 

 Recentemente baseado num tópico que eu vi, tive a ideia de criar uma simples classe que ajudasse na hora de você fazer cooldowns pro seu kitpvp ou algum tipo de sistema no qual o jogador tem um valor para o cooldown, ele está bem básica ainda mas pretendo implementar ela hehe

 

 É uma classe no qual suporta Key e Value genéricos no qual você pode colocar seus objetos em cooldown... Eu fiz essa classe para ser bem portável e em puro Java, o contra é que você vai ter que implementar no seu sistema uma maneira de controlar ela (especificarei um exemplo de como fazer isso abaixo)

 

 Atualmente a classe faz as seguintes coisas:

 

  •    Seta um tempo de expiração por segundo
  •    É possível pegar a Key e o Value
  •    Utiliza Generics
  •    Adiciona mais tempo ao cooldown (se não estiver expirado)
  •    Pegar o tempo restante do cooldown
  •    Identificar se o cooldown esta expirado ou não

 Sem mais delonga, a classe:

 

 


import java.util.concurrent.TimeUnit;

/**
 * 
 * @author @LuigiOliveira__
 * @version 0.5	
 * Classe que armaneza uma Chave com um valor adaptada para cooldown!
 * 
 * @param <K> - Um valor chave
 * @param <V> - Um valor complementar
 */

@SuppressWarnings("serial")
public class GenericCooldown<K,V> {

	private long expiration;
	private boolean isExpirated;
	private K key;
	private V value;
	
	public GenericCooldown(K key,V value, int seconds){
		this.key = key;
		this.value = value;
		this.isExpirated = false;
		this.expiration = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(seconds);
	}
	/**
	 * 
	 * @return Key do objeto
	 */
	public K getKey(){
		return key;
	}
	/**
	 * 
	 * @return Value do objeto
	 */
	public V getValue(){
		return value;
	}
	/**
	 * Checa se este cooldown já esta expirado ou não
	 * @return Se esta expirado
	 */
	public boolean isExpirated(){
		if(expiration < System.currentTimeMillis()){
			isExpirated = true;
		}
		return isExpirated;
	}
	/**
	 * Calcula o tempo restante (em millis)
	 * @return O tempo restante em millis
	 */
	public long getTimeLeft(){
		if(isExpirated()){
			return 0L;
		}else{
			return expiration - System.currentTimeMillis();
		}
	}
	/**
	 * Adiciona uma quantidade de segundos a expiração do cooldown, porém se ele estiver expirado não ira fazer muita diferença!
	 * @param seconds
	 */
	public void addTime(int seconds){
		this.expiration += TimeUnit.SECONDS.toMillis(seconds);
	}
}

 

 

Link no gist: https://gist.github.com/luigieai/e7c258f5adfa085c8b68d699b6a740bf

 

 Você pode observar que ao checar se ta em cooldown ele automaticamente já seta um estado de expirado ou não para o cooldown..

 

 Eu recomendo você fazer uma espécie de classe que controla seus cooldowns para facilitar sua vida, eu fiz uma classe básica para implementar e irei deixar aqui como exemplo de implementação..... 

 

 

 


import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
 * 
 * @author @LuigiOliveira__
 * Uma simples classe demonstrando como implementar meu GenericCooldown, você pode trocar os parametros de String para qualquer objeto
 * Que você deseja, essa é só um exemplo de várias maneiras possíveis de implementar o GenericCooldown!
 *
 */
public class CooldownManager {
	
	private ArrayList<GenericCooldown<String,String>> cd;

	public CooldownManager() {
		this.cd = new ArrayList<GenericCooldown<String,String>>();
		setupTask();
	}

	public boolean hasKey(String k) {
		for (GenericCooldown<String,String> e : cd) {
			if (e.getKey().equals(k)) {// Lembrando que dependendo do objeto que você usa como parametro a checagem deve ser feita de outra maneira
				return true;
			}
		}
		return false;
	}

	public boolean hasValue(String k) {
		for (GenericCooldown<String,String> e : cd) {
			if (e.getValue().equals(k)) { // Lembrando que dependendo do objeto que você usa como parametro a checagem deve ser feita de outra maneira
				return true;
			}
		}
		return false;
	}

	public GenericCooldown<String,String> getCooldown(String key) {
		if (hasKey(key)) {
			for (GenericCooldown<String,String> e : cd) {
				if (e.getKey().equals(key)) {// Lembrando que dependendo do objeto que você usa como parametro a checagem deve ser feita de outra maneira
					return e;
				}
			}
		}
		throw new NullPointerException("'" + key + "' não foi encontrado!");
	}

	public void addCooldown(String key, String value, int seconds) {
		if (hasKey(key)) return;
		cd.add(new GenericCooldown<String,String>(key, value, seconds));
	}

	public void removeCooldown(String key) {
		if (!hasKey(key)) return;
		cd.remove(getCooldown(key));
	}
	public void removeCooldown(GenericCooldown<String,String> key) {
		cd.remove(key);
	}

	/*
	 * Task para remover os cooldowns ja expirados!
	 * Se você estiver usando bukkit use um repeating task
	 * Nesse caso estou checando a cada 1 segundo se ha algum cooldown ja expirado... Caso tiver ele sera removido da Arraylist
	 */
	
	private void setupTask() {
		TimerTask t = new TimerTask(){
			//A maneira antiga mesmo 
			@Override
			public void run() {
				for(GenericCooldown<String,String> e : cd){
					if(e.isExpirated()){
						removeCooldown(e);
					}
				}
			} 
			
		};
		new Timer().schedule(t, TimeUnit.SECONDS.toMillis(1), TimeUnit.SECONDS.toMillis(1));
	}
}

 

 

 

 Bem, eu ainda não tenho ideia do que adicionar na classe, se você tiver alguma sugestão por favor, poste ela abaixo que eu irei agradecer muito! Se ocorrer qualquer erro por favor, mande o erro nesse tópico que assim que possível tentarei resolver!

 

 Se você gostou por favor de um like para eu ficar feliz! Por enquanto é só espero que tenham gostado!

Editado por Lüigi!
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...