This commit is contained in:
BenceX100 2024-07-31 20:14:07 +02:00
parent 09c771e1c1
commit 1989a20548
19 changed files with 444 additions and 30 deletions

11
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>com.artillexstudios</groupId>
<artifactId>AxTrade</artifactId>
<version>1.6.1</version>
<version>1.7.0</version>
<packaging>jar</packaging>
<name>AxTrade</name>
@ -112,7 +112,7 @@
<dependency>
<groupId>com.artillexstudios.axapi</groupId>
<artifactId>axapi</artifactId>
<version>1.4.280</version>
<version>1.4.315</version>
<scope>compile</scope>
<classifier>all</classifier>
</dependency>
@ -262,5 +262,12 @@
<systemPath>${project.basedir}/libs/bt-api-3.13.3.jar</systemPath>
<scope>system</scope>
</dependency>
<dependency>
<groupId>com.willfp.ecobits</groupId>
<artifactId>EcoBits</artifactId>
<version>1.8.4</version>
<systemPath>${project.basedir}/libs/EcoBits-v1.8.4.jar</systemPath>
<scope>system</scope>
</dependency>
</dependencies>
</project>

View File

@ -8,13 +8,14 @@ import com.artillexstudios.axapi.libs.boostedyaml.boostedyaml.settings.dumper.Du
import com.artillexstudios.axapi.libs.boostedyaml.boostedyaml.settings.general.GeneralSettings;
import com.artillexstudios.axapi.libs.boostedyaml.boostedyaml.settings.loader.LoaderSettings;
import com.artillexstudios.axapi.libs.boostedyaml.boostedyaml.settings.updater.UpdaterSettings;
import com.artillexstudios.axapi.utils.FeatureFlags;
import com.artillexstudios.axapi.utils.MessageUtils;
import com.artillexstudios.axapi.utils.StringUtils;
import com.artillexstudios.axtrade.commands.Commands;
import com.artillexstudios.axtrade.currencyconverter.CurrencyConverter;
import com.artillexstudios.axtrade.hooks.HookManager;
import com.artillexstudios.axtrade.lang.LanguageManager;
import com.artillexstudios.axtrade.listeners.PlayerInteractEntityListener;
import com.artillexstudios.axtrade.listeners.EntityInteractListener;
import com.artillexstudios.axtrade.listeners.TradeListeners;
import com.artillexstudios.axtrade.trade.TradeTicker;
import com.artillexstudios.axtrade.utils.NumberUtils;
@ -63,7 +64,7 @@ public final class AxTrade extends AxPlugin {
BUKKITAUDIENCES = BukkitAudiences.create(this);
getServer().getPluginManager().registerEvents(new PlayerInteractEntityListener(), this);
getServer().getPluginManager().registerEvents(new EntityInteractListener(), this);
getServer().getPluginManager().registerEvents(new TradeListeners(), this);
new HookManager().setupHooks();
@ -77,4 +78,8 @@ public final class AxTrade extends AxPlugin {
if (CONFIG.getBoolean("update-notifier.enabled", true)) new UpdateNotifier(this, 5943);
}
public void updateFlags() {
FeatureFlags.USE_LEGACY_HEX_FORMATTER.set(true);
}
}

View File

@ -0,0 +1,4 @@
package com.artillexstudios.axtrade.api;
public class AxTradeAPI {
}

View File

@ -0,0 +1,48 @@
package com.artillexstudios.axtrade.api.events;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class AxTradeRequestEvent extends Event implements Cancellable {
private static final HandlerList handlerList = new HandlerList();
private final Player sender;
private final Player receiver;
private boolean isCancelled = false;
public AxTradeRequestEvent(Player sender, Player receiver) {
this.sender = sender;
this.receiver = receiver;
}
public static HandlerList getHandlerList() {
return handlerList;
}
@NotNull
@Override
public HandlerList getHandlers() {
return handlerList;
}
@Override
public boolean isCancelled() {
return isCancelled;
}
@Override
public void setCancelled(boolean isCancelled) {
this.isCancelled = isCancelled;
}
public Player getSender() {
return sender;
}
public Player getReceiver() {
return receiver;
}
}

View File

