3
0
Mirror von https://github.com/TheSilentPro/HeadDB.git synchronisiert 2024-12-26 02:50:07 +01:00

Economy and several other fixes

Dieser Commit ist enthalten in:
Silent 2023-02-12 22:14:40 +01:00
Ursprung 12140b8ca6
Commit e4e815f02a
13 geänderte Dateien mit 184 neuen und 75 gelöschten Zeilen

19
pom.xml
Datei anzeigen

@ -6,7 +6,7 @@
<groupId>tsp.headdb</groupId>
<artifactId>HeadDB</artifactId>
<version>5.0.0-rc.2</version>
<version>5.0.0-rc.3</version>
<packaging>jar</packaging>
<name>HeadDB</name>
@ -129,7 +129,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
@ -142,6 +142,21 @@
<mainClass>tsp.headdb.HeadDB</mainClass>
</transformer>
</transformers>
<relocations>
<relocation>
<pattern>net.wesjd.anvilgui</pattern>
<shadedPattern>tsp.headdb.core.util.anvilgui</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
<artifact>*:*</artifact>
<excludeDefaults>false</excludeDefaults>
<includes>
<include>tsp.headdb.core.util.anvilgui</include>
</includes>
</filter>
</filters>
</configuration>
</execution>
</executions>

Datei anzeigen

