9
0
mirror of https://github.com/Xiao-MoMi/Custom-Fishing.git synced 2025-12-19 15:09:24 +00:00
This commit is contained in:
Xiao-MoMi
2023-05-08 22:56:13 +08:00
parent 3250ce6e1e
commit 0912eb0e11
15 changed files with 301 additions and 76 deletions

View File

@@ -4,7 +4,7 @@ plugins {
} }
group = 'net.momirealms' group = 'net.momirealms'
version = '1.3.0.14' version = '1.3.0.15'
repositories { repositories {
mavenCentral() mavenCentral()

View File

@@ -26,6 +26,8 @@ import net.momirealms.customfishing.commands.SellFishCommand;
import net.momirealms.customfishing.helper.LibraryLoader; import net.momirealms.customfishing.helper.LibraryLoader;
import net.momirealms.customfishing.helper.VersionHelper; import net.momirealms.customfishing.helper.VersionHelper;
import net.momirealms.customfishing.manager.*; import net.momirealms.customfishing.manager.*;
import net.momirealms.customfishing.object.Reflection;
import net.momirealms.customfishing.scheduler.Scheduler;
import net.momirealms.customfishing.util.AdventureUtils; import net.momirealms.customfishing.util.AdventureUtils;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -52,6 +54,7 @@ public final class CustomFishing extends JavaPlugin {
private OffsetManager offsetManager; private OffsetManager offsetManager;
private StatisticsManager statisticsManager; private StatisticsManager statisticsManager;
private VersionHelper versionHelper; private VersionHelper versionHelper;
private Scheduler scheduler;
@Override @Override
public void onLoad() { public void onLoad() {
@@ -76,9 +79,11 @@ public final class CustomFishing extends JavaPlugin {
this.sellManager = new SellManager(this); this.sellManager = new SellManager(this);
this.bagDataManager = new BagDataManager(this); this.bagDataManager = new BagDataManager(this);
this.offsetManager = new OffsetManager(this); this.offsetManager = new OffsetManager(this);
this.scheduler = new Scheduler(this);
this.reload(); this.reload();
this.registerCommands(); this.registerCommands();
this.registerQuests(); this.registerQuests();
Reflection.load();
AdventureUtils.consoleMessage("[CustomFishing] Plugin Enabled!"); AdventureUtils.consoleMessage("[CustomFishing] Plugin Enabled!");
if (ConfigManager.bStats) new Metrics(this, 16648); if (ConfigManager.bStats) new Metrics(this, 16648);
if (ConfigManager.updateChecker) this.versionHelper.checkUpdate(); 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.sellManager != null) this.sellManager.disable();
if (this.statisticsManager != null) this.statisticsManager.disable(); if (this.statisticsManager != null) this.statisticsManager.disable();
if (this.dataManager != null) this.dataManager.disable(); if (this.dataManager != null) this.dataManager.disable();
if (this.scheduler != null) scheduler.disable();
if (adventure != null) adventure.close(); if (adventure != null) adventure.close();
} }
@@ -188,6 +194,10 @@ public final class CustomFishing extends JavaPlugin {
public OffsetManager getOffsetManager() { public OffsetManager getOffsetManager() {
return offsetManager; return offsetManager;
} }
public Scheduler getScheduler() {
return scheduler;
}
public void reload() { public void reload() {
ConfigManager.load(); ConfigManager.load();

View File

@@ -20,6 +20,7 @@ package net.momirealms.customfishing.data.storage;
import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.CustomFishing;
import net.momirealms.customfishing.data.PlayerSellData; import net.momirealms.customfishing.data.PlayerSellData;
import net.momirealms.customfishing.data.PlayerStatisticsData; import net.momirealms.customfishing.data.PlayerStatisticsData;
import net.momirealms.customfishing.manager.ConfigManager;
import net.momirealms.customfishing.util.ConfigUtils; import net.momirealms.customfishing.util.ConfigUtils;
import net.momirealms.customfishing.util.InventoryUtils; import net.momirealms.customfishing.util.InventoryUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -59,7 +60,7 @@ public class FileStorageImpl implements DataStorageInterface {
int size = config.getInt("size", 9); int size = config.getInt("size", 9);
ItemStack[] itemStacks = InventoryUtils.getInventoryItems(contents); ItemStack[] itemStacks = InventoryUtils.getInventoryItems(contents);
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); 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); if (itemStacks != null) inventory.setContents(itemStacks);
return inventory; return inventory;
} }

View File

@@ -32,7 +32,10 @@ import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; 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 { public class MySQLStorageImpl implements DataStorageInterface {
@@ -80,14 +83,12 @@ public class MySQLStorageImpl implements DataStorageInterface {
int size = rs.getInt(3); int size = rs.getInt(3);
String contents = rs.getString(4); String contents = rs.getString(4);
ItemStack[] itemStacks = InventoryUtils.getInventoryItems(contents); 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("")))); inventory = InventoryUtils.createInventory(null, size, plugin.getIntegrationManager().getPlaceholderManager().parse(offlinePlayer, ConfigManager.fishingBagTitle));
else inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}");
if (itemStacks != null) inventory.setContents(itemStacks); if (itemStacks != null) inventory.setContents(itemStacks);
lockData(uuid, "fishingbag"); lockData(uuid, "fishingbag");
} }
else { else {
if (plugin.getVersionHelper().isSpigot()) inventory = Bukkit.createInventory(null, 9, AdventureUtils.replaceMiniMessage(ConfigManager.fishingBagTitle.replace("{player}", Optional.ofNullable(offlinePlayer.getName()).orElse("")))); inventory = InventoryUtils.createInventory(null, 9, plugin.getIntegrationManager().getPlaceholderManager().parse(offlinePlayer, ConfigManager.fishingBagTitle));
else inventory = Bukkit.createInventory(null, 9, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}");
insertBagData(uuid, InventoryUtils.toBase64(inventory.getContents())); insertBagData(uuid, InventoryUtils.toBase64(inventory.getContents()));
} }
} catch (SQLException e) { } catch (SQLException e) {

View File

@@ -28,6 +28,7 @@ import net.momirealms.customfishing.manager.ConfigManager;
import net.momirealms.customfishing.manager.MessageManager; import net.momirealms.customfishing.manager.MessageManager;
import net.momirealms.customfishing.util.AdventureUtils; import net.momirealms.customfishing.util.AdventureUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
@@ -211,7 +212,7 @@ public class Competition {
return competitionConfig; return competitionConfig;
} }
public String getPlayerRank(Player player) { public String getPlayerRank(OfflinePlayer player) {
return Optional.ofNullable(ranking.getPlayerRank(player.getName())).orElse(MessageManager.noRank); return Optional.ofNullable(ranking.getPlayerRank(player.getName())).orElse(MessageManager.noRank);
} }
@@ -219,7 +220,7 @@ public class Competition {
return remainingTime; return remainingTime;
} }
public double getScore(Player player) { public double getScore(OfflinePlayer player) {
return Optional.ofNullable(ranking.getCompetitionPlayer(player.getName())).orElse(CompetitionPlayer.emptyPlayer).getScore(); return Optional.ofNullable(ranking.getCompetitionPlayer(player.getName())).orElse(CompetitionPlayer.emptyPlayer).getScore();
} }