@ -5,6 +5,7 @@ import com.artillexstudios.axtrade.hooks.currency.AxQuestBoardHook;
import com.artillexstudios.axtrade.hooks.currency.BeastTokensHook;
import com.artillexstudios.axtrade.hooks.currency.CoinsEngineHook;
import com.artillexstudios.axtrade.hooks.currency.CurrencyHook;
import com.artillexstudios.axtrade.hooks.currency.EcoBitsHook;
import com.artillexstudios.axtrade.hooks.currency.ExperienceHook;
import com.artillexstudios.axtrade.hooks.currency.KingdomsXHook;
import com.artillexstudios.axtrade.hooks.currency.PlaceholderCurrencyHook;
@ -111,6 +112,13 @@ public class HookManager {
Bukkit.getConsoleSender().sendMessage(StringUtils.formatToString("&#33FF33[AxTrade] Hooked into BeastTokens!"));
}
if (HOOKS.getBoolean("currencies.EcoBits.register", true) && Bukkit.getPluginManager().getPlugin("EcoBits") != null) {
for (Map<Object, Object> curr : HOOKS.getMapList("currencies.EcoBits.enabled")) {
currency.add(new EcoBitsHook((String) curr.get("currency-name"), (String) curr.get("name")));
}
Bukkit.getConsoleSender().sendMessage(StringUtils.formatToString("&#33FF33[AxTrade] Hooked into EcoBits!"));
}
for (String str : HOOKS.getSection("placeholder-currencies").getRoutesAsStrings(false)) {
if (!HOOKS.getBoolean("placeholder-currencies." + str + ".register", false)) continue;
currency.add(new PlaceholderCurrencyHook(str, HOOKS.getSection("placeholder-currencies." + str)));

View File

@ -0,0 +1,73 @@
package com.artillexstudios.axtrade.hooks.currency;
import com.artillexstudios.axapi.utils.StringUtils;
import com.willfp.ecobits.currencies.Currencies;
import com.willfp.ecobits.currencies.Currency;
import com.willfp.ecobits.currencies.CurrencyUtils;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import java.math.BigDecimal;
import java.util.UUID;
public class EcoBitsHook implements CurrencyHook {
private Currency currency = null;
private final String internal;
private final String name;
public EcoBitsHook(String internal, String name) {
this.internal = internal;
this.name = name;
}
@Override
public void setup() {
currency = Currencies.getByID(internal);
if (currency == null) {
Bukkit.getConsoleSender().sendMessage(StringUtils.formatToString("&#FF0000[AxAuctions] EcoBits currency named &#DD0000" + internal + " &#FF0000not found! Change the currency-name or disable the hook to get rid of this warning!"));
}
}
@Override
public String getName() {
return "EcoBits-" + internal;
}
@Override
public String getDisplayName() {
return name;
}
@Override
public boolean worksOffline() {
return false;
}
@Override
public boolean usesDouble() {
return true;
}
@Override
public boolean isPersistent() {
return false;
}
@Override
public double getBalance(@NotNull UUID player) {
if (currency == null) return 0;
return CurrencyUtils.getBalance(Bukkit.getOfflinePlayer(player), currency).doubleValue();
}
@Override
public void giveBalance(@NotNull UUID player, double amount) {
if (currency == null) return;
CurrencyUtils.adjustBalance(Bukkit.getOfflinePlayer(player), currency, BigDecimal.valueOf(amount));
}
@Override
public void takeBalance(@NotNull UUID player, double amount) {
if (currency == null) return;
CurrencyUtils.adjustBalance(Bukkit.getOfflinePlayer(player), currency, BigDecimal.valueOf(amount * -1));
}
}

View File

@ -7,12 +7,12 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.jetbrains.annotations.NotNull;
import java.util.WeakHashMap;
import java.util.HashMap;
import static com.artillexstudios.axtrade.AxTrade.CONFIG;
public class PlayerInteractEntityListener implements Listener {
private final WeakHashMap<Player, Long> cd = new WeakHashMap<>();
public class EntityInteractListener implements Listener {
private static final HashMap<Player, Long> cd = new HashMap<>();
@EventHandler (ignoreCancelled = true)
public void onClick(@NotNull PlayerInteractEntityEvent event) {
@ -23,12 +23,15 @@ public class PlayerInteractEntityListener implements Listener {
if (cd.containsKey(player) && System.currentTimeMillis() - cd.get(player) < 100L) return;
if (!player.isSneaking()) return;
if (!(event.getRightClicked() instanceof Player)) return;
if (!(event.getRightClicked() instanceof Player sendTo)) return;
cd.put(player, System.currentTimeMillis());
final Player sendTo = (Player) event.getRightClicked();
if (!sendTo.isOnline()) return;
new Commands().trade(player, sendTo);
}
public static void onQuit(Player player) {
cd.remove(player);
}
}

View File

@ -1,5 +1,7 @@
package com.artillexstudios.axtrade.listeners;
import com.artillexstudios.axtrade.request.Request;
import com.artillexstudios.axtrade.request.Requests;
import com.artillexstudios.axtrade.trade.Trade;
import com.artillexstudios.axtrade.trade.Trades;
import org.bukkit.entity.Player;
@ -12,16 +14,42 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.jetbrains.annotations.NotNull;
import java.util.Iterator;
import java.util.Map;
import static com.artillexstudios.axtrade.AxTrade.MESSAGEUTILS;
public class TradeListeners implements Listener {
@EventHandler
public void onQuit(@NotNull PlayerQuitEvent event) {
handleQuitTrade(event);
handleQuitRequest(event);
EntityInteractListener.onQuit(event.getPlayer());
}
public void handleQuitTrade(@NotNull PlayerQuitEvent event) {
final Player player = event.getPlayer();
final Trade trade = Trades.getTrade(player);
if (trade == null) return;
trade.abort();
}
public void handleQuitRequest(@NotNull PlayerQuitEvent event) {
final Iterator<Request> iterator = Requests.getRequests().iterator();
while (iterator.hasNext()) {
Request request = iterator.next();
if (request.getSender().equals(event.getPlayer())) {
iterator.remove();
continue;
}
if (request.getReceiver().equals(event.getPlayer())) {
iterator.remove();
MESSAGEUTILS.sendLang(request.getSender(), "request.expired", Map.of("%player%", request.getReceiver().getName()));
}
}
}
@EventHandler
public void onDrop(@NotNull PlayerDropItemEvent event) {
final Player player = event.getPlayer();

View File

@ -1,7 +1,13 @@
package com.artillexstudios.axtrade.request;
import com.artillexstudios.axapi.nms.NMSHandlers;
import com.artillexstudios.axapi.utils.StringUtils;
import com.artillexstudios.axtrade.api.events.AxTradeRequestEvent;
import com.artillexstudios.axtrade.trade.Trades;
import com.artillexstudios.axtrade.utils.SoundUtils;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -10,6 +16,7 @@ import java.util.ArrayList;
import java.util.Map;
import static com.artillexstudios.axtrade.AxTrade.CONFIG;
import static com.artillexstudios.axtrade.AxTrade.LANG;
import static com.artillexstudios.axtrade.AxTrade.MESSAGEUTILS;
public class Requests {
@ -63,10 +70,26 @@ public class Requests {
return;
}
final AxTradeRequestEvent apiEvent = new AxTradeRequestEvent(sender, receiver);
Bukkit.getPluginManager().callEvent(apiEvent);
if (apiEvent.isCancelled()) return;
requests.add(new Request(sender, receiver));
MESSAGEUTILS.sendLang(sender, "request.sent-sender", replacements);
MESSAGEUTILS.sendLang(receiver, "request.sent-receiver", Map.of("%player%", sender.getName()));
Map<String, String> replacements2 = Map.of("%player%", sender.getName());
if (LANG.getSection("request.sent-receiver") == null) // this is for backwards compatibility
MESSAGEUTILS.sendLang(receiver, "request.sent-receiver", replacements2);
else {
NMSHandlers.getNmsHandler().sendMessage(receiver, StringUtils.format(CONFIG.getString("prefix") + LANG.getString("request.sent-receiver.info"), replacements2));
NMSHandlers.getNmsHandler().sendMessage(receiver, StringUtils.format(LANG.getString("request.sent-receiver.accept.message"), replacements2)
.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, StringUtils.format(LANG.getString("request.sent-receiver.accept.hover"), replacements2)))
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/trade accept " + sender.getName())));
NMSHandlers.getNmsHandler().sendMessage(receiver, StringUtils.format(LANG.getString("request.sent-receiver.deny.message"), replacements2)
.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, StringUtils.format(LANG.getString("request.sent-receiver.deny.hover"), replacements2)))
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/trade deny " + sender.getName())));
}
SoundUtils.playSound(sender, "requested");
SoundUtils.playSound(receiver, "requested");
}
@ -89,4 +112,8 @@ public class Requests {
return null;
}
public static ArrayList<Request> getRequests() {
return requests;
}
}

View File

@ -150,4 +150,8 @@ public class Trade {
public TradePlayer getPlayer2() {
return player2;
}
public Player getOtherPlayer(Player player) {
return player1.getPlayer().equals(player) ? player2.getPlayer() : player1.getPlayer();
}
}

View File

@ -4,6 +4,7 @@ import com.artillexstudios.axapi.gui.SignInput;
import com.artillexstudios.axapi.nms.NMSHandlers;
import com.artillexstudios.axapi.scheduler.ScheduledTask;
import com.artillexstudios.axapi.scheduler.Scheduler;
import com.artillexstudios.axapi.utils.Pair;
import com.artillexstudios.axapi.utils.StringUtils;
import com.artillexstudios.axtrade.utils.BlackListUtils;
import com.artillexstudios.axtrade.utils.NumberUtils;
@ -32,12 +33,13 @@ import static com.artillexstudios.axtrade.AxTrade.LANG;
import static com.artillexstudios.axtrade.AxTrade.MESSAGEUTILS;
public class TradeGui extends GuiFrame {
private final Trade trade;
protected final Trade trade;
private final TradePlayer player;
protected final StorageGui gui;
protected final List<Integer> slots = getSlots("own-slots");
protected final List<Integer> otherSlots = getSlots("partner-slots");
private boolean inSign = false;
// private final ItemStack fullSlot;
public TradeGui(@NotNull Trade trade, @NotNull TradePlayer player) {
super(GUIS, player.getPlayer());
@ -50,8 +52,15 @@ public class TradeGui extends GuiFrame {
.create();
setGui(gui);
// fullSlot = new ItemBuilder(GUIS.getSection("full-slot")).get();
// NBTUtils.writeToNBT(fullSlot, "axtrade-full-slot", true);
gui.setDefaultTopClickAction(event -> {
final ItemStack it = event.getClick() == ClickType.NUMBER_KEY ? event.getView().getBottomInventory().getItem(event.getHotbarButton()) : event.getCurrentItem();
// if (it != null && NBTUtils.containsNBT(it, "axtrade-full-slot")) {
// event.setCancelled(true);
// return;
// }
if (BlackListUtils.isBlackListed(it)) {
event.setCancelled(true);
MESSAGEUTILS.sendLang(player.getPlayer(), "trade.blacklisted-item");
@ -103,6 +112,7 @@ public class TradeGui extends GuiFrame {
break;
}
Scheduler.get().run(scheduledTask -> trade.update());
if (ownInv) return;
if (!new HashSet<>(slots).containsAll(event.getInventorySlots())) {
@ -111,7 +121,6 @@ public class TradeGui extends GuiFrame {
}
player.cancel();
Scheduler.get().run(scheduledTask -> trade.update());
});
gui.setPlayerInventoryAction(event -> {
@ -148,28 +157,37 @@ public class TradeGui extends GuiFrame {
opened = true;
}
// private final HashSet<Integer> lockedSlot = new HashSet<>();
public void update() {
final Pair<String, String> selfTextures = NMSHandlers.getNmsHandler().textures(player.getPlayer());
final Pair<String, String> otherTextures = NMSHandlers.getNmsHandler().textures(trade.getOtherPlayer(player.getPlayer()));
final Map<String, String> replacements = Map.of(
"%own-head%", selfTextures == null ? "" : selfTextures.getFirst(),
"%partner-head%", otherTextures == null ? "" : otherTextures.getFirst()
);
if (player.hasConfirmed()) {
super.createItem("own.confirm-item.slot", "own.confirm-item.cancel", event -> {
event.setCancelled(true);
player.cancel();
trade.update();
}, Map.of(), player.getConfirmed());
}, replacements, player.getConfirmed());
} else {
super.createItem("own.confirm-item.slot", "own.confirm-item.accept", event -> {
event.setCancelled(true);
player.confirm();
}, Map.of());
}, replacements);
}
if (player.getOtherPlayer().hasConfirmed()) {
super.createItem("partner.confirm-item.slot", "partner.confirm-item.cancel", event -> {
event.setCancelled(true);
}, Map.of(), player.getOtherPlayer().getConfirmed());
}, replacements, player.getOtherPlayer().getConfirmed());
} else {
super.createItem("partner.confirm-item.slot", "partner.confirm-item.accept", event -> {
event.setCancelled(true);
}, Map.of());
}, replacements);
}
for (String currencyItem : GUIS.getSection("own").getRoutesAsStrings(false)) {
@ -231,12 +249,36 @@ public class TradeGui extends GuiFrame {
gui.removeItem(slot);
}
// for (Integer i : lockedSlot) {
// gui.removeItem(i);
// }
// full inventory checker - start
// var fullSlots = new ArrayList<>(slots);
//
// int empty = 0;
// for (ItemStack stack : player.getOtherPlayer().getPlayer().getInventory().getStorageContents()) {
// if (stack == null) empty++;
// }
//
// for (int i = 0; i < slots.size() - empty; i++) {
// int slot = fullSlots.remove(fullSlots.size() - 1);
// gui.updateItem(slot, fullSlot); // todo: make configurable item, add special nbt, cancel on click
// lockedSlot.add(slot);
// }
// full inventory checker - end
if (!opened) return;
var otherItems = player.getOtherPlayer().getTradeGui().getItems();
int n = 0;
for (int slot : otherSlots) {
if (otherItems.get(n) != null)
gui.updateItem(slot, new GuiItem(otherItems.get(n), event -> event.setCancelled(true)));
// if (otherItems.size() <= n) break;
// final ItemStack item = otherItems.get(n);
// if (item != null && !NBTUtils.containsNBT(item, "axtrade-full-slot")) {
// gui.updateItem(slot, new GuiItem(item, event -> event.setCancelled(true)));
// }
n++;
}
}
@ -245,6 +287,9 @@ public class TradeGui extends GuiFrame {
final List<ItemStack> items = new ArrayList<>();
for (int slot : slots) {
items.add(gui.getInventory().getItem(slot));
// final ItemStack item = gui.getInventory().getItem(slot);
// if (item != null && NBTUtils.containsNBT(item, "axtrade-full-slot")) continue;
// items.add(item);
}
return items;
}

View File

@ -1,6 +1,14 @@
package com.artillexstudios.axtrade.trade;
import com.artillexstudios.axapi.scheduler.Scheduler;
import com.artillexstudios.axtrade.request.Request;
import com.artillexstudios.axtrade.request.Requests;
import java.util.Iterator;
import java.util.Map;
import static com.artillexstudios.axtrade.AxTrade.CONFIG;
import static com.artillexstudios.axtrade.AxTrade.MESSAGEUTILS;
public class TradeTicker {
@ -16,7 +24,14 @@ public class TradeTicker {
trade.player1.tick();
trade.player2.tick();
}
final Iterator<Request> iterator = Requests.getRequests().iterator();
while (iterator.hasNext()) {
Request request = iterator.next();
if (System.currentTimeMillis() - request.getTime() <= CONFIG.getInt("trade-request-expire-seconds", 60) * 1_000L) continue;
MESSAGEUTILS.sendLang(request.getSender(), "request.expired", Map.of("%player%", request.getReceiver().getName()));
iterator.remove();
}
}, 20, 20);
}

