Ir para conteúdo
  • 0

[Resolvido] Dúvida, Como criar um sistema de delay, minutos, horas, segundos...


Viiict0r

Pergunta

Olá..


 


Minha dúvida é a seguinte, como crio um sistema, de delay, onde o jogador usa tal função, e é setado um delay, e esse delay não reseta ao sair do servidor, e nem reiniciando-o...


 


obrigado.


Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

private HashMap<String, Long> cooldown = new HashMap<>();

private void setDelay(Player p) {
		// Adicionando delay de 3 horas.
		cooldown.put(p.getName(), System.currentTimeMillis() + TimeUnit.HOURS.toMillis(3));
	}
	
	private boolean hasDelay(Player p) {
		return cooldown.containsKey(p.getName()) && (cooldown.get(p.getName()) > System.currentTimeMillis());
	}
	
	private String getDelayString(Player p) {
		long time = cooldown.get(p.getName()) - System.currentTimeMillis();
		return format(time);
	}
	
	private String format(long time) {
		String format = "";
		long hours = TimeUnit.MILLISECONDS.toHours(time);
		long hoursInMillis = TimeUnit.HOURS.toMillis(hours);
		long minutes = TimeUnit.MILLISECONDS.toMinutes(time - hoursInMillis);
		long minutesInMillis = TimeUnit.MINUTES.toMillis(minutes);
		long seconds = TimeUnit.MILLISECONDS.toSeconds(time - (hoursInMillis + minutesInMillis));
		if (hours > 0)
			format = hours + (hours > 1 ? " horas" : " hora");
		if (minutes > 0) {
			if ((seconds > 0) && (hours > 0))
				format += ", ";
			else if (hours > 0)
				format += " e ";
			format += minutes + (minutes > 1 ? " minutos" : " minuto");
		}
		if (seconds > 0) {
			if ((hours > 0) || (minutes > 0))
				format += " e ";
			format += seconds + (seconds > 1 ? " segundos" : " segundo");
		}
		if (format.equals("")) {
			long rest = time / 100;
			if (rest == 0)
				rest = 1;
			format = "0." + rest + " segundo";
		}
		return format;
	}

        private void save() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (!(f.exists()))
			try {
				f.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
			oos.writeObject(cooldown);
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void load() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (f.exists()) {
			try {
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
				cooldown = (HashMap<String, Long>) ois.readObject();
				ois.close();
                                for (Entry<String, Long> entry : cooldown.entrySet()) {
                                    if (entry.getValue() <= System.currentTimeMillis())
                                        cooldown.remove(entry.getKey());
                                }
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

O metodo save() tu chama no onDisable() e pra nao perder muito caso o server caia repentinamente, cria uma tarefa que chama ele a cada 1min por exemplo....

 

O metodo load() tu chama no onEnable()

 

Os metodos já dizem tudo, dai tu aplica ao comando, evento.

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

Guest Mateus Demarchi

Olha, se utilizar variáveis vai-se perder os dados ao reiniciar o servidor, um método para resolver isso seria salvar os delays ao plugin ser desabilitado, e colocar os valores na variável ao habilitar o plugin e deixar rodar o método para reduzir o valor do delay.

Link para o comentário
Compartilhar em outros sites

Olha, se utilizar variáveis vai-se perder os dados ao reiniciar o servidor, um método para resolver isso seria salvar os delays ao plugin ser desabilitado, e colocar os valores na variável ao habilitar o plugin e deixar rodar o método para reduzir o valor do delay.

Huum, no caso usar um scheduler pra isso?

Link para o comentário
Compartilhar em outros sites

Serio isso? Você faz tudo que diz q faz e não sabe fazer cooldown?

Cara, eu não sei se você percebeu, mais a minha dúvida não é como criar um cooldown, e sim um sistema pra não resetar o cooldown dos jogadores ao deslogarem, ou reiniciar o servidor.

Link para o comentário
Compartilhar em outros sites

Cara, eu não sei se você percebeu, mais a minha dúvida não é como criar um cooldown, e sim um sistema pra não resetar o cooldown dos jogadores ao deslogarem, ou reiniciar o servidor.

Usa currentTimeMillis para salvar, só que salva em um arquivo externo (como .db), aí toda vez que for utilizar o comando ou outra coisa, verifica se o atual currentTimeMillis é maior ou igual ao que está registrado

Link para o comentário
Compartilhar em outros sites

private HashMap<String, Long> cooldown = new HashMap<>();

private void setDelay(Player p) {
		// Adicionando delay de 3 horas.
		cooldown.put(p.getName(), System.currentTimeMillis() + TimeUnit.HOURS.toMillis(3));
	}
	
	private boolean hasDelay(Player p) {
		return cooldown.containsKey(p.getName()) && (cooldown.get(p.getName()) > System.currentTimeMillis());
	}
	
	private String getDelayString(Player p) {
		long time = cooldown.get(p.getName()) - System.currentTimeMillis();
		return format(time);
	}
	
	private String format(long time) {
		String format = "";
		long hours = TimeUnit.MILLISECONDS.toHours(time);
		long hoursInMillis = TimeUnit.HOURS.toMillis(hours);
		long minutes = TimeUnit.MILLISECONDS.toMinutes(time - hoursInMillis);
		long minutesInMillis = TimeUnit.MINUTES.toMillis(minutes);
		long seconds = TimeUnit.MILLISECONDS.toSeconds(time - (hoursInMillis + minutesInMillis));
		if (hours > 0)
			format = hours + (hours > 1 ? " horas" : " hora");
		if (minutes > 0) {
			if ((seconds > 0) && (hours > 0))
				format += ", ";
			else if (hours > 0)
				format += " e ";
			format += minutes + (minutes > 1 ? " minutos" : " minuto");
		}
		if (seconds > 0) {
			if ((hours > 0) || (minutes > 0))
				format += " e ";
			format += seconds + (seconds > 1 ? " segundos" : " segundo");
		}
		if (format.equals("")) {
			long rest = time / 100;
			if (rest == 0)
				rest = 1;
			format = "0." + rest + " segundo";
		}
		return format;
	}

        private void save() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (!(f.exists()))
			try {
				f.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
			oos.writeObject(cooldown);
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void load() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (f.exists()) {
			try {
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
				cooldown = (HashMap<String, Long>) ois.readObject();
				ois.close();
                                for (Entry<String, Long> entry : cooldown.entrySet()) {
                                    if (entry.getValue() <= System.currentTimeMillis())
                                        cooldown.remove(entry.getKey());
                                }
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

O metodo save() tu chama no onDisable() e pra nao perder muito caso o server caia repentinamente, cria uma tarefa que chama ele a cada 1min por exemplo....

 

O metodo load() tu chama no onEnable()

 

Os metodos já dizem tudo, dai tu aplica ao comando, evento.

 

Obrigado, irei testar...

Link para o comentário
Compartilhar em outros sites

private HashMap<String, Long> cooldown = new HashMap<>();

private void setDelay(Player p) {
		// Adicionando delay de 3 horas.
		cooldown.put(p.getName(), System.currentTimeMillis() + TimeUnit.HOURS.toMillis(3));
	}
	
	private boolean hasDelay(Player p) {
		return cooldown.containsKey(p.getName()) && (cooldown.get(p.getName()) > System.currentTimeMillis());
	}
	
	private String getDelayString(Player p) {
		long time = cooldown.get(p.getName()) - System.currentTimeMillis();
		return format(time);
	}
	
	private String format(long time) {
		String format = "";
		long hours = TimeUnit.MILLISECONDS.toHours(time);
		long hoursInMillis = TimeUnit.HOURS.toMillis(hours);
		long minutes = TimeUnit.MILLISECONDS.toMinutes(time - hoursInMillis);
		long minutesInMillis = TimeUnit.MINUTES.toMillis(minutes);
		long seconds = TimeUnit.MILLISECONDS.toSeconds(time - (hoursInMillis + minutesInMillis));
		if (hours > 0)
			format = hours + (hours > 1 ? " horas" : " hora");
		if (minutes > 0) {
			if ((seconds > 0) && (hours > 0))
				format += ", ";
			else if (hours > 0)
				format += " e ";
			format += minutes + (minutes > 1 ? " minutos" : " minuto");
		}
		if (seconds > 0) {
			if ((hours > 0) || (minutes > 0))
				format += " e ";
			format += seconds + (seconds > 1 ? " segundos" : " segundo");
		}
		if (format.equals("")) {
			long rest = time / 100;
			if (rest == 0)
				rest = 1;
			format = "0." + rest + " segundo";
		}
		return format;
	}

        private void save() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (!(f.exists()))
			try {
				f.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
			oos.writeObject(cooldown);
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void load() {
		File f = new File(getDataFolder(), "cooldown.dat");
		if (f.exists()) {
			try {
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
				cooldown = (HashMap<String, Long>) ois.readObject();
				ois.close();
                                for (Entry<String, Long> entry : cooldown.entrySet()) {
                                    if (entry.getValue() <= System.currentTimeMillis())
                                        cooldown.remove(entry.getKey());
                                }
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

O metodo save() tu chama no onDisable() e pra nao perder muito caso o server caia repentinamente, cria uma tarefa que chama ele a cada 1min por exemplo....

 

O metodo load() tu chama no onEnable()

 

Os metodos já dizem tudo, dai tu aplica ao comando, evento.

 

StringBuilder mandou lembranças.

logo-forum.png

 

 

Sua dúvida foi marcada como [Resolvido] e movido à área de dúvidas resolvidas.

 

 

Atenciosamente,

Gamer's Board

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...