View File

@@ -22,7 +22,7 @@ import net.momirealms.customfishing.fishing.competition.Competition;
import net.momirealms.customfishing.manager.MessageManager; import net.momirealms.customfishing.manager.MessageManager;
import net.momirealms.customfishing.object.Function; import net.momirealms.customfishing.object.Function;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.OfflinePlayer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -61,16 +61,15 @@ public class PlaceholderManager extends Function {
if (this.statisticsPapi != null) statisticsPapi.unregister(); if (this.statisticsPapi != null) statisticsPapi.unregister();
} }
public String parse(Player player, String text) { public String parse(OfflinePlayer player, String text) {
if (hasPlaceholderAPI) { if (hasPlaceholderAPI) {
return ParseUtil.setPlaceholders(player, parseInner(player, text)); return ParseUtil.setPlaceholders(player, parseInner(player, text));
} } else {
else {
return parseInner(player, text); return parseInner(player, text);
} }
} }
public String parseInner(Player player, String text) { public String parseInner(OfflinePlayer player, String text) {
List<String> papis = detectBetterPlaceholders(text); List<String> papis = detectBetterPlaceholders(text);
for (String papi : papis) { for (String papi : papis) {
text = text.replace(papi, parseSingleInner(player, papi)); text = text.replace(papi, parseSingleInner(player, papi));
@@ -78,11 +77,10 @@ public class PlaceholderManager extends Function {
return text; return text;
} }
public String parseSinglePlaceholder(Player player, String placeholder) { public String parseSinglePlaceholder(OfflinePlayer player, String placeholder) {
if (placeholder.startsWith("{")) { if (placeholder.startsWith("{")) {
return parseSingleInner(player, placeholder); return parseSingleInner(player, placeholder);
} } else if (hasPlaceholderAPI) {
else if (hasPlaceholderAPI) {
return ParseUtil.setPlaceholders(player, placeholder); return ParseUtil.setPlaceholders(player, placeholder);
} }
return placeholder; return placeholder;
@@ -113,7 +111,7 @@ public class PlaceholderManager extends Function {
return hasPlaceholderAPI ? detectAllPlaceholders(text) : detectBetterPlaceholders(text); return hasPlaceholderAPI ? detectAllPlaceholders(text) : detectBetterPlaceholders(text);
} }
public String parseSingleInner(Player player, String placeholder) { public String parseSingleInner(OfflinePlayer player, String placeholder) {
switch (placeholder) { switch (placeholder) {
case "{player}" -> { case "{player}" -> {
return player.getName(); return player.getName();

View File

@@ -17,19 +17,15 @@
package net.momirealms.customfishing.manager; 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.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTItem; 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.CustomFishing;
import net.momirealms.customfishing.listener.InventoryListener; import net.momirealms.customfishing.listener.InventoryListener;
import net.momirealms.customfishing.listener.JoinQuitListener; import net.momirealms.customfishing.listener.JoinQuitListener;
import net.momirealms.customfishing.listener.WindowPacketListener; import net.momirealms.customfishing.listener.WindowPacketListener;
import net.momirealms.customfishing.object.InventoryFunction; import net.momirealms.customfishing.object.InventoryFunction;
import net.momirealms.customfishing.util.AdventureUtils; import net.momirealms.customfishing.util.AdventureUtils;
import net.momirealms.customfishing.util.InventoryUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; 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 @Override
public void onClickInventory(InventoryClickEvent event) { public void onClickInventory(InventoryClickEvent event) {
final Player player = (Player) event.getWhoClicked(); final Player player = (Player) event.getWhoClicked();
@@ -178,18 +154,16 @@ public class BagDataManager extends InventoryFunction {
ItemStack currentItem = event.getCurrentItem(); ItemStack currentItem = event.getCurrentItem();
if (currentItem == null || currentItem.getType() == Material.AIR) return; if (currentItem == null || currentItem.getType() == Material.AIR) return;
NBTItem nbtItem = new NBTItem(currentItem); NBTItem nbtItem = new NBTItem(currentItem);
if (!nbtItem.hasTag("CustomFishing") && !ConfigManager.bagWhiteListItems.contains(currentItem.getType())) {
event.setCancelled(true);
return;
}
NBTCompound nbtCompound = nbtItem.getCompound("CustomFishing"); NBTCompound nbtCompound = nbtItem.getCompound("CustomFishing");
if (nbtCompound == null) { if (nbtCompound == null && !ConfigManager.bagWhiteListItems.contains(currentItem.getType())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
String type = nbtCompound.getString("type"); if (nbtCompound != null) {
if (!ConfigManager.canStoreLoot && type.equals("loot")) { String type = nbtCompound.getString("type");
event.setCancelled(true); if (!ConfigManager.canStoreLoot && type.equals("loot")) {
event.setCancelled(true);
}
} }
} }
} }
@@ -231,7 +205,7 @@ public class BagDataManager extends InventoryFunction {
} }
if (size * 9 != inventory.getSize()) { if (size * 9 != inventory.getSize()) {
ItemStack[] itemStacks = inventory.getContents(); 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); newInv.setContents(itemStacks);
dataMap.put(owner.getUniqueId(), newInv); dataMap.put(owner.getUniqueId(), newInv);
viewer.openInventory(newInv); viewer.openInventory(newInv);

View File

@@ -17,15 +17,10 @@
package net.momirealms.customfishing.manager; 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.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTItem; import de.tr7zw.changeme.nbtapi.NBTItem;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import net.kyori.adventure.sound.Sound; 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.CustomFishing;
import net.momirealms.customfishing.api.event.SellFishEvent; import net.momirealms.customfishing.api.event.SellFishEvent;
import net.momirealms.customfishing.data.PlayerSellData; 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.object.InventoryFunction;
import net.momirealms.customfishing.util.AdventureUtils; import net.momirealms.customfishing.util.AdventureUtils;
import net.momirealms.customfishing.util.ConfigUtils; import net.momirealms.customfishing.util.ConfigUtils;
import net.momirealms.customfishing.util.InventoryUtils;
import net.momirealms.customfishing.util.ItemStackUtils; import net.momirealms.customfishing.util.ItemStackUtils;
import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder; import net.objecthunter.exp4j.ExpressionBuilder;
@@ -459,23 +455,6 @@ public class SellManager extends InventoryFunction {
return playerSellData.getMoney(); 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 { public class SellGUI implements InventoryHolder {
private final Inventory inventory; private final Inventory inventory;
@@ -488,7 +467,7 @@ public class SellManager extends InventoryFunction {
public SellGUI(Player player) { public SellGUI(Player player) {
this.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() { public void open() {

View File

@@ -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) {
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -21,16 +21,23 @@ import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import net.kyori.adventure.sound.Sound; import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component; 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.text.minimessage.MiniMessage;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.CustomFishing;
import net.momirealms.customfishing.object.Reflection;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -249,4 +256,61 @@ public class AdventureUtils {
} }
return result; 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;
}
} }

View File

@@ -17,6 +17,12 @@
package net.momirealms.customfishing.util; 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.inventory.ItemStack;
import org.bukkit.util.io.BukkitObjectInputStream; import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream; 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.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class InventoryUtils { public class InventoryUtils {
@@ -115,4 +123,29 @@ public class InventoryUtils {
} }
return stacks; 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");
}
}
}
} }

View File

@@ -1,5 +1,4 @@
example: example:
# TOTAL_SCORE # TOTAL_SCORE
# CATCH_AMOUNT # CATCH_AMOUNT
# MAX_SIZE # MAX_SIZE