561 lines
18 KiB
Java
561 lines
18 KiB
Java
package cz.boosik.boosCooldown;
|
||
|
||
import java.io.IOException;
|
||
import java.text.ParseException;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.Calendar;
|
||
import java.util.Date;
|
||
import java.util.Set;
|
||
import java.util.UUID;
|
||
import java.util.logging.Logger;
|
||
|
||
import net.milkbowl.vault.Vault;
|
||
import net.milkbowl.vault.economy.Economy;
|
||
|
||
import org.bukkit.Bukkit;
|
||
import org.bukkit.command.Command;
|
||
import org.bukkit.command.CommandSender;
|
||
import org.bukkit.configuration.ConfigurationSection;
|
||
import org.bukkit.configuration.file.YamlConfiguration;
|
||
import org.bukkit.entity.Player;
|
||
import org.bukkit.event.HandlerList;
|
||
import org.bukkit.plugin.Plugin;
|
||
import org.bukkit.plugin.PluginDescriptionFile;
|
||
import org.bukkit.plugin.PluginManager;
|
||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||
import org.bukkit.plugin.java.JavaPlugin;
|
||
import org.bukkit.scheduler.BukkitScheduler;
|
||
import org.mcstats.MetricsLite;
|
||
|
||
import util.boosChat;
|
||
import cz.boosik.boosCooldown.Listeners.BoosEntityDamageListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerDeathListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerGameModeChangeListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerInteractListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerMoveListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerToggleSneakListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosPlayerToggleSprintListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosSignChangeListener;
|
||
import cz.boosik.boosCooldown.Listeners.BoosSignInteractListener;
|
||
|
||
/**
|
||
* Hlavn<76> t<><74>da pluginu. T<><54>da je potomkem JavaPlugin a implementuje Runnable.
|
||
* Tato t<><74>da se star<61> o ve<76>ker<65> inicializace p<>i spu<70>t<EFBFBD>n<EFBFBD> a ukon<6F>en<65> pluginu.
|
||
* Toto zahrnuje zji<6A>t<EFBFBD>n<EFBFBD>, zda je k dispozici plugin Vault a ekonomick<63> plugin,
|
||
* registraci poslucha<68><61> a tak<61> se star<61> o funkce v<>ech kontroln<6C>ch a
|
||
* konfigura<72>n<EFBFBD>ch p<><70>kaz<61>. Periodicky tak<61> ukl<6B>d<EFBFBD> soubor datab<61>ze v intervalu
|
||
* nastaven<65>m v konfiguraci.
|
||
*
|
||
* @author Jakub Kol<6F><6C>
|
||
*
|
||
*/
|
||
public class BoosCoolDown extends JavaPlugin implements Runnable {
|
||
private static final Logger log = Logger.getLogger("Minecraft");
|
||
private static PluginDescriptionFile pdfFile;
|
||
private static Economy economy = null;
|
||
private static boolean usingVault = false;
|
||
private PluginManager pm;
|
||
private static BoosCoolDown instance = null;
|
||
|
||
/**
|
||
* Metoda odes<65>l<EFBFBD> zpr<70>vy o pou<6F>it<69> p<><70>kaz<61> do konzole serveru.
|
||
*
|
||
* @param player
|
||
* jm<6A>no hr<68><72>e kter<65> vykonal p<><70>kaz
|
||
* @param command
|
||
* vykonan<61> p<><70>kaz
|
||
*/
|
||
public static void commandLogger(String player, String command) {
|
||
log.info("[" + "boosLogger" + "] " + player + " used command "
|
||
+ command);
|
||
}
|
||
|
||
/**
|
||
* @return
|
||
*/
|
||
public static Economy getEconomy() {
|
||
return economy;
|
||
}
|
||
|
||
/**
|
||
* @return
|
||
*/
|
||
public static Logger getLog() {
|
||
return log;
|
||
}
|
||
|
||
/**
|
||
* Metoda zji<6A><69>uje na z<>klad<61> opr<70>vn<76>n<EFBFBD> jestli je plugin aktivn<76> pro dan<61>ho
|
||
* hr<68><72>e nebo ne.
|
||
*
|
||
* @param player
|
||
* specifikovan<61> hr<68><72>
|
||
* @return
|
||
*/
|
||
static boolean isPluginOnForPlayer(Player player) {
|
||
boolean on;
|
||
if (player.hasPermission("booscooldowns.exception")) {
|
||
on = false;
|
||
} else if (player.isOp()) {
|
||
on = false;
|
||
} else {
|
||
on = true;
|
||
}
|
||
return on;
|
||
}
|
||
|
||
/**
|
||
* Metoda zji<6A><69>uje jestli je dostupn<70> plugin Vault a na z<>klad<61> toho vol<6F>
|
||
* metodu pro nastaven<65> ekonomick<63>ho pluginu a informuje o tom u<>ivatele
|
||
* pomoc<6F> konzole serveru.
|
||
*/
|
||
private void initializeVault() {
|
||
Plugin x = pm.getPlugin("Vault");
|
||
if (x != null & x instanceof Vault) {
|
||
log.info("[" + pdfFile.getName() + "]"
|
||
+ " found [Vault] searching for economy plugin.");
|
||
usingVault = true;
|
||
if (setupEconomy()) {
|
||
log.info("[" + pdfFile.getName() + "]" + " found ["
|
||
+ economy.getName()
|
||
+ "] plugin, enabling prices support.");
|
||
} else {
|
||
log.info("["
|
||
+ pdfFile.getName()
|
||
+ "]"
|
||
+ " economy plugin not found, disabling prices support.");
|
||
}
|
||
} else {
|
||
log.info("[" + pdfFile.getName() + "]"
|
||
+ " [Vault] not found disabling economy support.");
|
||
usingVault = false;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* (non-Javadoc)
|
||
*
|
||
* @see
|
||
* org.bukkit.plugin.java.JavaPlugin#onCommand(org.bukkit.command.CommandSender
|
||
* , org.bukkit.command.Command, java.lang.String, java.lang.String[])
|
||
*/
|
||
@SuppressWarnings("deprecation")
|
||
@Override
|
||
public boolean onCommand(CommandSender sender, Command c,
|
||
String commandLabel, String[] args) {
|
||
String command = c.getName().toLowerCase();
|
||
if (command.equalsIgnoreCase("booscooldowns")) {
|
||
if (args.length == 1) {
|
||
if (sender.hasPermission("booscooldowns.reload")
|
||
&& args[0].equalsIgnoreCase("reload")) {
|
||
reload();
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " config reloaded");
|
||
return true;
|
||
}
|
||
if (sender.hasPermission("booscooldowns.list.limits")
|
||
&& args[0].equalsIgnoreCase("limits")) {
|
||
try {
|
||
Player send = (Player) sender;
|
||
Set<String> commands = BoosConfigManager
|
||
.getCommands(send);
|
||
for (String comm : commands) {
|
||
int lim = BoosConfigManager.getLimit(comm, send);
|
||
BoosLimitManager.getLimitListMessages(send, comm,
|
||
lim);
|
||
}
|
||
} catch (ClassCastException e) {
|
||
log.warning("You cannot use this command from console!");
|
||
}
|
||
return true;
|
||
}
|
||
else if (sender.hasPermission("booscooldowns.globalreset")
|
||
&& args[0].equalsIgnoreCase("startglobalreset")) {
|
||
BoosLimitManager.setGlobalLimitResetDate();
|
||
startLimitResetTimersGlobal();
|
||
return true;
|
||
}
|
||
}
|
||
else if (args.length == 2) {
|
||
String jmeno = args[1];
|
||
Player player = Bukkit.getPlayerExact(jmeno);
|
||
UUID uuid = player.getUniqueId();
|
||
if (sender.hasPermission("booscooldowns.clearcooldowns")
|
||
&& args[0].equalsIgnoreCase("clearcooldowns")) {
|
||
String co = "cooldown";
|
||
BoosConfigManager.clearSomething(co, uuid);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " cooldowns of player " + jmeno
|
||
+ " cleared");
|
||
return true;
|
||
} else if (sender.hasPermission("booscooldowns.clearuses")
|
||
&& command.equalsIgnoreCase("booscooldowns")
|
||
&& args[0].equalsIgnoreCase("clearuses")) {
|
||
String co = "uses";
|
||
BoosConfigManager.clearSomething(co, uuid);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " uses of player " + jmeno + " cleared");
|
||
return true;
|
||
} else if (sender.hasPermission("booscooldowns.clearwarmups")
|
||
&& command.equalsIgnoreCase("booscooldowns")
|
||
&& args[0].equalsIgnoreCase("clearwarmups")) {
|
||
String co = "warmup";
|
||
BoosConfigManager.clearSomething(co, uuid);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " warmups of player " + jmeno
|
||
+ " cleared");
|
||
return true;
|
||
}
|
||
}
|
||
else if (args.length == 3) {
|
||
String jmeno = args[1];
|
||
Player player = Bukkit.getPlayerExact(jmeno);
|
||
UUID uuid = player.getUniqueId();
|
||
String command2 = args[2].trim();
|
||
if (sender.hasPermission("booscooldowns.clearcooldowns")
|
||
&& args[0].equalsIgnoreCase("clearcooldowns")) {
|
||
String co = "cooldown";
|
||
BoosConfigManager.clearSomething(co, uuid, command2);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " cooldown for command " + command2
|
||
+ " of player " + uuid + " cleared");
|
||
return true;
|
||
} else if (sender.hasPermission("booscooldowns.clearuses")
|
||
&& args[0].equalsIgnoreCase("clearuses")) {
|
||
String co = "uses";
|
||
BoosConfigManager.clearSomething(co, uuid, command2);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " uses for command " + command2
|
||
+ " of player " + jmeno + " cleared");
|
||
return true;
|
||
} else if (sender.hasPermission("booscooldowns.clearwarmups")
|
||
&& args[0].equalsIgnoreCase("clearwarmups")) {
|
||
String co = "warmup";
|
||
BoosConfigManager.clearSomething(co, uuid, command2);
|
||
boosChat.sendMessageToCommandSender(sender,
|
||
"&6[" + pdfFile.getName() + "]&e"
|
||
+ " warmups for command " + command2
|
||
+ " of player " + jmeno + " cleared");
|
||
return true;
|
||
|
||
}
|
||
}
|
||
else if (args.length == 4) {
|
||
if (sender.hasPermission("booscooldowns.set")
|
||
&& args[0].equalsIgnoreCase("set")) {
|
||
String what = args[1];
|
||
String comm = args[2];
|
||
String value = args[3];
|
||
String group = "default";
|
||
if (comm.startsWith("/") || comm.equals("*")) {
|
||
if (comm.contains("_")) {
|
||
comm = comm.replace("_", " ");
|
||
}
|
||
BoosConfigManager.setAddToConfigFile(group, comm, what,
|
||
value);
|
||
boosChat.sendMessageToCommandSender(sender, "&6["
|
||
+ pdfFile.getName() + "]&e " + what
|
||
+ " for command" + comm + " in group " + group
|
||
+ " is now set to " + value);
|
||
return true;
|
||
} else {
|
||
boosChat.sendMessageToCommandSender(sender, "&6["
|
||
+ pdfFile.getName() + "]&e"
|
||
+ " Command has to start with \"/\".");
|
||
return true;
|
||
}
|
||
}
|
||
|
||
}
|
||
else if (args.length == 5) {
|
||
if (sender.hasPermission("booscooldowns.set")
|
||
&& args[0].equalsIgnoreCase("set")) {
|
||
String what = args[1];
|
||
String comm = args[2];
|
||
String value = args[3];
|
||
String group = args[4];
|
||
if (comm.startsWith("/") || comm.equals("*")) {
|
||
if (comm.contains("_")) {
|
||
comm = comm.replace("_", " ");
|
||
}
|
||
BoosConfigManager.setAddToConfigFile(group, comm, what,
|
||
value);
|
||
boosChat.sendMessageToCommandSender(sender, "&6["
|
||
+ pdfFile.getName() + "]&e " + what
|
||
+ " for command" + comm + " in group " + group
|
||
+ " is now set to " + value);
|
||
return true;
|
||
} else {
|
||
boosChat.sendMessageToCommandSender(sender, "&6["
|
||
+ pdfFile.getName() + "]&e"
|
||
+ " Command has to start with \"/\".");
|
||
return true;
|
||
}
|
||
}
|
||
|
||
} else {
|
||
// boosChat.sendMessageToCommandSender(sender,
|
||
// "&6[" + pdfFile.getName() + "]&e"
|
||
// + " Invalid command or access denied!");
|
||
return false;
|
||
}
|
||
}
|
||
return false;
|
||
|
||
}
|
||
|
||
/*
|
||
* (non-Javadoc)
|
||
*
|
||
* @see org.bukkit.plugin.java.JavaPlugin#onDisable()
|
||
*/
|
||
@Override
|
||
public void onDisable() {
|
||
if (BoosConfigManager.getClearOnRestart()) {
|
||
BoosConfigManager.clear();
|
||
log.info("[" + pdfFile.getName() + "]" + " cooldowns cleared!");
|
||
} else {
|
||
BoosConfigManager.saveConfusers();
|
||
log.info("[" + pdfFile.getName() + "]" + " cooldowns saved!");
|
||
}
|
||
log.info("[" + pdfFile.getName() + "]" + " version "
|
||
+ pdfFile.getVersion() + " disabled!");
|
||
}
|
||
|
||
/*
|
||
* (non-Javadoc)
|
||
*
|
||
* @see org.bukkit.plugin.java.JavaPlugin#onEnable()
|
||
*/
|
||
@Override
|
||
public void onEnable() {
|
||
pdfFile = this.getDescription();
|
||
PluginDescriptionFile pdfFile = this.getDescription();
|
||
log.info("[" + pdfFile.getName() + "]" + " version "
|
||
+ pdfFile.getVersion() + " by " + pdfFile.getAuthors()
|
||
+ " is enabled!");
|
||
this.saveDefaultConfig();
|
||
new BoosConfigManager(this);
|
||
BoosConfigManager.load();
|
||
BoosConfigManager.loadConfusers();
|
||
pm = getServer().getPluginManager();
|
||
registerListeners();
|
||
initializeVault();
|
||
BukkitScheduler scheduler = this.getServer().getScheduler();
|
||
startLimitResetTimersGlobal();
|
||
if (BoosConfigManager.getAutoSave()) {
|
||
scheduler.scheduleSyncRepeatingTask(this, this,
|
||
BoosConfigManager.getSaveInterval() * 1200,
|
||
BoosConfigManager.getSaveInterval() * 1200);
|
||
}
|
||
|
||
if (BoosConfigManager.getClearOnRestart()) {
|
||
BoosConfigManager.clear();
|
||
}
|
||
try {
|
||
MetricsLite metrics = new MetricsLite(this);
|
||
metrics.start();
|
||
} catch (IOException e) {
|
||
// Failed to submit the stats :-(
|
||
}
|
||
|
||
}
|
||
|
||
static void startLimitResetTimersGlobal() {
|
||
YamlConfiguration confusers = BoosConfigManager.getConfusers();
|
||
ConfigurationSection global = confusers
|
||
.getConfigurationSection("global");
|
||
if (global != null) {
|
||
Set<String> globalKeys = global.getKeys(false);
|
||
BukkitScheduler scheduler = Bukkit.getScheduler();
|
||
for (String key : globalKeys) {
|
||
String confTime = confusers.getString("global." + key
|
||
+ ".reset");
|
||
long limitResetDelay = BoosConfigManager
|
||
.getLimitResetDelayGlobal(key);
|
||
Date endDate = getTime(confTime);
|
||
Date startDate = getCurrTime();
|
||
Calendar calcurrTime = Calendar.getInstance();
|
||
calcurrTime.setTime(startDate);
|
||
Calendar callastTime = Calendar.getInstance();
|
||
callastTime.setTime(endDate);
|
||
long time = secondsBetween(calcurrTime, callastTime,
|
||
limitResetDelay);
|
||
if (limitResetDelay != -65535) {
|
||
if (time <= 0) {
|
||
time = 1;
|
||
}
|
||
BoosCoolDown.getLog().info(
|
||
"[boosCooldowns] Starting timer for " + time
|
||
+ " seconds to reset limits for command "
|
||
+ key);
|
||
scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager()
|
||
.getPlugin("boosCooldowns"),
|
||
new BoosGlobalLimitResetRunnable(key), time * 20);
|
||
} else {
|
||
BoosCoolDown.getLog().info(
|
||
"[boosCooldowns] Stoping timer to reset limits for command "
|
||
+ key);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
static void startLimitResetTimerGlobal(String key) {
|
||
YamlConfiguration confusers = BoosConfigManager.getConfusers();
|
||
BukkitScheduler scheduler = Bukkit.getScheduler();
|
||
String confTime = confusers.getString("global." + key + ".reset");
|
||
long limitResetDelay = BoosConfigManager.getLimitResetDelayGlobal(key);
|
||
Date endDate = getTime(confTime);
|
||
Date startDate = getCurrTime();
|
||
Calendar calcurrTime = Calendar.getInstance();
|
||
calcurrTime.setTime(startDate);
|
||
Calendar callastTime = Calendar.getInstance();
|
||
callastTime.setTime(endDate);
|
||
long time = secondsBetween(calcurrTime, callastTime, limitResetDelay);
|
||
if (limitResetDelay != -65535) {
|
||
if (time <= 0) {
|
||
time = 1;
|
||
}
|
||
BoosCoolDown.getLog().info(
|
||
"[boosCooldowns] Starting timer for " + time
|
||
+ " seconds to reset limits for command " + key);
|
||
scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager()
|
||
.getPlugin("boosCooldowns"),
|
||
new BoosGlobalLimitResetRunnable(key), time * 20);
|
||
} else {
|
||
BoosCoolDown.getLog().info(
|
||
"[boosCooldowns] Stoping timer to reset limits for command "
|
||
+ key);
|
||
}
|
||
}
|
||
|
||
static long secondsBetween(Calendar startDate, Calendar endDate,
|
||
long limitResetDelay) {
|
||
long secondsBetween = 0;
|
||
secondsBetween = ((endDate.getTimeInMillis() - startDate
|
||
.getTimeInMillis()) / 1000) + limitResetDelay;
|
||
return secondsBetween;
|
||
}
|
||
|
||
static Date getCurrTime() {
|
||
String currTime = "";
|
||
Calendar cal = Calendar.getInstance();
|
||
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
|
||
currTime = sdf.format(cal.getTime());
|
||
Date time = null;
|
||
try {
|
||
time = sdf.parse(currTime);
|
||
return time;
|
||
} catch (ParseException e) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
static Date getTime(String confTime) {
|
||
if (confTime != null && !confTime.equals("")) {
|
||
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
|
||
Date lastDate = null;
|
||
|
||
try {
|
||
lastDate = sdf.parse(confTime);
|
||
return lastDate;
|
||
} catch (ParseException e) {
|
||
return null;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Metoda registruje poslucha<68>e v PluginManageru na z<>klad<61> konfigurace
|
||
* pluginu. Registroj<6F> se v<>dy jen nezbytn<74> poslucha<68>i. Poslucha<68>i pro
|
||
* vypnut<75> funkce nejsou registrov<6F>ni.
|
||
*/
|
||
private void registerListeners() {
|
||
HandlerList.unregisterAll(this);
|
||
pm.registerEvents(new BoosCoolDownListener(this), this);
|
||
if (BoosConfigManager.getCancelWarmUpOnDamage()) {
|
||
pm.registerEvents(new BoosEntityDamageListener(), this);
|
||
}
|
||
if (BoosConfigManager.getCleanCooldownsOnDeath()
|
||
|| BoosConfigManager.getCleanUsesOnDeath()
|
||
|| BoosConfigManager.getStartCooldownsOnDeath()) {
|
||
pm.registerEvents(new BoosPlayerDeathListener(), this);
|
||
}
|
||
if (BoosConfigManager.getCancelWarmUpOnGameModeChange()) {
|
||
pm.registerEvents(new BoosPlayerGameModeChangeListener(), this);
|
||
}
|
||
if (BoosConfigManager.getBlockInteractDuringWarmup()) {
|
||
pm.registerEvents(new BoosPlayerInteractListener(), this);
|
||
}
|
||
if (BoosConfigManager.getCancelWarmupOnMove()) {
|
||
pm.registerEvents(new BoosPlayerMoveListener(), this);
|
||
}
|
||
if (BoosConfigManager.getCancelWarmupOnSneak()) {
|
||
pm.registerEvents(new BoosPlayerToggleSneakListener(), this);
|
||
}
|
||
if (BoosConfigManager.getCancelWarmupOnSprint()) {
|
||
pm.registerEvents(new BoosPlayerToggleSprintListener(), this);
|
||
}
|
||
if (BoosConfigManager.getSignCommands()) {
|
||
pm.registerEvents(new BoosSignChangeListener(), this);
|
||
pm.registerEvents(new BoosSignInteractListener(this), this);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Metoda vol<6F> metodu pro znovuna<6E>ten<65> konfigura<72>n<EFBFBD>ho souboru a metodu pro
|
||
* registraci poslucha<68><61>.
|
||
*/
|
||
private void reload() {
|
||
BoosConfigManager.reload();
|
||
registerListeners();
|
||
}
|
||
|
||
/*
|
||
* (non-Javadoc)
|
||
*
|
||
* @see java.lang.Runnable#run()
|
||
*/
|
||
@Override
|
||
public void run() {
|
||
BoosConfigManager.saveConfusers();
|
||
BoosConfigManager.loadConfusers();
|
||
log.info("[boosCooldowns] Config saved!");
|
||
}
|
||
|
||
/**
|
||
* Metoda vrac<61> hodnotu true, pokud je na serveru dostupn<70> Ekonomick<63> plugin
|
||
* kompatibiln<6C> s pluginem Vault.
|
||
*
|
||
* @return true pokud je dostupn<70> ekonomick<63> plugin kompatibiln<6C> s pluginem
|
||
* Vault, jinak vrac<61> hodnotu false
|
||
*/
|
||
private boolean setupEconomy() {
|
||
if (usingVault) {
|
||
RegisteredServiceProvider<Economy> economyProvider = getServer()
|
||
.getServicesManager().getRegistration(
|
||
net.milkbowl.vault.economy.Economy.class);
|
||
if (economyProvider != null) {
|
||
economy = economyProvider.getProvider();
|
||
}
|
||
return (economy != null);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public static BoosCoolDown getInstance() {
|
||
if (instance == null) {
|
||
instance = new BoosCoolDown();
|
||
}
|
||
return instance;
|
||
}
|
||
}
|