boosCooldowns/src/main/java/cz/boosik/boosCooldown/BoosCoolDownListener.java

283 lines
9.5 KiB
Java
Raw Blame History

package cz.boosik.boosCooldown;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import util.boosChat;
/**
* Hlavn<76> poslucha<68>, kter<65> naslouch<63> ud<75>losti pou<6F>it<69> p<><70>kazu hr<68><72>em.
* Kontroluje, jestli jsou pro p<><70>kaz nastaveny omezen<65> a na z<>klad<61> tohoto
* spou<6F>t<EFBFBD> <20>asova<76>e a vol<6F> metody spojen<65> s poplatky a limity.
*
* @author Jakub Kol<6F><6C>
*
*/
public class BoosCoolDownListener implements Listener {
private static BoosCoolDown plugin;
/**
* @param instance
*/
public BoosCoolDownListener(BoosCoolDown instance) {
plugin = instance;
}
/**
* Metoda zkontroluje pomoc<6F> vol<6F>n<EFBFBD> dal<61><6C>ch metod, jestli p<>ikaz kter<65> hr<68><72>
* pou<6F>il je n<>jak<61>m zp<7A>sobem omezen<65> a na z<>klad<61> toho je bu<62> ud<75>lost
* pou<6F>it<69> p<><70>kazu stornov<6F>na, nebo ne.
*
* @param event
* ud<75>lost PlayerCommandPreprocessEvent
* @param player
* hr<68><72> kter<65> spustil tuto ud<75>lost
* @param regexCommad
* p<><70>kaz z konfigura<72>n<EFBFBD>ho souboru, kter<65> vyhovuje origin<69>ln<6C>mu
* p<><70>kazu
* @param originalCommand
* origin<69>ln<6C> p<><70>kaz kter<65> hr<68><72> pou<6F>il
* @param warmupTime
* warmup doba nastaven<65> pro regexCommand
* @param cooldownTime
* cooldown doba nastaven<65> pro regexCommand
* @param price
* cena nastaven<65> pro regexCommand
* @param limit
* limit nastaven<65> pro regexCommand
*/
private void checkRestrictions(PlayerCommandPreprocessEvent event,
Player player, String regexCommad, String originalCommand,
int warmupTime, int cooldownTime, double price, String item,
int count, int limit, int xpPrice) {
boolean blocked = false;
if (limit != -1) {
blocked = BoosLimitManager.blocked(player, regexCommad,
originalCommand, limit);
}
if (!blocked) {
if (warmupTime > 0) {
if (!player.hasPermission("booscooldowns.nowarmup")
&& !player.hasPermission("booscooldowns.nowarmup."
+ originalCommand)) {
start(event, player, regexCommad, originalCommand,
warmupTime, cooldownTime);
}
} else if (BoosPriceManager.has(player, price)
& BoosItemCostManager.has(player, item, count)
& BoosXpCostManager.has(player, xpPrice)) {
if (BoosCoolDownManager.coolDown(player, regexCommad,
originalCommand, cooldownTime)) {
event.setCancelled(true);
}
}
if (BoosPriceManager.has(player, price)
& BoosItemCostManager.has(player, item, count)
& BoosXpCostManager.has(player, xpPrice)) {
if (!event.isCancelled()) {
BoosPriceManager.payForCommand(event, player, regexCommad,
originalCommand, price);
}
if (!event.isCancelled()) {
BoosItemCostManager.payItemForCommand(event, player,
regexCommad, originalCommand, item, count);
}
if (!event.isCancelled()) {
BoosXpCostManager.payXPForCommand(event, player,
regexCommad, originalCommand, xpPrice);
}
} else {
if (!BoosPriceManager.has(player, price)
& !BoosWarmUpManager.isWarmUpProcess(player,
regexCommad)) {
String unit;
String msg = "";
if (price == 1) {
unit = BoosCoolDown.getEconomy().currencyNameSingular();
} else {
unit = BoosCoolDown.getEconomy().currencyNamePlural();
}
msg = String.format(
BoosConfigManager.getInsufficientFundsMessage(),
(price + " " + unit),
BoosCoolDown.getEconomy().format(
BoosCoolDown.getEconomy()
.getBalance(player)));
msg = msg.replaceAll("&command&", originalCommand);
boosChat.sendMessageToPlayer(player, msg);
}
if (!BoosItemCostManager.has(player, item, count)
& !BoosWarmUpManager.isWarmUpProcess(player,
regexCommad)) {
String msg = "";
msg = String.format(
BoosConfigManager.getInsufficientItemsMessage(),
(count + " " + item));
msg = msg.replaceAll("&command&", originalCommand);
boosChat.sendMessageToPlayer(player, msg);
}
if (!BoosXpCostManager.has(player, xpPrice)
& !BoosWarmUpManager.isWarmUpProcess(player,
regexCommad)) {
String msg = "";
msg = String.format(
BoosConfigManager.getInsufficientXpMessage(),
(xpPrice));
msg = msg.replaceAll("&command&", originalCommand);
boosChat.sendMessageToPlayer(player, msg);
}
event.setCancelled(true);
}
if (!event.isCancelled()) {
String msg = String.format(BoosConfigManager.getMessage(
regexCommad, player));
if (!msg.equals("")) {
boosChat.sendMessageToPlayer(player, msg);
}
}
} else {
event.setCancelled(true);
}
if (!event.isCancelled()) {
BoosLimitManager.setUses(player, regexCommad);
if (BoosConfigManager.getCommandLogging()) {
BoosCoolDown.commandLogger(player.getName(), originalCommand);
}
}
}
/**
* Poslucha<68>, kter<65> naslouch<63> ud<75>losti pou<6F>it<69> p<><70>kazu a spou<6F>t<EFBFBD> se je<6A>t<EFBFBD>
* p<>ed t<>m, ne<6E> je vykon<6F>n efekt tohto p<><70>kazu. Metoda zji<6A><69>uje, jestli
* p<><70>kaz nen<65> alias jin<69>ho p<><70>kazu a tak<61> jestli se p<><70>kaz kter<65> hr<68><72>
* pou<6F>il shoduje s p<><70>kazem nastaven<65>m v konfiguraci. Pokud se shoduje, pak
* jsou na<6E>teny informace o warmup dob<6F>, cooldown dob<6F>, poplatku a limitu.
* Tyto hodnoty jsou pot<6F> p<>ed<65>ny metod<6F> checkRestrictions();.
*
* @param event
* ud<75>lost PlayerCommandPreprocessEvent
*/
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
private void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
Player player = event.getPlayer();
if (event.getMessage().contains(":")) {
Pattern p = Pattern.compile("^/([a-zA-Z0-9_]+):");
Matcher m = p.matcher(event.getMessage());
if (m.find()) {
{
boosChat.sendMessageToPlayer(player, BoosConfigManager
.getInvalidCommandSyntaxMessage(player));
event.setCancelled(true);
return;
}
}
}
String originalCommand = event.getMessage().replace("\\", "\\\\");
originalCommand = originalCommand.replace("$", "S");
originalCommand = originalCommand.trim().replaceAll(" +", " ");
String regexCommad = "";
Set<String> aliases = BoosConfigManager.getAliases();
Set<String> commands = BoosConfigManager.getCommands(player);
boolean on = true;
String item = "";
int count = 0;
int warmupTime = 0;
double price = 0;
int limit = -1;
int cooldownTime = 0;
int xpPrice = 0;
on = BoosCoolDown.isPluginOnForPlayer(player);
if (aliases != null) {
originalCommand = BoosAliasManager.checkCommandAlias(
originalCommand, aliases, player);
event.setMessage(originalCommand);
}
if (on && commands != null) {
for (String group : commands) {
String group2 = group.replace("*", ".+");
if (originalCommand.matches("(?i)" + group2)) {
regexCommad = group;
if (BoosConfigManager.getWarmupEnabled()) {
warmupTime = BoosConfigManager.getWarmUp(regexCommad,
player);
}
if (BoosConfigManager.getCooldownEnabled()) {
cooldownTime = BoosConfigManager.getCoolDown(
regexCommad, player);
}
if (BoosConfigManager.getPriceEnabled()) {
price = BoosConfigManager.getPrice(regexCommad, player);
}
if (BoosConfigManager.getXpPriceEnabled()) {
xpPrice = BoosConfigManager.getXpPrice(regexCommad,
player);
}
if (BoosConfigManager.getItemCostEnabled()) {
item = BoosConfigManager.getItemCostItem(regexCommad,
player);
count = BoosConfigManager.getItemCostCount(regexCommad,
player);
}
if (BoosConfigManager.getLimitEnabled()) {
limit = BoosConfigManager.getLimit(regexCommad, player);
}
break;
}
}
this.checkRestrictions(event, player, regexCommad, originalCommand,
warmupTime, cooldownTime, price, item, count, limit,
xpPrice);
}
}
/**
* Metoda spou<6F>t<EFBFBD> warmup a cooldown <20>asova<76>e, p<><70>padn<64> je ukon<6F>uje, pokud
* ji<6A> tyto <20>asova<76>e skon<6F>ili.
*
* @param event
* ud<75>lost PlayerCommandPreprocessEvent
* @param player
* hr<68><72> kter<65> spustil tuto ud<75>lost
* @param regexCommad
* p<><70>kaz z konfigura<72>n<EFBFBD>ho souboru, kter<65> vyhovuje origin<69>ln<6C>mu
* p<><70>kazu
* @param originalCommand
* origin<69>ln<6C> p<><70>kaz kter<65> hr<68><72> pou<6F>il
* @param warmupTime
* warmup doba nastaven<65> pro regexCommand
* @param cooldownTime
* cooldown doba nastaven<65> pro regexCommand
*/
private void start(PlayerCommandPreprocessEvent event, Player player,
String regexCommad, String originalCommand, int warmupTime,
int cooldownTime) {
if (!BoosWarmUpManager.checkWarmUpOK(player, regexCommad)) {
if (BoosCoolDownManager.checkCoolDownOK(player, regexCommad,
originalCommand, cooldownTime)) {
BoosWarmUpManager.startWarmUp(plugin, player, regexCommad,
originalCommand, warmupTime);
event.setCancelled(true);
return;
} else {
event.setCancelled(true);
return;
}
} else {
if (BoosCoolDownManager.coolDown(player, regexCommad,
originalCommand, cooldownTime)) {
event.setCancelled(true);
return;
} else {
BoosWarmUpManager.removeWarmUpOK(player, regexCommad);
return;
}
}
}
}