Performs some minor changes

Changes some warning messages to info
Displays sign creation cost when unable to create a paid sign
Changes spigot dependency to 1.19
Refunds the player during reload/startup when a tracked sign's physical sign has been destroyed
This commit is contained in:
Kristian Knarvik 2022-07-13 15:53:28 +02:00
parent b1aefdd9d9
commit 35e0666a1d
6 changed files with 57 additions and 39 deletions

View File

@ -73,7 +73,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.18.1-R0.1-SNAPSHOT</version> <version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -87,7 +87,7 @@ public final class Translator {
} }
try { try {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "Loading custom strings..."); PaidSigns.getInstance().getLogger().log(Level.INFO, "Loading custom strings...");
return loadTranslatableMessages(language, new BufferedReader(new InputStreamReader(new FileInputStream(strings)))); return loadTranslatableMessages(language, new BufferedReader(new InputStreamReader(new FileInputStream(strings))));
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "Unable to load custom messages"); PaidSigns.getInstance().getLogger().log(Level.WARNING, "Unable to load custom messages");

View File

@ -71,14 +71,13 @@ public class SignListener implements Listener {
double cost = paidSign.getCost(); double cost = paidSign.getCost();
boolean canAfford = EconomyManager.canAfford(player, cost); boolean canAfford = EconomyManager.canAfford(player, cost);
if (!canAfford) { if (!canAfford) {
player.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.ERROR_CANNOT_AFFORD)); player.sendMessage(replaceCost(cost, StringFormatter.getTranslatedErrorMessage(
TranslatableMessage.ERROR_CANNOT_AFFORD)));
event.setCancelled(true); event.setCancelled(true);
} else { } else {
String unit = EconomyManager.getCurrency(cost != 1);
EconomyManager.withdraw(player, cost); EconomyManager.withdraw(player, cost);
player.sendMessage(String.format(StringFormatter.replacePlaceholders( player.sendMessage(replaceCost(cost, StringFormatter.getTranslatedInfoMessage(
StringFormatter.getTranslatedInfoMessage(TranslatableMessage.SUCCESS_PAID_FOR_SIGN), TranslatableMessage.SUCCESS_PAID_FOR_SIGN)));
new String[]{"{cost}", "{unit}"}, new String[]{"%.2f", "%s"}), cost, unit));
try { try {
TrackedSignManager.addTrackedSign(event.getBlock().getLocation(), player.getUniqueId(), cost); TrackedSignManager.addTrackedSign(event.getBlock().getLocation(), player.getUniqueId(), cost);
} catch (IOException ignored) { } catch (IOException ignored) {
@ -86,4 +85,17 @@ public class SignListener implements Listener {
} }
} }
/**
* Replaces cost and unit placeholders in the given message
*
* @param cost <p>The cost to insert</p>
* @param message <p>The original message to replace the cost placeholder for</p>
* @return <p>The message with the cost instead of the cost placeholder</p>
*/
private String replaceCost(double cost, String message) {
String unit = EconomyManager.getCurrency(cost != 1);
return String.format(StringFormatter.replacePlaceholders(message, new String[]{"{cost}", "{unit}"},
new String[]{"%.2f", "%s"}), cost, unit);
}
} }

View File

@ -88,7 +88,7 @@ public final class PaidSignManager {
YamlConfiguration configuration = YamlConfiguration.loadConfiguration(signsFile); YamlConfiguration configuration = YamlConfiguration.loadConfiguration(signsFile);
ConfigurationSection signSection = configuration.getConfigurationSection("paidSigns"); ConfigurationSection signSection = configuration.getConfigurationSection("paidSigns");
if (signSection == null) { if (signSection == null) {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "Signs section not found in data.yml"); PaidSigns.getInstance().getLogger().log(Level.INFO, "Signs section not found in data.yml");
return new HashMap<>(); return new HashMap<>();
} }

View File

