Skip to content
Open

QOL? #28

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ repositories {
dependencies {
compileOnly "org.spigotmc:spigot-api:1.21.8-R0.1-SNAPSHOT"
compileOnly 'com.github.brcdev-minecraft:shopgui-api:3.0.0'
compileOnly "net.kyori:adventure-api:4.24.0"
compileOnly "net.kyori:adventure-text-minimessage:4.24.0"
implementation "dev.triumphteam:triumph-gui:3.1.13"
implementation 'org.bstats:bstats-bukkit:3.1.0'
implementation "com.tcoded:FoliaLib:0.5.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.tcoded.folialib.FoliaLib;
import com.tcoded.folialib.impl.PlatformScheduler;
import net.mackenziemolloy.shopguiplus.sellgui.command.CommandSellGUI;
import net.mackenziemolloy.shopguiplus.sellgui.listeners.SellCommandListener;
import net.mackenziemolloy.shopguiplus.sellgui.utility.CommandRegistrar;
import net.mackenziemolloy.shopguiplus.sellgui.utility.CommentedConfiguration;
import net.mackenziemolloy.shopguiplus.sellgui.utility.FileUtils;
import net.mackenziemolloy.shopguiplus.sellgui.utility.LogFormatter;
Expand Down Expand Up @@ -48,6 +50,7 @@ public void onEnable() {
scheduler = foliaLib.getScheduler();

new CommandSellGUI(this).register();
getServer().getPluginManager().registerEvents(new SellCommandListener(this), this);
Logger logger = getLogger();

checkCompatibility();
Expand All @@ -56,6 +59,7 @@ public void onEnable() {
logger.info("Your server is running version '" + this.version + "'.");

generateFiles();
new CommandRegistrar(this).registerAliases();
setupMetrics();
setupUpdates();
initLogger();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,17 @@
import net.brcdev.shopgui.economy.EconomyType;
import net.brcdev.shopgui.provider.economy.EconomyProvider;
import net.mackenziemolloy.shopguiplus.sellgui.SellGUI;
import net.mackenziemolloy.shopguiplus.sellgui.event.SellGUIItemsSoldEvent;
import net.mackenziemolloy.shopguiplus.sellgui.objects.ShopItemPriceValue;
import net.mackenziemolloy.shopguiplus.sellgui.objects.SoldItemEntry;
import net.mackenziemolloy.shopguiplus.sellgui.utility.*;
import net.mackenziemolloy.shopguiplus.sellgui.utility.sirblobman.HexColorUtility;
import net.mackenziemolloy.shopguiplus.sellgui.utility.sirblobman.MessageUtility;
import net.mackenziemolloy.shopguiplus.sellgui.utility.sirblobman.VersionUtility;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.HoverEvent.Action;
import net.md_5.bungee.api.chat.TextComponent;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.title.Title;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
Expand All @@ -60,8 +61,8 @@
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;

import java.time.Duration;

@SuppressWarnings("deprecation")
public final class CommandSellGUI implements TabExecutor {
Expand Down Expand Up @@ -95,8 +96,14 @@ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Comman
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String @NotNull [] args) {
if (!plugin.compatible) {
String message = MessageUtility.color("&7\n&7\n&a&lUPDATE REQUIRED \n&7\n&7Unfortunately &fSellGUI &7will not work until you update &cShopGUIPlus&7 to version &c1.78.0&7 or above.\n&7\n&eDownload: https://spigotmc.org/resources/6515/\n&7\n&7");
sender.sendMessage(message);
Component message = MessageUtility.toComponent(
"&7\n&7\n&a&lUPDATE REQUIRED \n&7\n&7Unfortunately &fSellGUI &7will not work until you update &cShopGUIPlus&7 to version &c1.78.0&7 or above.\n&7\n&eDownload: https://spigotmc.org/resources/6515/\n&7\n&7",
false);
if (sender instanceof Player player) {
audience(player).sendMessage(message);
} else {
sender.sendMessage(MessageUtility.toPlainText(message));
}
return false;
}

Expand Down Expand Up @@ -128,6 +135,8 @@ private boolean commandReload(CommandSender sender) {
if (!this.plugin.getConfiguration().getBoolean("options.transaction_log.enabled", false)) this.plugin.closeLogger();
else if (this.plugin.fileLogger == null) this.plugin.initLogger();

new CommandRegistrar(this.plugin).registerAliases();

sendMessage(sender, "reloaded_config");
if (sender instanceof Player player) {
PlayerHandler.playSound(player, "success");
Expand Down Expand Up @@ -208,8 +217,7 @@ private boolean commandBase(CommandSender sender) {
guiSize = 6;
}

String sellGuiTitle = getMessage("sellgui_title", null);
Component sellGuiTitleComponent = LegacyComponentSerializer.legacySection().deserialize(sellGuiTitle);
Component sellGuiTitleComponent = getComponent("sellgui_title", null);
Gui gui = Gui.gui().title(sellGuiTitleComponent).rows(guiSize).create();
PlayerHandler.playSound(player, "open");

Expand Down Expand Up @@ -445,6 +453,13 @@ private void onGuiClose(Player player, InventoryCloseEvent event, Set<Integer> i
formattedPricing.length() - 2));
}

Bukkit.getPluginManager().callEvent(new SellGUIItemsSoldEvent(
player,
buildSoldItemEntries(soldMap2, itemStackSellPriceCache),
moneyMap,
totalPrice,
itemAmount));

List<String> receiptList = new LinkedList<>();
List<String> itemList = new LinkedList<>();

Expand Down Expand Up @@ -482,12 +497,11 @@ private void onGuiClose(Player player, InventoryCloseEvent event, Set<Integer> i
}

String finalItemNameFormatted = itemNameFormatted;
String itemLine = getMessage("receipt_item_layout", message -> message
String finalProfitsFormatted = profitsFormatted;
receiptList.add(getMessage("receipt_item_layout", message -> message
.replace("{amount}", String.valueOf(damageEntry.getValue()))
.replace("{item}", finalItemNameFormatted)
.replace("{price}", profitsFormatted));

receiptList.add(itemLine);
.replace("{price}", finalProfitsFormatted)));
itemList.add(itemNameFormatted);
}
}
Expand All @@ -498,22 +512,22 @@ private void onGuiClose(Player player, InventoryCloseEvent event, Set<Integer> i
int finalItemAmount = itemAmount;
StringBuilder finalFormattedPricing1 = formattedPricing;

TextComponent itemsSoldComponent = getTextComponentMessage("items_sold", message -> message
Component itemsSoldComponent = getComponent("items_sold", message -> message
.replace("{earning}", finalFormattedPricing1)
.replace("{receipt}", "")
.replace("{list}", String.join(", ", itemList))
.replace("{amount}", String.valueOf(finalItemAmount)));
itemsSoldComponent.addExtra(" ");

String receiptHoverMessage = (getMessage("receipt_title", null) + ChatColor.RESET + String.join("\n", receiptList) + ChatColor.RESET);

TextComponent receiptNameComponent = getTextComponentMessage("receipt_text", null);
BaseComponent[] hoverEventComponents = TextComponent.fromLegacyText(receiptHoverMessage);
Component receiptHover = getComponent("receipt_title", null);
for (String receiptLine : receiptList) {
receiptHover = receiptHover.append(Component.newline())
.append(MessageUtility.toComponent(receiptLine, useMiniMessage()));
}

HoverEvent hoverEvent = new HoverEvent(Action.SHOW_TEXT, hoverEventComponents);
receiptNameComponent.setHoverEvent(hoverEvent);
Component receiptNameComponent = getComponent("receipt_text", null)
.hoverEvent(HoverEvent.showText(receiptHover));

sendMessage(player, Arrays.asList(itemsSoldComponent, receiptNameComponent));
sendMessage(player, itemsSoldComponent.append(Component.space()).append(receiptNameComponent));
} else {
StringBuilder finalFormattedPricing = formattedPricing;
sendMessage(player, "items_sold", message -> message.replace("{earning}",
Expand All @@ -537,79 +551,93 @@ private void onGuiClose(Player player, InventoryCloseEvent event, Set<Integer> i
}
}

private String getMessage(String path, @Nullable Function<String, String> replacer) {
private List<SoldItemEntry> buildSoldItemEntries(
Map<ItemStack, Map<Short, Integer>> soldMap,
Map<ItemStack, ShopItemPriceValue> priceCache) {
List<SoldItemEntry> soldItems = new ArrayList<>();
for (Entry<ItemStack, Map<Short, Integer>> entry : soldMap.entrySet()) {
ItemStack item = entry.getKey();
ShopItemPriceValue priceValue = priceCache.get(item);
if (priceValue == null) {
continue;
}

for (Entry<Short, Integer> damageEntry : entry.getValue().entrySet()) {
int amount = damageEntry.getValue();
double totalItemPrice = priceValue.getSellPrice() * amount;
soldItems.add(new SoldItemEntry(item, amount, totalItemPrice, priceValue.getEconomyType()));
}
}
return soldItems;
}

private boolean useMiniMessage() {
String format = this.plugin.getConfiguration().getString("options.messages.format", "legacy");
return MessageUtility.usesMiniMessage(format);
}

private Component getComponent(String path, @Nullable Function<String, String> replacer) {
CommentedConfiguration configuration = this.plugin.getConfiguration();
String message = configuration.getString("messages." + path, "");
if (message.isEmpty()) {
return "";
return Component.empty();
}

if (replacer != null) {
message = replacer.apply(message);
}

return MessageUtility.color(HexColorUtility.replaceHexColors('&', message));
return MessageUtility.toComponent(message, useMiniMessage());
}

private TextComponent getTextComponentMessage(String path, @Nullable Function<String, String> replacer) {
String message = getMessage(path, replacer);
if (message.isEmpty()) {
return new TextComponent("");
} else {
BaseComponent[] components = TextComponent.fromLegacyText(message);
TextComponent root = new TextComponent("");
for (BaseComponent component : components) {
root.addExtra(component);
}

return root;
}
private String getMessage(String path, @Nullable Function<String, String> replacer) {
return MessageUtility.toPlainText(getComponent(path, replacer));
}

private void sendMessage(CommandSender sender, String path) {
sendMessage(sender, path, null);
}

private void sendMessage(CommandSender sender, String path, @Nullable Function<String, String> replacer) {
String message = getMessage(path, replacer);
if (message.isEmpty()) {
Component message = getComponent(path, replacer);
if (Component.empty().equals(message)) {
return;
}

if (sender instanceof Player player) {
BaseComponent[] components = TextComponent.fromLegacyText(message);
player.spigot().sendMessage(components);
audience(player).sendMessage(message);
} else {
sender.sendMessage(message);
sender.sendMessage(MessageUtility.toPlainText(message));
}
}

private void sendMessage(Player player, List<TextComponent> textComponents) {
boolean isTextPresent = textComponents.stream()
.anyMatch(component -> component.getText() != null && !component.getText().isEmpty()
|| component.getExtra() != null && !component.getExtra().isEmpty());

if (!isTextPresent) {
private void sendMessage(Player player, Component message) {
if (Component.empty().equals(message)) {
return;
}

player.spigot().sendMessage(textComponents.toArray(new BaseComponent[0]));
audience(player).sendMessage(message);
}

private void sendSellTitles(Player player, CharSequence price, String amount) {
Function<String, String> replacer = message -> message.replace("{earning}", price)
.replace("{amount}", amount);

String title = getMessage("sell_title", replacer);
String subtitle = getMessage("sell_subtitle", replacer);
player.sendTitle(title, subtitle);
Title title = Title.title(
getComponent("sell_title", replacer),
getComponent("sell_subtitle", replacer),
Title.Times.times(Duration.ofMillis(500), Duration.ofSeconds(3), Duration.ofMillis(500)));
audience(player).showTitle(title);
}

private void sendActionBar(Player player, CharSequence price, String amount) {
Function<String, String> replacer = message -> message.replace("{earning}", price)
.replace("{amount}", amount);

TextComponent message = getTextComponentMessage("action_bar_items_sold", replacer);
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, message);
audience(player).sendActionBar(getComponent("action_bar_items_sold", replacer));
}

private static Audience audience(Player player) {
return (Audience) player;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package net.mackenziemolloy.shopguiplus.sellgui.event;

import java.util.Collections;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;

import net.brcdev.shopgui.economy.EconomyType;
import net.mackenziemolloy.shopguiplus.sellgui.objects.SoldItemEntry;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;

public final class SellGUIItemsSoldEvent extends PlayerEvent {

private static final HandlerList HANDLER_LIST = new HandlerList();

private final List<SoldItemEntry> soldItems;
private final Map<EconomyType, Double> earnings;
private final double totalEarnings;
private final int totalItemCount;

public SellGUIItemsSoldEvent(
@NotNull Player player,
@NotNull List<SoldItemEntry> soldItems,
@NotNull Map<EconomyType, Double> earnings,
double totalEarnings,
int totalItemCount) {
super(player);
this.soldItems = Collections.unmodifiableList(soldItems);
this.earnings = Collections.unmodifiableMap(new EnumMap<>(earnings));
this.totalEarnings = totalEarnings;
this.totalItemCount = totalItemCount;
}

public @NotNull List<SoldItemEntry> getSoldItems() {
return soldItems;
}

public @NotNull Map<EconomyType, Double> getEarnings() {
return earnings;
}

public double getTotalEarnings() {
return totalEarnings;
}

public int getTotalItemCount() {
return totalItemCount;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLER_LIST;
}

public static @NotNull HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package net.mackenziemolloy.shopguiplus.sellgui.listeners;

import net.mackenziemolloy.shopguiplus.sellgui.SellGUI;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;

import java.util.List;
import java.util.Locale;

public final class SellCommandListener implements Listener {

private final SellGUI plugin;

public SellCommandListener(SellGUI plugin) {
this.plugin = plugin;
}

@EventHandler(priority = EventPriority.LOWEST)
public void onCommandPreProcess(PlayerCommandPreprocessEvent event) {
String message = event.getMessage();
String[] args = message.split(" ");

if (args.length != 1) {
return;
}

String command = args[0].substring(1).toLowerCase(Locale.US);
List<String> aliases = plugin.getConfiguration().getStringList("options.commands.aliases");

if (aliases.contains(command)) {
event.setCancelled(true);
plugin.getCommand("sellgui").execute(event.getPlayer(), "sellgui", new String[0]);
}
}
}
Loading