@ -20,10 +20,10 @@ import tsp.headdb.core.storage.Storage;
import tsp.headdb.core.task.UpdateTask;
import tsp.headdb.core.util.BuildProperties;
import tsp.headdb.core.util.HeadDBLogger;
import tsp.smartplugin.SmartPlugin;
import tsp.smartplugin.inventory.PaneListener;
import tsp.smartplugin.localization.TranslatableLocalization;
import tsp.smartplugin.logger.PluginLogger;
import tsp.smartplugin.utils.PluginUtils;
import java.io.IOException;
@ -34,7 +34,7 @@ import java.util.Optional;
public class HeadDB extends SmartPlugin {
private static HeadDB instance;
private PluginLogger logger;
private HeadDBLogger logger;
private BuildProperties buildProperties;
private TranslatableLocalization localization;
private Storage storage;
@ -45,7 +45,7 @@ public class HeadDB extends SmartPlugin {
public void onStart() {
instance = this;
instance.saveDefaultConfig();
instance.logger = new PluginLogger(this, getConfig().getBoolean("debug"));
instance.logger = new HeadDBLogger(getConfig().getBoolean("debug"));
instance.logger.info("Loading HeadDB - " + instance.getDescription().getVersion());
instance.buildProperties = new BuildProperties(this);
@ -56,7 +56,6 @@ public class HeadDB extends SmartPlugin {
instance.initEconomy();
new PaneListener(this);
//new PlayerJoinListener();
instance.commandManager = new CommandManager();
loadCommands();
@ -167,7 +166,7 @@ public class HeadDB extends SmartPlugin {
return Optional.ofNullable(economyProvider);
}
@SuppressWarnings("ConstantConditions")
@SuppressWarnings("DataFlowIssue")
private DecimalFormat decimalFormat = new DecimalFormat(getConfig().getString("economy.format"));
public DecimalFormat getDecimalFormat() {
@ -182,7 +181,7 @@ public class HeadDB extends SmartPlugin {
return buildProperties;
}
public PluginLogger getLog() {
public HeadDBLogger getLog() {
return logger;
}

Datei anzeigen

@ -16,7 +16,10 @@ import java.math.BigDecimal;
*
* @author TheSilentPro (Silent)
* @see Event#isAsynchronous()
*
* @deprecated Possible issues.
*/
@Deprecated
public class HeadPurchaseEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();

Datei anzeigen

@ -90,24 +90,12 @@ public class CommandMain extends HeadDBCommand implements CommandExecutor, TabCo
// favorites
pane.setButton(getInstance().getConfig().getInt("gui.main.meta.favorites.slot"), new Button(Utils.getItemFromConfig("gui.main.meta.favorites.item", Material.BOOK), e -> {
e.setCancelled(true);
List<Head> heads = HeadAPI.getFavoriteHeads(player.getUniqueId());
PagedPane main = Utils.createPaged(player, Utils.translateTitle(getLocalization().getMessage(player.getUniqueId(), "menu.main.favorites.name").orElse("Favorites"), heads.size(), "Favorites"));
for (Head head : heads) {
main.addButton(new Button(head.getItem(player.getUniqueId()), fe -> {
if (fe.isLeftClick()) {
ItemStack favoriteItem = head.getItem(player.getUniqueId());
if (fe.isShiftClick()) {
favoriteItem.setAmount(64);
}
player.getInventory().addItem(favoriteItem);
} else if (fe.isRightClick()) {
HeadDB.getInstance().getStorage().getPlayerStorage().removeFavorite(player.getUniqueId(), head.getTexture());
}
}));
if (!player.hasPermission("headdb.favorites")) {
HeadDB.getInstance().getLocalization().sendMessage(player, "noAccessFavorites");
return;
}
main.open(player);
Utils.openFavoritesMenu(player);
}));
// search

Datei anzeigen

@ -16,7 +16,7 @@ public class VaultProvider implements BasicEconomyProvider {
@Override
public CompletableFuture<Boolean> canPurchase(Player player, BigDecimal cost) {
double effectiveCost = cost.doubleValue();
return CompletableFuture.supplyAsync(() -> economy.has(player, effectiveCost >= 0 ? effectiveCost : 0)); // Vault is really old...
return CompletableFuture.supplyAsync(() -> economy.has(player, effectiveCost >= 0 ? effectiveCost : 0));
}
@Override
@ -28,12 +28,12 @@ public class VaultProvider implements BasicEconomyProvider {
@Override
public void init() {
if (!Bukkit.getServer().getPluginManager().isPluginEnabled("Vault")) {
if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) {
HeadDB.getInstance().getLog().error("Vault is not installed!");
return;
}
RegisteredServiceProvider<Economy> economyProvider = Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
RegisteredServiceProvider<Economy> economyProvider = Bukkit.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
if (economyProvider == null) {
HeadDB.getInstance().getLog().error("Could not find vault economy provider!");
return;

Datei anzeigen

@ -1,20 +0,0 @@
package tsp.headdb.core.listener;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import tsp.headdb.HeadDB;
public final class PlayerJoinListener implements Listener {
public PlayerJoinListener() {
Bukkit.getPluginManager().registerEvents(this, HeadDB.getInstance());
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
//HeadDB.getInstance().getStorage().getPlayerStorage().register(new PlayerData(event.getPlayer().getUniqueId(), ""));
}
}

Datei anzeigen

@ -2,11 +2,12 @@ package tsp.headdb.core.task;
import tsp.headdb.HeadDB;
import tsp.headdb.core.api.HeadAPI;
import tsp.headdb.implementation.head.Head;
import tsp.smartplugin.tasker.Task;
import java.util.List;
import java.util.concurrent.TimeUnit;
@SuppressWarnings("ClassCanBeRecord")
public class UpdateTask implements Task {
private final long interval;
@ -17,7 +18,15 @@ public class UpdateTask implements Task {
@Override
public void run() {
HeadAPI.getDatabase().update((time, heads) -> HeadDB.getInstance().getLog().debug("Fetched: " + heads.size() + " Heads | Provider: " + HeadAPI.getDatabase().getRequester().getProvider().name() + " | Time: " + time + "ms (" + TimeUnit.MILLISECONDS.toSeconds(time) + "s)"));
HeadAPI.getDatabase().update((time, heads) -> {
int size = 0;
for (List<Head> list : heads.values()) {
for (Head ignored : list) {
size++;
}
}
HeadDB.getInstance().getLog().debug("Fetched: " + size + " Heads | Provider: " + HeadAPI.getDatabase().getRequester().getProvider().name() + " | Time: " + time + "ms (" + TimeUnit.MILLISECONDS.toSeconds(time) + "s)");
});
HeadDB.getInstance().getStorage().getPlayerStorage().backup();
HeadDB.getInstance().getLog().debug("UpdateTask finished!");
}

Datei anzeigen

@ -0,0 +1,62 @@
package tsp.headdb.core.util;
import org.bukkit.Bukkit;
import tsp.smartplugin.utils.StringUtils;
public class HeadDBLogger {
private final boolean debug;
public HeadDBLogger(boolean debug) {
this.debug = debug;
}
public void info(String message) {
this.log(LogLevel.INFO, message);
}
public void warning(String message) {
this.log(LogLevel.WARNING, message);
}
public void error(String message) {
this.log(LogLevel.ERROR, message);
}
public void debug(String message) {
this.log(LogLevel.DEBUG, message);
}
public void trace(String message) {
this.log(LogLevel.TRACE, message);
}
public void log(LogLevel level, String message) {
if ((level == LogLevel.DEBUG || level == LogLevel.TRACE) && !debug) {
return;
}
Bukkit.getConsoleSender().sendMessage(StringUtils.colorize(level.getColor() + "[" + level.name() + "]: " + message));
}
public boolean isDebug() {
return this.debug;
}
public static enum LogLevel {
INFO,
WARNING,
ERROR,
DEBUG,
TRACE;
public String getColor() {
return switch (this) {
case INFO -> "\u001b[32m";
case WARNING -> "\u001b[33m";
case ERROR -> "\u001b[31m";
case DEBUG -> "\u001b[36m";
case TRACE -> "\u001b[35m";
};
}
}
}

Datei anzeigen

@ -12,7 +12,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import tsp.headdb.HeadDB;
import tsp.headdb.core.api.HeadAPI;
import tsp.headdb.core.api.event.HeadPurchaseEvent;
import tsp.headdb.core.economy.BasicEconomyProvider;
import tsp.headdb.core.hook.Hooks;
import tsp.headdb.implementation.category.Category;
@ -90,7 +89,7 @@ public class Utils {
if (item == null) {
item = new ItemStack(Material.BLACK_STAINED_GLASS_PANE);
ItemMeta meta = item.getItemMeta();
//noinspection ConstantConditions
//noinspection DataFlowIssue
meta.setDisplayName("");
item.setItemMeta(meta);
}
@ -113,6 +112,34 @@ public class Utils {
return main;
}
public static void openFavoritesMenu(Player player) {
List<Head> heads = HeadAPI.getFavoriteHeads(player.getUniqueId());
PagedPane main = Utils.createPaged(player, Utils.translateTitle(HeadDB.getInstance().getLocalization().getMessage(player.getUniqueId(), "menu.main.favorites.name").orElse("Favorites"), heads.size(), "Favorites"));
for (Head head : heads) {
main.addButton(new Button(head.getItem(player.getUniqueId()), fe -> {
if (!player.hasPermission("headdb.favorites")) {
HeadDB.getInstance().getLocalization().sendMessage(player, "noAccessFavorites");
return;
}
if (fe.isLeftClick()) {
int amount = 1;
if (fe.isShiftClick()) {
amount = 64;
}
Utils.purchase(player, head, amount);
} else if (fe.isRightClick()) {
HeadDB.getInstance().getStorage().getPlayerStorage().removeFavorite(player.getUniqueId(), head.getTexture());
HeadDB.getInstance().getLocalization().sendMessage(player, "removedFavorites");
openFavoritesMenu(player);
}
}));
}
main.open(player);
}
@ParametersAreNonnullByDefault
public static void addHeads(Player player, @Nullable Category category, PagedPane pane, Collection<Head> heads) {
for (Head head : heads) {
@ -133,7 +160,12 @@ public class Utils {
purchase(player, head, amount);
} else if (e.isRightClick()) {
HeadDB.getInstance().getStorage().getPlayerStorage().addFavorite(player.getUniqueId(), head.getTexture());
if (player.hasPermission("headdb.favorites")) {
HeadDB.getInstance().getStorage().getPlayerStorage().addFavorite(player.getUniqueId(), head.getTexture());
HeadDB.getInstance().getLocalization().sendMessage(player, "addedFavorites");
} else {
HeadDB.getInstance().getLocalization().sendMessage(player, "noAccessFavorites");
}
}
}));
}
@ -151,35 +183,52 @@ public class Utils {
.replace("%cost%", HeadDB.getInstance().getDecimalFormat().format(cost))
);
return optional.get().purchase(player, cost).thenApply(success -> {
HeadPurchaseEvent event = new HeadPurchaseEvent(player, head, cost, success);
Bukkit.getPluginManager().callEvent(event);
return !event.isCancelled() && success;
Bukkit.getScheduler().runTask(HeadDB.getInstance(), () -> {
if (success) {
HeadDB.getInstance().getLocalization().sendMessage(player, "completePayment", msg -> msg
.replace("%name%", head.getName())
.replace("%cost%", cost.toString()));
} else {
HeadDB.getInstance().getLocalization().sendMessage(player, "invalidFunds", msg -> msg.replace("%name%", head.getName()));
}
});
return success;
/* Note: Issues caused by sync call to async event but when run async above method fucks up.
Bukkit.getScheduler().runTaskAsynchronously(HeadDB.getInstance(), () -> {
HeadPurchaseEvent event = new HeadPurchaseEvent(player, head, cost, success);
Bukkit.getPluginManager().callEvent(event);
});
return true;
*/
});
}
}
private static void purchase(Player player, Head head, int amount) {
public static void purchase(Player player, Head head, int amount) {
processPayment(player, head, amount).whenComplete((success, ex) -> {
if (ex != null) {
HeadDB.getInstance().getLog().error("Failed to purchase head '" + head.getName() + "' for player: " + player.getName());
ex.printStackTrace();
} else {
// Bukkit API, therefore task is ran sync.
Bukkit.getScheduler().runTask(HeadDB.getInstance(), () -> {
ItemStack item = head.getItem(player.getUniqueId());
item.setAmount(amount);
player.getInventory().addItem(item);
HeadDB.getInstance().getConfig().getStringList("commands.purchase").forEach(command -> {
if (command.isEmpty()) {
return;
}
if (Hooks.PAPI.enabled()) {
command = PlaceholderAPI.setPlaceholders(player, command);
}
// Bukkit API, therefore task is ran sync.
Bukkit.getScheduler().runTask(HeadDB.getInstance(), () -> {
if (success) {
ItemStack item = head.getItem(player.getUniqueId());
item.setAmount(amount);
player.getInventory().addItem(item);
HeadDB.getInstance().getConfig().getStringList("commands.purchase").forEach(command -> {
if (command.isEmpty()) {
return;
}
if (Hooks.PAPI.enabled()) {
command = PlaceholderAPI.setPlaceholders(player, command);
}
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
});
}
});
});
}
});
}
@ -220,7 +269,6 @@ public class Utils {
ConfigurationSection section = HeadDB.getInstance().getConfig().getConfigurationSection(path);
Validate.notNull(section, "Section can not be null!");
System.out.println("Checking for: provided material in '" + section.getName() + "' -> " + section.getString("material"));
Material material = Material.matchMaterial(section.getString("material", def.name()));
if (material == null) {
material = def;
@ -230,7 +278,7 @@ public class Utils {
ItemMeta meta = item.getItemMeta();
if (meta != null) {
//noinspection ConstantConditions
//noinspection DataFlowIssue
meta.setDisplayName(StringUtils.colorize(section.getString("name")));
List<String> lore = new ArrayList<>();

Datei anzeigen

@ -57,7 +57,7 @@ public class Head {
GameProfile profile = new GameProfile(uniqueId, name);
profile.getProperties().put("textures", new Property("textures", texture));
try {
//noinspection ConstantConditions
//noinspection DataFlowIssue
Field profileField = meta.getClass().getDeclaredField("profile");
profileField.setAccessible(true);
profileField.set(meta, profile);

Datei anzeigen

@ -11,7 +11,7 @@ requireCategoryPermission: false
# Economy Options
economy:
enable: false
enabled: false
provider: "VAULT" # Supported: VAULT
format: "##.##"
cost:

Datei anzeigen

@ -7,6 +7,7 @@ invalidTarget: "&cInvalid target: &e%name%"
invalidCategory: "&cInvalid Category!"
invalidNumber: "&e%name% &cis not a number!"
invalidPageIndex: "&cThat page is out of bounds! Max: %pages%"
noAccessFavorites: "&cYou do not have access to favorites!"
openDatabase: "" # Intentionally empty. Sent when the main gui is opened
updateDatabase: "&7Updating..."
@ -19,10 +20,13 @@ giveCommand: "&7Gave &6x%size% %name% &7to &6%receiver%"
itemTexture: "&7Texture: &6%texture%"
itemNoTexture: "&cThis item does not have a texture!"
copyTexture: "&6Click to copy texture!"
addedFavorite: "&7Added &6%name% &7to your favorites!"
removedFavorite: "&7Removed &6%name% &7from your favorites!"
# Only shown if economy is enabled
processPayment: "&7Purchasing &6%name% &7for &6%cost%&7! Please wait..."
completePayment: "&7Received &6%name% &7for &6%cost%"
invalidFunds: "&cYou do not have enough to buy &6%name%&c!"
invalidLanguage: "&cInvalid Language! Available: &e%languages%"
languageChanged: "&7Your language was set to: &6%language%"

Datei anzeigen

@ -1,9 +1,10 @@
#file: noinspection YAMLSchemaValidation
name: ${project.name}
description: ${project.description}
main: tsp.headdb.HeadDB
version: ${project.version}
softdepend: [Vault, Treasury]
depend: ["Vault"]
api-version: 1.19
author: TheSilentPro (Silent)
spigot-id: 84967