@ -9,7 +9,6 @@ import org.bukkit.Location;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -59,18 +58,7 @@ public final class TrackedSignManager {
TrackedSign trackedSign = trackedSigns.get(signLocation); TrackedSign trackedSign = trackedSigns.get(signLocation);
trackedSigns.remove(signLocation); trackedSigns.remove(signLocation);
saveTrackedSigns(); saveTrackedSigns();
if (!PaidSigns.getInstance().areRefundsEnabled() || !refund) { refund(trackedSign, refund);
return;
}
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(trackedSign.getPlayerId());
double refundSum = trackedSign.getCost() / 100 * PaidSigns.getInstance().getRefundPercentage();
EconomyManager.deposit(offlinePlayer, refundSum);
if (offlinePlayer instanceof Player player) {
player.sendMessage(String.format(StringFormatter.replacePlaceholders(
StringFormatter.getTranslatedInfoMessage(TranslatableMessage.SUCCESS_REFUNDED),
new String[]{"{cost}", "{unit}"}, new String[]{"%.2f", "%s"}), refundSum,
EconomyManager.getCurrency(refundSum != 1)));
}
} }
/** /**
@ -82,17 +70,12 @@ public final class TrackedSignManager {
trackedSigns = new HashMap<>(); trackedSigns = new HashMap<>();
if (signSection == null) { if (signSection == null) {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "Tracked signs section not found in data.yml"); PaidSigns.getInstance().getLogger().log(Level.INFO, "Tracked signs section not found in data.yml");
return; return;
} }
for (String key : signSection.getKeys(false)) { for (String key : signSection.getKeys(false)) {
try { loadSign(signSection, key);
loadSign(signSection, key);
} catch (InvalidConfigurationException e) {
PaidSigns.getInstance().getLogger().log(Level.SEVERE, "Unable to load sign " + key + ": " +
e.getMessage());
}
} }
} }
@ -101,9 +84,8 @@ public final class TrackedSignManager {
* *
* @param signSection <p>The configuration section containing signs</p> * @param signSection <p>The configuration section containing signs</p>
* @param key <p>The sign key which is also the sign's location</p> * @param key <p>The sign key which is also the sign's location</p>
* @throws InvalidConfigurationException <p>If unable to load the sign</p>
*/ */
private static void loadSign(ConfigurationSection signSection, String key) throws InvalidConfigurationException { private static void loadSign(ConfigurationSection signSection, String key) {
String[] locationParts = key.split(","); String[] locationParts = key.split(",");
Location signLocation; Location signLocation;
try { try {
@ -111,20 +93,23 @@ public final class TrackedSignManager {
Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]), Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]),
Double.parseDouble(locationParts[3])); Double.parseDouble(locationParts[3]));
} catch (NumberFormatException exception) { } catch (NumberFormatException exception) {
throw new InvalidConfigurationException("Invalid sign coordinates"); PaidSigns.getInstance().getLogger().log(Level.SEVERE, "Unable to load tracked sign " + key + ": " +
} exception.getMessage());
//Prevent destroyed signs from being tracked indefinitely
if (!(signLocation.getBlock().getState() instanceof Sign)) {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "The sign at " + signLocation + " no longer " +
"exists. Removing from sign tracker.");
return; return;
} }
double cost = signSection.getDouble(key + ".cost"); double cost = signSection.getDouble(key + ".cost");
UUID playerId = UUID.fromString(Objects.requireNonNull(signSection.getString(key + ".playerId"))); UUID playerId = UUID.fromString(Objects.requireNonNull(signSection.getString(key + ".playerId")));
TrackedSign trackedSign = new TrackedSign(playerId, cost); TrackedSign trackedSign = new TrackedSign(playerId, cost);
//Prevent destroyed signs from being tracked indefinitely
if (!(signLocation.getBlock().getState() instanceof Sign)) {
PaidSigns.getInstance().getLogger().log(Level.WARNING, "The sign at " + signLocation + " no longer " +
"exists. Removing from sign tracker. Refunding the player.");
refund(trackedSign, true);
return;
}
trackedSigns.put(signLocation, trackedSign); trackedSigns.put(signLocation, trackedSign);
} }
@ -147,4 +132,25 @@ public final class TrackedSignManager {
configuration.save(signsFile); configuration.save(signsFile);
} }
/**
* Refunds the player for the sign if refunds are enabled and refund is set to true
*
* @param trackedSign <p>The tracked sign to refund for</p>
* @param refund <p>Whether to actually refund</p>
*/
private static void refund(TrackedSign trackedSign, boolean refund) {
if (!PaidSigns.getInstance().areRefundsEnabled() || !refund) {
return;
}
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(trackedSign.getPlayerId());
double refundSum = trackedSign.getCost() / 100 * PaidSigns.getInstance().getRefundPercentage();
EconomyManager.deposit(offlinePlayer, refundSum);
if (offlinePlayer instanceof Player player) {
player.sendMessage(String.format(StringFormatter.replacePlaceholders(
StringFormatter.getTranslatedInfoMessage(TranslatableMessage.SUCCESS_REFUNDED),
new String[]{"{cost}", "{unit}"}, new String[]{"%.2f", "%s"}), refundSum,
EconomyManager.getCurrency(refundSum != 1)));
}
}
} }

View File

@ -22,6 +22,6 @@ en:
ERROR_INVALID_INPUT: "&bInvalid input: {input}" ERROR_INVALID_INPUT: "&bInvalid input: {input}"
ERROR_PAID_SIGN_NOT_FOUND: "&bNo such paid sign exists" ERROR_PAID_SIGN_NOT_FOUND: "&bNo such paid sign exists"
ERROR_NO_SUCH_CONDITION: "&bThe paid sign you specified has no condition for line {line}" ERROR_NO_SUCH_CONDITION: "&bThe paid sign you specified has no condition for line {line}"
ERROR_CANNOT_AFFORD: "&bYou cannot afford to create this sign" ERROR_CANNOT_AFFORD: "&bYou cannot afford to create this sign. The cost is {cost} {unit}"
ERROR_INVALID_REGULAR_EXPRESSION: "&bThe provided regular expression is invalid" ERROR_INVALID_REGULAR_EXPRESSION: "&bThe provided regular expression is invalid"
ERROR_PROPERTY_NOT_RECOGNIZED: "&bThe property you tried to change was not recognized" ERROR_PROPERTY_NOT_RECOGNIZED: "&bThe property you tried to change was not recognized"