mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2025-12-19 15:09:24 +00:00
1.3.0.15
This commit is contained in:
@@ -4,7 +4,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = 'net.momirealms'
|
||||
version = '1.3.0.14'
|
||||
version = '1.3.0.15'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
||||
@@ -26,6 +26,8 @@ import net.momirealms.customfishing.commands.SellFishCommand;
|
||||
import net.momirealms.customfishing.helper.LibraryLoader;
|
||||
import net.momirealms.customfishing.helper.VersionHelper;
|
||||
import net.momirealms.customfishing.manager.*;
|
||||
import net.momirealms.customfishing.object.Reflection;
|
||||
import net.momirealms.customfishing.scheduler.Scheduler;
|
||||
import net.momirealms.customfishing.util.AdventureUtils;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.Bukkit;
|
||||
@@ -52,6 +54,7 @@ public final class CustomFishing extends JavaPlugin {
|
||||
private OffsetManager offsetManager;
|
||||
private StatisticsManager statisticsManager;
|
||||
private VersionHelper versionHelper;
|
||||
private Scheduler scheduler;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
@@ -76,9 +79,11 @@ public final class CustomFishing extends JavaPlugin {
|
||||
this.sellManager = new SellManager(this);
|
||||
this.bagDataManager = new BagDataManager(this);
|
||||
this.offsetManager = new OffsetManager(this);
|
||||
this.scheduler = new Scheduler(this);
|
||||
this.reload();
|
||||
this.registerCommands();
|
||||
this.registerQuests();
|
||||
Reflection.load();
|
||||
AdventureUtils.consoleMessage("[CustomFishing] Plugin Enabled!");
|
||||
if (ConfigManager.bStats) new Metrics(this, 16648);
|
||||
if (ConfigManager.updateChecker) this.versionHelper.checkUpdate();
|
||||
@@ -97,6 +102,7 @@ public final class CustomFishing extends JavaPlugin {
|
||||
if (this.sellManager != null) this.sellManager.disable();
|
||||
if (this.statisticsManager != null) this.statisticsManager.disable();
|
||||
if (this.dataManager != null) this.dataManager.disable();
|
||||
if (this.scheduler != null) scheduler.disable();
|
||||
if (adventure != null) adventure.close();
|
||||
}
|
||||
|
||||
@@ -188,6 +194,10 @@ public final class CustomFishing extends JavaPlugin {
|
||||
public OffsetManager getOffsetManager() {
|
||||
return offsetManager;
|
||||
}
|
||||
|
||||
public Scheduler getScheduler() {
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
ConfigManager.load();
|
||||
|
||||
@@ -20,6 +20,7 @@ package net.momirealms.customfishing.data.storage;
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.data.PlayerSellData;
|
||||
import net.momirealms.customfishing.data.PlayerStatisticsData;
|
||||
import net.momirealms.customfishing.manager.ConfigManager;
|
||||
import net.momirealms.customfishing.util.ConfigUtils;
|
||||
import net.momirealms.customfishing.util.InventoryUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
@@ -59,7 +60,7 @@ public class FileStorageImpl implements DataStorageInterface {
|
||||
int size = config.getInt("size", 9);
|
||||
ItemStack[] itemStacks = InventoryUtils.getInventoryItems(contents);
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
|
||||
Inventory inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}");
|
||||
Inventory inventory = InventoryUtils.createInventory(null, size, plugin.getIntegrationManager().getPlaceholderManager().parse(offlinePlayer, ConfigManager.fishingBagTitle));
|
||||
if (itemStacks != null) inventory.setContents(itemStacks);
|
||||
return inventory;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,10 @@ import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.Calendar;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class MySQLStorageImpl implements DataStorageInterface {
|
||||
|
||||
@@ -80,14 +83,12 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
int size = rs.getInt(3);
|
||||
String contents = rs.getString(4);
|
||||
ItemStack[] itemStacks = InventoryUtils.getInventoryItems(contents);
|
||||
if (plugin.getVersionHelper().isSpigot()) inventory = Bukkit.createInventory(null, size, AdventureUtils.replaceMiniMessage(ConfigManager.fishingBagTitle.replace("{player}", Optional.ofNullable(offlinePlayer.getName()).orElse(""))));
|
||||
else inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}");
|
||||
inventory = InventoryUtils.createInventory(null, size, plugin.getIntegrationManager().getPlaceholderManager().parse(offlinePlayer, ConfigManager.fishingBagTitle));
|
||||
if (itemStacks != null) inventory.setContents(itemStacks);
|
||||
lockData(uuid, "fishingbag");
|
||||
}
|
||||
else {
|
||||
if (plugin.getVersionHelper().isSpigot()) inventory = Bukkit.createInventory(null, 9, AdventureUtils.replaceMiniMessage(ConfigManager.fishingBagTitle.replace("{player}", Optional.ofNullable(offlinePlayer.getName()).orElse(""))));
|
||||
else inventory = Bukkit.createInventory(null, 9, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}");
|
||||
inventory = InventoryUtils.createInventory(null, 9, plugin.getIntegrationManager().getPlaceholderManager().parse(offlinePlayer, ConfigManager.fishingBagTitle));
|
||||
insertBagData(uuid, InventoryUtils.toBase64(inventory.getContents()));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
|
||||
@@ -28,6 +28,7 @@ import net.momirealms.customfishing.manager.ConfigManager;
|
||||
import net.momirealms.customfishing.manager.MessageManager;
|
||||
import net.momirealms.customfishing.util.AdventureUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
@@ -211,7 +212,7 @@ public class Competition {
|
||||
return competitionConfig;
|
||||
}
|
||||
|
||||
public String getPlayerRank(Player player) {
|
||||
public String getPlayerRank(OfflinePlayer player) {
|
||||
return Optional.ofNullable(ranking.getPlayerRank(player.getName())).orElse(MessageManager.noRank);
|
||||
}
|
||||
|
||||
@@ -219,7 +220,7 @@ public class Competition {
|
||||
return remainingTime;
|
||||
}
|
||||
|
||||
public double getScore(Player player) {
|
||||
public double getScore(OfflinePlayer player) {
|
||||
return Optional.ofNullable(ranking.getCompetitionPlayer(player.getName())).orElse(CompetitionPlayer.emptyPlayer).getScore();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ import net.momirealms.customfishing.fishing.competition.Competition;
|
||||
import net.momirealms.customfishing.manager.MessageManager;
|
||||
import net.momirealms.customfishing.object.Function;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -61,16 +61,15 @@ public class PlaceholderManager extends Function {
|
||||
if (this.statisticsPapi != null) statisticsPapi.unregister();
|
||||
}
|
||||
|
||||
public String parse(Player player, String text) {
|
||||
public String parse(OfflinePlayer player, String text) {
|
||||
if (hasPlaceholderAPI) {
|
||||
return ParseUtil.setPlaceholders(player, parseInner(player, text));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return parseInner(player, text);
|
||||
}
|
||||
}
|
||||
|
||||
public String parseInner(Player player, String text) {
|
||||
public String parseInner(OfflinePlayer player, String text) {
|
||||
List<String> papis = detectBetterPlaceholders(text);
|
||||
for (String papi : papis) {
|
||||
text = text.replace(papi, parseSingleInner(player, papi));
|
||||
@@ -78,11 +77,10 @@ public class PlaceholderManager extends Function {
|
||||
return text;
|
||||
}
|
||||
|
||||
public String parseSinglePlaceholder(Player player, String placeholder) {
|
||||
public String parseSinglePlaceholder(OfflinePlayer player, String placeholder) {
|
||||
if (placeholder.startsWith("{")) {
|
||||
return parseSingleInner(player, placeholder);
|
||||
}
|
||||
else if (hasPlaceholderAPI) {
|
||||
} else if (hasPlaceholderAPI) {
|
||||
return ParseUtil.setPlaceholders(player, placeholder);
|
||||
}
|
||||
return placeholder;
|
||||
@@ -113,7 +111,7 @@ public class PlaceholderManager extends Function {
|
||||
return hasPlaceholderAPI ? detectAllPlaceholders(text) : detectBetterPlaceholders(text);
|
||||
}
|
||||
|
||||
public String parseSingleInner(Player player, String placeholder) {
|
||||
public String parseSingleInner(OfflinePlayer player, String placeholder) {
|
||||
switch (placeholder) {
|
||||
case "{player}" -> {
|
||||
return player.getName();
|
||||
|
||||
@@ -17,19 +17,15 @@
|
||||
|
||||
package net.momirealms.customfishing.manager;
|
||||
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.reflect.StructureModifier;
|
||||
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||
import de.tr7zw.changeme.nbtapi.NBTCompound;
|
||||
import de.tr7zw.changeme.nbtapi.NBTItem;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.listener.InventoryListener;
|
||||
import net.momirealms.customfishing.listener.JoinQuitListener;
|
||||
import net.momirealms.customfishing.listener.WindowPacketListener;
|
||||
import net.momirealms.customfishing.object.InventoryFunction;
|
||||
import net.momirealms.customfishing.util.AdventureUtils;
|
||||
import net.momirealms.customfishing.util.InventoryUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
@@ -150,26 +146,6 @@ public class BagDataManager extends InventoryFunction {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWindowTitlePacketSend(PacketContainer packet, Player receiver) {
|
||||
StructureModifier<WrappedChatComponent> wrappedChatComponentStructureModifier = packet.getChatComponents();
|
||||
WrappedChatComponent component = wrappedChatComponentStructureModifier.getValues().get(0);
|
||||
String windowTitleJson = component.getJson();
|
||||
if (windowTitleJson.startsWith("{\"text\":\"{CustomFishing_Bag_")) {
|
||||
String player = windowTitleJson.substring(28, windowTitleJson.length() - 3);
|
||||
String text = ConfigManager.fishingBagTitle.replace("{player}", player);
|
||||
wrappedChatComponentStructureModifier.write(0,
|
||||
WrappedChatComponent.fromJson(
|
||||
GsonComponentSerializer.gson().serialize(
|
||||
MiniMessage.miniMessage().deserialize(
|
||||
AdventureUtils.replaceLegacy(text)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClickInventory(InventoryClickEvent event) {
|
||||
final Player player = (Player) event.getWhoClicked();
|
||||
@@ -178,18 +154,16 @@ public class BagDataManager extends InventoryFunction {
|
||||
ItemStack currentItem = event.getCurrentItem();
|
||||
if (currentItem == null || currentItem.getType() == Material.AIR) return;
|
||||
NBTItem nbtItem = new NBTItem(currentItem);
|
||||
if (!nbtItem.hasTag("CustomFishing") && !ConfigManager.bagWhiteListItems.contains(currentItem.getType())) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
NBTCompound nbtCompound = nbtItem.getCompound("CustomFishing");
|
||||
if (nbtCompound == null) {
|
||||
if (nbtCompound == null && !ConfigManager.bagWhiteListItems.contains(currentItem.getType())) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
String type = nbtCompound.getString("type");
|
||||
if (!ConfigManager.canStoreLoot && type.equals("loot")) {
|
||||
event.setCancelled(true);
|
||||
if (nbtCompound != null) {
|
||||
String type = nbtCompound.getString("type");
|
||||
if (!ConfigManager.canStoreLoot && type.equals("loot")) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -231,7 +205,7 @@ public class BagDataManager extends InventoryFunction {
|
||||
}
|
||||
if (size * 9 != inventory.getSize()) {
|
||||
ItemStack[] itemStacks = inventory.getContents();
|
||||
Inventory newInv = plugin.getVersionHelper().isSpigot() ? Bukkit.createInventory(null, size * 9, AdventureUtils.replaceMiniMessage(ConfigManager.fishingBagTitle.replace("{player}", owner.getName()))) : Bukkit.createInventory(null, size * 9, "{CustomFishing_Bag_" + owner.getName() + "}");
|
||||
Inventory newInv = InventoryUtils.createInventory(null, size * 9, plugin.getIntegrationManager().getPlaceholderManager().parse(owner, ConfigManager.fishingBagTitle));
|
||||
newInv.setContents(itemStacks);
|
||||
dataMap.put(owner.getUniqueId(), newInv);
|
||||
viewer.openInventory(newInv);
|
||||
|
||||
@@ -17,15 +17,10 @@
|
||||
|
||||
package net.momirealms.customfishing.manager;
|
||||
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.reflect.StructureModifier;
|
||||
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||
import de.tr7zw.changeme.nbtapi.NBTCompound;
|
||||
import de.tr7zw.changeme.nbtapi.NBTItem;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.sound.Sound;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.api.event.SellFishEvent;
|
||||
import net.momirealms.customfishing.data.PlayerSellData;
|
||||
@@ -36,6 +31,7 @@ import net.momirealms.customfishing.listener.WindowPacketListener;
|
||||
import net.momirealms.customfishing.object.InventoryFunction;
|
||||
import net.momirealms.customfishing.util.AdventureUtils;
|
||||
import net.momirealms.customfishing.util.ConfigUtils;
|
||||
import net.momirealms.customfishing.util.InventoryUtils;
|
||||
import net.momirealms.customfishing.util.ItemStackUtils;
|
||||
import net.objecthunter.exp4j.Expression;
|
||||
import net.objecthunter.exp4j.ExpressionBuilder;
|
||||
@@ -459,23 +455,6 @@ public class SellManager extends InventoryFunction {
|
||||
return playerSellData.getMoney();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWindowTitlePacketSend(PacketContainer packet, Player player) {
|
||||
StructureModifier<WrappedChatComponent> wrappedChatComponentStructureModifier = packet.getChatComponents();
|
||||
WrappedChatComponent component = wrappedChatComponentStructureModifier.getValues().get(0);
|
||||
if (component.getJson().equals("{\"text\":\"{CustomFishing_Sell}\"}")) {
|
||||
wrappedChatComponentStructureModifier.write(0,
|
||||
WrappedChatComponent.fromJson(
|
||||
GsonComponentSerializer.gson().serialize(
|
||||
MiniMessage.miniMessage().deserialize(
|
||||
AdventureUtils.replaceLegacy(plugin.getIntegrationManager().getPlaceholderManager().parse(player, SellManager.title))
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public class SellGUI implements InventoryHolder {
|
||||
|
||||
private final Inventory inventory;
|
||||
@@ -488,7 +467,7 @@ public class SellManager extends InventoryFunction {
|
||||
|
||||
public SellGUI(Player player) {
|
||||
this.player = player;
|
||||
this.inventory = plugin.getVersionHelper().isSpigot() ? Bukkit.createInventory(this, guiSize, AdventureUtils.replaceMiniMessage(SellManager.title.replace("{player}", player.getName()))) : Bukkit.createInventory(this, guiSize, "{CustomFishing_Sell}");
|
||||
this.inventory = InventoryUtils.createInventory(this, guiSize, plugin.getIntegrationManager().getPlaceholderManager().parse(player, SellManager.title));
|
||||
}
|
||||
|
||||
public void open() {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package net.momirealms.customfishing.object;
|
||||
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
|
||||
public class Reflection {
|
||||
|
||||
public static Class<?> textComponentClass;
|
||||
public static Class<?> componentClass;
|
||||
public static Class<?> bukkitClass;
|
||||
public static Class<?> textColorClass;
|
||||
public static Class<?> keyClass;
|
||||
public static Class<?> textDecorationClass;
|
||||
public static Class<?> textDecorationStateClass;
|
||||
|
||||
public static void load() {
|
||||
if (CustomFishing.getInstance().getVersionHelper().isSpigot()) return;
|
||||
try {
|
||||
textComponentClass = Class.forName("net;kyori;adventure;text;TextComponent".replace(";", "."));
|
||||
componentClass = Class.forName("net;kyori;adventure;text;Component".replace(";", "."));
|
||||
bukkitClass = Class.forName("org;bukkit;Bukkit".replace(";", "."));
|
||||
textColorClass = Class.forName("net;kyori;adventure;text;format;TextColor".replace(";", "."));
|
||||
keyClass = Class.forName("net;kyori;adventure;key;Key".replace(";", "."));
|
||||
textDecorationClass = Class.forName("net;kyori;adventure;text;format;TextDecoration".replace(";", "."));
|
||||
textDecorationStateClass = Class.forName("net;kyori;adventure;text;format;TextDecoration$State".replace(";", "."));
|
||||
} catch (ClassNotFoundException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) <2022> <XiaoMoMi>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.momirealms.customfishing.scheduler;
|
||||
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public class BukkitSchedulerImpl implements SchedulerPlatform {
|
||||
|
||||
private final CustomFishing plugin;
|
||||
|
||||
public BukkitSchedulerImpl(CustomFishing plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> callSyncMethod(@NotNull Callable<T> task) {
|
||||
return Bukkit.getScheduler().callSyncMethod(plugin, task);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTask(Runnable runnable) {
|
||||
Bukkit.getScheduler().runTask(plugin, runnable);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) <2022> <XiaoMoMi>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.momirealms.customfishing.scheduler;
|
||||
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.object.Function;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class Scheduler extends Function {
|
||||
|
||||
private final ScheduledThreadPoolExecutor schedule;
|
||||
private final SchedulerPlatform schedulerPlatform;
|
||||
|
||||
public Scheduler(CustomFishing plugin) {
|
||||
this.schedulerPlatform = new BukkitSchedulerImpl(plugin);
|
||||
this.schedule = new ScheduledThreadPoolExecutor(1);
|
||||
this.schedule.setMaximumPoolSize(2);
|
||||
this.schedule.setKeepAliveTime(10, TimeUnit.SECONDS);
|
||||
this.schedule.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
this.schedule.shutdown();
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> runTaskAsyncLater(Runnable runnable, long delay, TimeUnit timeUnit) {
|
||||
return this.schedule.schedule(runnable, delay, timeUnit);
|
||||
}
|
||||
|
||||
public void runTaskAsync(Runnable runnable) {
|
||||
this.schedule.execute(runnable);
|
||||
}
|
||||
|
||||
public void runTask(Runnable runnable) {
|
||||
this.schedulerPlatform.runTask(runnable);
|
||||
}
|
||||
|
||||
public <T> Future<T> callSyncMethod(@NotNull Callable<T> task) {
|
||||
return this.schedulerPlatform.callSyncMethod(task);
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> runTaskTimerAsync(Runnable runnable, long delay, long interval, TimeUnit timeUnit) {
|
||||
return this.schedule.scheduleAtFixedRate(runnable, delay, interval, timeUnit);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (C) <2022> <XiaoMoMi>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.momirealms.customfishing.scheduler;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public interface SchedulerPlatform {
|
||||
|
||||
<T> Future<T> callSyncMethod(@NotNull Callable<T> task);
|
||||
|
||||
void runTask(Runnable runnable);
|
||||
}
|
||||
@@ -21,16 +21,23 @@ import net.kyori.adventure.audience.Audience;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.sound.Sound;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.title.Title;
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.object.Reflection;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -249,4 +256,61 @@ public class AdventureUtils {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Object getPaperComponent(Component component) {
|
||||
try {
|
||||
Object newComponent;
|
||||
if (component instanceof TextComponent textComponent) {
|
||||
Method textComponentMethod = Reflection.componentClass.getMethod("text", String.class);
|
||||
newComponent = textComponentMethod.invoke(null, textComponent.content());
|
||||
TextColor textColor = textComponent.color();
|
||||
if (textColor != null) {
|
||||
String hex = textColor.asHexString();
|
||||
Method setColorMethod = Reflection.textComponentClass.getMethod("color", Reflection.textColorClass);
|
||||
Method getColorFromHex = Reflection.textColorClass.getMethod("fromHexString", String.class);
|
||||
Object hexColor = getColorFromHex.invoke(null, hex);
|
||||
newComponent = setColorMethod.invoke(newComponent, hexColor);
|
||||
}
|
||||
Key fontKey = textComponent.font();
|
||||
if (fontKey != null) {
|
||||
String namespacedKey = fontKey.asString();
|
||||
Method setKeyMethod = Reflection.textComponentClass.getMethod("font", Reflection.keyClass);
|
||||
Method keyMethod = Reflection.keyClass.getMethod("key", String.class);
|
||||
Object key = keyMethod.invoke(null, namespacedKey);
|
||||
newComponent = setKeyMethod.invoke(newComponent, key);
|
||||
}
|
||||
for (Map.Entry<TextDecoration, TextDecoration.State> entry : textComponent.decorations().entrySet()) {
|
||||
String dec = entry.getKey().name();
|
||||
Method getTextDecoration = Reflection.textDecorationClass.getDeclaredMethod("valueOf", String.class);
|
||||
Object textDecoration = getTextDecoration.invoke(null, dec);
|
||||
String stat = entry.getValue().name();
|
||||
Method getState = Reflection.textDecorationStateClass.getDeclaredMethod("valueOf", String.class);
|
||||
Object state = getState.invoke(null, stat);
|
||||
Method applyDecorationMethod = Reflection.textComponentClass.getMethod("decoration", Reflection.textDecorationClass, Reflection.textDecorationStateClass);
|
||||
newComponent = applyDecorationMethod.invoke(newComponent, textDecoration, state);
|
||||
}
|
||||
newComponent = setChildrenComponents(textComponent, newComponent);
|
||||
} else {
|
||||
Method textComponentMethod = Reflection.componentClass.getMethod("text", String.class);
|
||||
newComponent = textComponentMethod.invoke(null, "");
|
||||
newComponent = setChildrenComponents(component, newComponent);
|
||||
}
|
||||
return newComponent;
|
||||
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException exception) {
|
||||
exception.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static Object setChildrenComponents(Component component, Object newComponent) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
|
||||
List<Object> children = new ArrayList<>();
|
||||
for (Component child : component.children()) {
|
||||
children.add(getPaperComponent(child));
|
||||
}
|
||||
if (children.size() != 0) {
|
||||
Method childrenMethod = Reflection.componentClass.getMethod("children", List.class);
|
||||
newComponent = childrenMethod.invoke(newComponent, children);
|
||||
}
|
||||
return newComponent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
|
||||
package net.momirealms.customfishing.util;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.object.Reflection;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.io.BukkitObjectInputStream;
|
||||
import org.bukkit.util.io.BukkitObjectOutputStream;
|
||||
@@ -27,6 +33,8 @@ import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class InventoryUtils {
|
||||
|
||||
@@ -115,4 +123,29 @@ public class InventoryUtils {
|
||||
}
|
||||
return stacks;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Inventory createInventory(InventoryHolder inventoryHolder, int size, Component component) {
|
||||
try {
|
||||
Method createInvMethod = Reflection.bukkitClass.getMethod("createInventory", InventoryHolder.class, int.class, Reflection.componentClass);
|
||||
return (Inventory) createInvMethod.invoke(null, inventoryHolder, size, AdventureUtils.getPaperComponent(component));
|
||||
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException exception) {
|
||||
exception.printStackTrace();
|
||||
throw new RuntimeException("Failed to create inventory");
|
||||
}
|
||||
}
|
||||
|
||||
public static Inventory createInventory(InventoryHolder inventoryHolder, int size, String title) {
|
||||
if (CustomFishing.getInstance().getVersionHelper().isSpigot()) {
|
||||
return Bukkit.createInventory(inventoryHolder, size, AdventureUtils.replaceMiniMessage(title));
|
||||
} else {
|
||||
try {
|
||||
Method createInvMethod = Reflection.bukkitClass.getMethod("createInventory", InventoryHolder.class, int.class, Reflection.componentClass);
|
||||
return (Inventory) createInvMethod.invoke(null, inventoryHolder, size, AdventureUtils.getPaperComponent(AdventureUtils.getComponentFromMiniMessage(title)));
|
||||
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException exception) {
|
||||
exception.printStackTrace();
|
||||
throw new RuntimeException("Failed to create inventory");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
example:
|
||||
|
||||
# TOTAL_SCORE
|
||||
# CATCH_AMOUNT
|
||||
# MAX_SIZE
|
||||
|
||||
Reference in New Issue
Block a user