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'
|
group = 'net.momirealms'
|
||||||
version = '1.3.0.14'
|
version = '1.3.0.15'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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.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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
example:
|
example:
|
||||||
|
|
||||||
# TOTAL_SCORE
|
# TOTAL_SCORE
|
||||||
# CATCH_AMOUNT
|
# CATCH_AMOUNT
|
||||||
# MAX_SIZE
|
# MAX_SIZE
|
||||||
|
|||||||
Reference in New Issue
Block a user