mirror of
https://github.com/ChestShop-authors/ChestShop-3.git
synced 2024-09-25 13:12:51 +02:00
df76347697
This includes a new price_precision config entry to set the amount of decimal places to allow on a shop sign (set to 2 by default). Thanks to @andrewkm for this idea. It also fixes an issue where a zero inside the decimal places was removed instead of it's end and also removes the point and zeros from prices that only have trailing zeros to avoid confusion (e.g. in languages that use the decimal point for thousands)
83 lines
2.6 KiB
Java
83 lines
2.6 KiB
Java
package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|
|
|
import com.Acrobot.Breeze.Utils.PriceUtil;
|
|
import com.Acrobot.ChestShop.Configuration.Properties;
|
|
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
|
|
import static com.Acrobot.Breeze.Utils.PriceUtil.isPrice;
|
|
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.INVALID_PRICE;
|
|
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
|
|
|
|
/**
|
|
* @author Acrobot
|
|
*/
|
|
public class PriceChecker implements Listener {
|
|
|
|
@EventHandler(priority = EventPriority.LOWEST)
|
|
public static void onPreShopCreation(PreShopCreationEvent event) {
|
|
String line = event.getSignLine(PRICE_LINE).toUpperCase();
|
|
if (Properties.PRICE_PRECISION <= 0) {
|
|
line = line.replaceAll("\\.\\d*", ""); //remove too many decimal places
|
|
} else {
|
|
line = line.replaceAll("(\\.\\d{0," + Properties.PRICE_PRECISION + "})\\d*", "$1"); //remove too many decimal places
|
|
}
|
|
line = line.replaceAll("(\\.\\d*[1-9])0+", "$1"); //remove trailing zeroes
|
|
line = line.replaceAll("(\\d)\\.0+(\\D|$)", "$1$2"); //remove point and zeroes from strings that only have trailing zeros
|
|
|
|
String[] part = line.split(":");
|
|
|
|
if (part.length > 1 && (isInvalid(part[0]) ^ isInvalid(part[1]))) {
|
|
line = line.replace(':', ' ');
|
|
part = new String[]{line};
|
|
}
|
|
|
|
if (part[0].split(" ").length > 2) {
|
|
event.setOutcome(INVALID_PRICE);
|
|
return;
|
|
}
|
|
|
|
if (line.indexOf('B') != line.lastIndexOf('B') || line.indexOf('S') != line.lastIndexOf('S')) {
|
|
event.setOutcome(INVALID_PRICE);
|
|
return;
|
|
}
|
|
|
|
if (isPrice(part[0])) {
|
|
line = "B " + line;
|
|
}
|
|
|
|
if (part.length > 1 && isPrice(part[1])) {
|
|
line += " S";
|
|
}
|
|
|
|
if (line.length() > 15) {
|
|
line = line.replace(" ", "");
|
|
}
|
|
|
|
if (line.length() > 15) {
|
|
event.setOutcome(INVALID_PRICE);
|
|
return;
|
|
}
|
|
|
|
event.setSignLine(PRICE_LINE, line);
|
|
|
|
if (!PriceUtil.hasBuyPrice(line) && !PriceUtil.hasSellPrice(line)) {
|
|
event.setOutcome(INVALID_PRICE);
|
|
}
|
|
}
|
|
|
|
private static boolean isInvalid(String part) {
|
|
char characters[] = {'B', 'S'};
|
|
|
|
for (char character : characters) {
|
|
if (part.contains(Character.toString(character))) {
|
|
return !PriceUtil.hasPrice(part, character);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|