283 lines
9.5 KiB
Java
283 lines
9.5 KiB
Java
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;
|
||
}
|
||
}
|
||
}
|
||
} |