View File

@ -36,6 +36,13 @@ public class ItemBuilderUtil {
builder.setLore(lore, replacements);
});
section.getOptionalString("texture").ifPresent((texture) -> {
for (Map.Entry<String, String> entry : replacements.entrySet()) {
texture = texture.replace(entry.getKey(), entry.getValue());
}
builder.setTextureValue(texture);
});
return builder;
}

View File

@ -0,0 +1,126 @@
package com.artillexstudios.axtrade.utils;
import com.artillexstudios.axapi.items.WrappedItemStack;
import com.artillexstudios.axapi.items.component.DataComponents;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class NBTUtils {
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, @NotNull String content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putString(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, int content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putInt(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, boolean content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putBoolean(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, double content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putDouble(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, long content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putLong(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, float content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putFloat(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static void writeToNBT(@NotNull ItemStack item, @NotNull String namespace, UUID content) {
WrappedItemStack.edit(item, wrappedItemStack -> {
var customData = wrappedItemStack.get(DataComponents.customData());
customData.putUUID(namespace, content);
wrappedItemStack.set(DataComponents.customData(), customData);
return wrappedItemStack;
});
}
public static boolean containsNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).contains(namespace);
});
}
@Nullable
public static String readStringFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
final String str = wrappedItemStack.get(DataComponents.customData()).getString(namespace);
return str.isEmpty() ? null : str;
});
}
public static int readIntegerFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getInt(namespace);
});
}
public static float readFloatFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getFloat(namespace);
});
}
public static long readLongFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getLong(namespace);
});
}
public static double readDoubleFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getDouble(namespace);
});
}
@Nullable
public static UUID readUUIDFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getUUID(namespace);
});
}
public static boolean readBooleanFromNBT(@NotNull ItemStack item, @NotNull String namespace) {
return WrappedItemStack.edit(item, wrappedItemStack -> {
return wrappedItemStack.get(DataComponents.customData()).getBoolean(namespace);
});
}
}

View File

@ -11,16 +11,13 @@ public class ShulkerUtils {
@NotNull
public static ItemStack[] getShulkerContents(@NotNull ItemStack item) {
if (!(item.getItemMeta() instanceof BlockStateMeta)) return new ItemStack[0];
final BlockStateMeta meta = (BlockStateMeta) item.getItemMeta();
if (meta.getBlockState() instanceof ShulkerBox) {
final ShulkerBox shulker = (ShulkerBox) meta.getBlockState();
if (!(item.getItemMeta() instanceof BlockStateMeta meta)) return new ItemStack[0];
if (meta.getBlockState() instanceof ShulkerBox shulker) {
if (ClassUtils.INSTANCE.classExists("com.artillexstudios.axshulkers.utils.ShulkerUtils") && com.artillexstudios.axshulkers.utils.ShulkerUtils.getShulkerUUID(item) != null) {
return com.artillexstudios.axshulkers.AxShulkers.getDB().getShulker(com.artillexstudios.axshulkers.utils.ShulkerUtils.getShulkerUUID(item));
}
return shulker.getInventory().getContents();
} else if (meta.getBlockState() instanceof Barrel) {
final Barrel barrel = (Barrel) meta.getBlockState();
} else if (meta.getBlockState() instanceof Barrel barrel) {
return barrel.getInventory().getContents();
}

View File

@ -73,6 +73,11 @@ currencies:
BeastTokens:
register: true
name: "tokens"
EcoBits:
register: true
enabled:
- currency-name: "crystals"
name: "crystals"
# do not change this
version: 7
version: 8

View File

@ -34,6 +34,9 @@ own:
slot: 0
accept:
material: "RED_CONCRETE"
# if you want, you can add head textures, like this:
#material: "PLAYER_HEAD"
#texture: "%own-head%"
name: "&#00ffdd&lᴀᴇᴘᴛ ᴛʀᴀᴅᴇ"
lore:
- ""
@ -79,6 +82,9 @@ partner:
slot: 8
accept:
material: "RED_CONCRETE"
# if you want, you can add head textures, like this:
#material: "PLAYER_HEAD"
#texture: "%partner-head%"
name: "&#00ffdd&lɪɪɴɢ ғᴏʀ ᴏᴛʜᴇʀ ᴘʟᴀʏᴇʀ"
lore:
- ""
@ -119,4 +125,4 @@ decoration-example:
name: " "
# do not change this
version: 1
version: 2

View File

@ -44,10 +44,14 @@ currency-editor:
request:
sent-sender: "&#CCFFEEYou have successfully sent a trade request to &#00FFDD%player%&#CCFFEE!"
sent-receiver: |
&#CCFFEEYou have received a trade request from &#00FFDD%player%&#CCFFEE!
&#00FF00/trade accept %player%
&#FF0000/trade deny %player%
sent-receiver:
info: "&#CCFFEEYou have received a trade request from &#00FFDD%player%&#CCFFEE!"
accept:
message: "&#00FF00/trade accept %player%"
hover: "&#00FF00Click here to &naccept&#00FF00 trade request!"
deny:
message: "&#FF0000/trade deny %player%"
hover: "&#FF0000Click here to &ndeny&#FF0000 trade request!"
no-request: "&#CCFFEEYou don't have an active trade request from &#00FFDD%player%&#CCFFEE!"
deny-sender: "&#CCFFEEYou trade request was denied by &#00FFDD%player%&#CCFFEE!"
deny-receiver: "&#CCFFEEYou have successfully denied &#00FFDD%player%&#CCFFEE's trade request!"
@ -58,6 +62,7 @@ request:
not-accepting: "&#CCFFEEThis player is not accepting trades right now!"
disallowed-gamemode: "&#CCFFEEEither you or the other player is in a disallowed gamemode!"
blacklisted-world: "&#CCFFEETrades are disabled in this world!"
expired: "&#CCFFEEYour trade request to &#00FFDD%player% &#CCFFEEhas expired!"
# this must be 4 lines
# note: currently the first line must be left empty
@ -100,4 +105,4 @@ commands:
update-notifier: "&#AAFFCCThere is a new version of the plugin available! &#DDDDDD(&#FFFFFFcurrent: &#FF0000%current% &#DDDDDD| &#FFFFFFlatest: &#00FF00%latest%&#DDDDDD)"
# do not change this
version: 4
version: 5

View File

@ -23,4 +23,5 @@ softdepend:
- TokenManager
- UltraEconomy
- RedisEconomy
- BeastTokens
- BeastTokens
- EcoBits