diff --git a/build.gradle b/build.gradle index b1254a80..b4b8b856 100644 --- a/build.gradle +++ b/build.gradle @@ -4,46 +4,19 @@ plugins { } group = 'net.momirealms' -version = '1.3.0-beta-1' +version = '1.3.0-beta-3' repositories { mavenCentral() - maven { - name = 'papermc-repo' - url = 'https://papermc.io/repo/repository/maven-public/' - } - maven { - name = 'sonatype' - url = 'https://oss.sonatype.org/content/groups/public/' - } - maven { - name = "dmulloy2-repo" - url = "https://repo.dmulloy2.net/repository/public/" - } - maven { - name = "clip-repo" - url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' - } - maven { - name = "NBT-API" - url = "https://repo.codemc.org/repository/maven-public/" - } - maven { - name = "sk89q-repo" - url = "https://maven.enginehub.org/repo/" - } - maven { - name = "jitpack-repo" - url = "https://jitpack.io" - } - maven { - name = "Lumine Releases" - url = "https://mvn.lumine.io/repository/maven-public" - } - maven { - name = 'glaremasters repo' - url = 'https://repo.glaremasters.me/repository/towny/' - } + maven {name = 'papermc-repo'; url = 'https://papermc.io/repo/repository/maven-public/'} + maven {name = 'sonatype'; url = 'https://oss.sonatype.org/content/groups/public/'} + maven {name = "dmulloy2-repo"; url = "https://repo.dmulloy2.net/repository/public/"} + maven {name = "clip-repo"; url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/'} + maven {name = "NBT-API"; url = "https://repo.codemc.org/repository/maven-public/"} + maven {name = "sk89q-repo"; url = "https://maven.enginehub.org/repo/"} + maven {name = "jitpack-repo"; url = "https://jitpack.io"} + maven {name = "Lumine Releases"; url = "https://mvn.lumine.io/repository/maven-public"} + maven {name = 'glaremasters repo'; url = 'https://repo.glaremasters.me/repository/towny/'} } dependencies { @@ -66,6 +39,7 @@ dependencies { compileOnly('com.github.LoneDev6:api-itemsadder:3.2.3c') compileOnly('net.objecthunter:exp4j:0.4.8') compileOnly('org.mariadb.jdbc:mariadb-java-client:3.0.6') + compileOnly('com.google.code.gson:gson:2.10.1') implementation('net.kyori:adventure-api:4.12.0') implementation('net.kyori:adventure-platform-bukkit:4.2.0') implementation('net.kyori:adventure-text-minimessage:4.12.0') diff --git a/src/main/java/net/momirealms/customfishing/CustomFishing.java b/src/main/java/net/momirealms/customfishing/CustomFishing.java index 11493e82..1666b27f 100644 --- a/src/main/java/net/momirealms/customfishing/CustomFishing.java +++ b/src/main/java/net/momirealms/customfishing/CustomFishing.java @@ -76,7 +76,7 @@ public final class CustomFishing extends JavaPlugin { this.registerCommands(); this.registerQuests(); AdventureUtil.consoleMessage("[CustomFishing] Plugin Enabled!"); - new Metrics(this, 16648); + if (ConfigManager.bStats) new Metrics(this, 16648); } @Override @@ -181,6 +181,8 @@ public final class CustomFishing extends JavaPlugin { public void reload() { ConfigManager.load(); MessageManager.load(); + getDataManager().unload(); + getDataManager().load(); getIntegrationManager().unload(); getIntegrationManager().load(); getBarMechanicManager().unload(); diff --git a/src/main/java/net/momirealms/customfishing/data/PlayerBagData.java b/src/main/java/net/momirealms/customfishing/data/PlayerBagData.java deleted file mode 100644 index 670cbfb8..00000000 --- a/src/main/java/net/momirealms/customfishing/data/PlayerBagData.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) <2022> - * - * 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 . - */ - -package net.momirealms.customfishing.data; - -import org.bukkit.OfflinePlayer; -import org.bukkit.inventory.Inventory; - -public class PlayerBagData { - - private final OfflinePlayer player; - private Inventory inventory; - - public PlayerBagData(OfflinePlayer player, Inventory inventory) { - this.player = player; - this.inventory = inventory; - } - - public Inventory getInventory() { - return inventory; - } - - public OfflinePlayer getPlayer() { - return player; - } - - public void setInventory(Inventory inventory) { - this.inventory = inventory; - } -} diff --git a/src/main/java/net/momirealms/customfishing/data/storage/DataStorageInterface.java b/src/main/java/net/momirealms/customfishing/data/storage/DataStorageInterface.java index 9e4e3767..1e539138 100644 --- a/src/main/java/net/momirealms/customfishing/data/storage/DataStorageInterface.java +++ b/src/main/java/net/momirealms/customfishing/data/storage/DataStorageInterface.java @@ -17,10 +17,7 @@ package net.momirealms.customfishing.data.storage; -import net.momirealms.customfishing.data.PlayerBagData; import net.momirealms.customfishing.data.PlayerSellData; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import java.util.UUID; @@ -29,8 +26,9 @@ public interface DataStorageInterface { void initialize(); void disable(); - Inventory loadBagData(OfflinePlayer player, boolean force); - void saveBagData(PlayerBagData playerBagData, boolean unlock); - PlayerSellData loadSellData(Player player, boolean force); + Inventory loadBagData(UUID uuid, boolean force); + void saveBagData(UUID uuid, Inventory inventory, boolean unlock); + PlayerSellData loadSellData(UUID uuid, boolean force); void saveSellData(UUID uuid, PlayerSellData playerSellData, boolean unlock); + StorageType getStorageType(); } diff --git a/src/main/java/net/momirealms/customfishing/data/storage/FileStorageImpl.java b/src/main/java/net/momirealms/customfishing/data/storage/FileStorageImpl.java index 494bbfbf..9caea793 100644 --- a/src/main/java/net/momirealms/customfishing/data/storage/FileStorageImpl.java +++ b/src/main/java/net/momirealms/customfishing/data/storage/FileStorageImpl.java @@ -18,14 +18,12 @@ package net.momirealms.customfishing.data.storage; import net.momirealms.customfishing.CustomFishing; -import net.momirealms.customfishing.data.PlayerBagData; import net.momirealms.customfishing.data.PlayerSellData; import net.momirealms.customfishing.util.ConfigUtil; import net.momirealms.customfishing.util.InventoryUtil; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -52,25 +50,25 @@ public class FileStorageImpl implements DataStorageInterface { } @Override - public Inventory loadBagData(OfflinePlayer player, boolean force) { - YamlConfiguration config = ConfigUtil.readData(new File(plugin.getDataFolder(), "fishingbag_data" + File.separator + player.getUniqueId() + ".yml")); + public Inventory loadBagData(UUID uuid, boolean force) { + YamlConfiguration config = ConfigUtil.readData(new File(plugin.getDataFolder(), "fishingbag_data" + File.separator + uuid + ".yml")); String contents = config.getString("contents"); int size = config.getInt("size", 9); ItemStack[] itemStacks = InventoryUtil.getInventoryItems(contents); - Inventory inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + player.getName() + "}"); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); + Inventory inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}"); if (itemStacks != null) inventory.setContents(itemStacks); return inventory; } @Override - public void saveBagData(PlayerBagData playerBagData, boolean unlock) { + public void saveBagData(UUID uuid, Inventory inventory, boolean unlock) { YamlConfiguration data = new YamlConfiguration(); - Inventory inventory = playerBagData.getInventory(); String contents = InventoryUtil.toBase64(inventory.getContents()); data.set("contents", contents); data.set("size", inventory.getSize()); try { - data.save(new File(plugin.getDataFolder(), "fishingbag_data" + File.separator + playerBagData.getPlayer().getUniqueId() + ".yml")); + data.save(new File(plugin.getDataFolder(), "fishingbag_data" + File.separator + uuid + ".yml")); } catch (IOException e) { e.printStackTrace(); @@ -78,9 +76,8 @@ public class FileStorageImpl implements DataStorageInterface { } @Override - public PlayerSellData loadSellData(Player player, boolean force) { - UUID uuid = player.getUniqueId(); - YamlConfiguration data = ConfigUtil.readData(new File(plugin.getDataFolder(), "sell-data" + File.separator + uuid + ".yml")); + public PlayerSellData loadSellData(UUID uuid, boolean force) { + YamlConfiguration data = ConfigUtil.readData(new File(plugin.getDataFolder(), "sell_data" + File.separator + uuid + ".yml")); int date = data.getInt("date"); double money = data.getDouble("earnings"); return new PlayerSellData(money, date); @@ -92,10 +89,15 @@ public class FileStorageImpl implements DataStorageInterface { data.set("date", playerSellData.getDate()); data.set("earnings", playerSellData.getMoney()); try { - data.save(new File(plugin.getDataFolder(), "sell-data" + File.separator + uuid + ".yml")); + data.save(new File(plugin.getDataFolder(), "sell_data" + File.separator + uuid + ".yml")); } catch (IOException e) { e.printStackTrace(); } } + + @Override + public StorageType getStorageType() { + return StorageType.YAML; + } } diff --git a/src/main/java/net/momirealms/customfishing/data/storage/MySQLStorageImpl.java b/src/main/java/net/momirealms/customfishing/data/storage/MySQLStorageImpl.java index 4a7b3454..8d6ac5b6 100644 --- a/src/main/java/net/momirealms/customfishing/data/storage/MySQLStorageImpl.java +++ b/src/main/java/net/momirealms/customfishing/data/storage/MySQLStorageImpl.java @@ -18,13 +18,11 @@ package net.momirealms.customfishing.data.storage; import net.momirealms.customfishing.CustomFishing; -import net.momirealms.customfishing.data.PlayerBagData; import net.momirealms.customfishing.data.PlayerSellData; import net.momirealms.customfishing.util.AdventureUtil; import net.momirealms.customfishing.util.InventoryUtil; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -58,11 +56,12 @@ public class MySQLStorageImpl implements DataStorageInterface { } @Override - public Inventory loadBagData(OfflinePlayer player, boolean force) { + public Inventory loadBagData(UUID uuid, boolean force) { Inventory inventory = null; String sql = String.format(SqlConstants.SQL_SELECT_BAG_BY_UUID, sqlConnection.getTablePrefix() + "_" + "fishingbag"); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { - statement.setString(1, player.getUniqueId().toString()); + statement.setString(1, uuid.toString()); ResultSet rs = statement.executeQuery(); if (rs.next()) { int version = rs.getInt(2); @@ -74,13 +73,13 @@ public class MySQLStorageImpl implements DataStorageInterface { int size = rs.getInt(3); String contents = rs.getString(4); ItemStack[] itemStacks = InventoryUtil.getInventoryItems(contents); - inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + player.getName() + "}"); + inventory = Bukkit.createInventory(null, size, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}"); if (itemStacks != null) inventory.setContents(itemStacks); - lockData(player.getUniqueId(), "fishingbag"); + lockData(uuid, "fishingbag"); } else { - inventory = Bukkit.createInventory(null, 9, "{CustomFishing_Bag_" + player.getName() + "}"); - insertBagData(player.getUniqueId(), InventoryUtil.toBase64(inventory.getContents())); + inventory = Bukkit.createInventory(null, 9, "{CustomFishing_Bag_" + offlinePlayer.getName() + "}"); + insertBagData(uuid, InventoryUtil.toBase64(inventory.getContents())); } } catch (SQLException e) { e.printStackTrace(); @@ -89,25 +88,17 @@ public class MySQLStorageImpl implements DataStorageInterface { } @Override - public void saveBagData(PlayerBagData playerBagData, boolean unlock) { - UUID uuid = playerBagData.getPlayer().getUniqueId(); - Inventory inventory = playerBagData.getInventory(); + public void saveBagData(UUID uuid, Inventory inventory, boolean unlock) { String contents = InventoryUtil.toBase64(inventory.getContents()); - if (contents == null) contents = ""; updateBagData(uuid, inventory.getSize(), contents, unlock); } - /** - * Whether the data is loaded - * @param player player - * @return success or not - */ @Override - public PlayerSellData loadSellData(Player player, boolean force) { + public PlayerSellData loadSellData(UUID uuid, boolean force) { PlayerSellData playerSellData = null; String sql = String.format(SqlConstants.SQL_SELECT_SELL_BY_UUID, sqlConnection.getTablePrefix() + "_" + "selldata"); try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { - statement.setString(1, player.getUniqueId().toString()); + statement.setString(1, uuid.toString()); ResultSet rs = statement.executeQuery(); if (rs.next()) { int version = rs.getInt(2); @@ -119,12 +110,12 @@ public class MySQLStorageImpl implements DataStorageInterface { int date = rs.getInt(3); int money = rs.getInt(4); playerSellData = new PlayerSellData(money, date); - lockData(player.getUniqueId(), "selldata"); + lockData(uuid, "selldata"); } else { Calendar calendar = Calendar.getInstance(); playerSellData = new PlayerSellData(0, (calendar.get(Calendar.MONTH) +1)* 100 + calendar.get(Calendar.DATE)); - insertSellData(player.getUniqueId(), playerSellData.getDate()); + insertSellData(uuid, playerSellData.getDate()); } } catch (SQLException e) { e.printStackTrace(); @@ -137,6 +128,11 @@ public class MySQLStorageImpl implements DataStorageInterface { updateSellData(uuid, playerSellData.getDate(), (int) playerSellData.getMoney(), unlock); } + @Override + public StorageType getStorageType() { + return StorageType.SQL; + } + private void createTableIfNotExist(String table, String sqlStat) { String sql = String.format(sqlStat, table); try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { diff --git a/src/main/java/net/momirealms/customfishing/data/storage/StorageType.java b/src/main/java/net/momirealms/customfishing/data/storage/StorageType.java new file mode 100644 index 00000000..26ccd7e6 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/data/storage/StorageType.java @@ -0,0 +1,6 @@ +package net.momirealms.customfishing.data.storage; + +public enum StorageType { + SQL, + YAML +} diff --git a/src/main/java/net/momirealms/customfishing/fishing/Effect.java b/src/main/java/net/momirealms/customfishing/fishing/Effect.java index efbdd3c3..b13c8d0b 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/Effect.java +++ b/src/main/java/net/momirealms/customfishing/fishing/Effect.java @@ -35,10 +35,6 @@ public class Effect { private boolean canLavaFishing; private boolean hasSpecialRod; - public double getSizeMultiplier() { - return sizeMultiplier + 1; - } - public void setSizeMultiplier(double sizeMultiplier) { this.sizeMultiplier = sizeMultiplier; } @@ -113,13 +109,17 @@ public class Effect { if (anotherEffect.getTimeModifier() != 0) this.timeModifier += (anotherEffect.getTimeModifier() - 1); if (anotherEffect.getDoubleLootChance() != 0) this.doubleLootChance += anotherEffect.getDoubleLootChance(); if (anotherEffect.getDifficulty() != 0) this.difficulty += anotherEffect.getDifficulty(); - if (anotherEffect.getScoreMultiplier() != 0) this.scoreMultiplier += anotherEffect.getScoreMultiplier(); - if (anotherEffect.getSizeMultiplier() != 0) this.sizeMultiplier += anotherEffect.getSizeMultiplier(); + if (anotherEffect.getScoreMultiplier() != 0) this.scoreMultiplier += (anotherEffect.getScoreMultiplier() - 1); + if (anotherEffect.getSizeMultiplier() != 0) this.sizeMultiplier += (anotherEffect.getSizeMultiplier() - 1); if (anotherEffect.canLavaFishing()) this.canLavaFishing = true; } public double getScoreMultiplier() { - return scoreMultiplier + 1; + return scoreMultiplier; + } + + public double getSizeMultiplier() { + return sizeMultiplier; } public boolean hasSpecialRod() { diff --git a/src/main/java/net/momirealms/customfishing/fishing/competition/Competition.java b/src/main/java/net/momirealms/customfishing/fishing/competition/Competition.java index 0e06ae10..f5e23b95 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/competition/Competition.java +++ b/src/main/java/net/momirealms/customfishing/fishing/competition/Competition.java @@ -114,13 +114,14 @@ public class Competition { List newMessage = new ArrayList<>(); PlaceholderManager placeholderManager = CustomFishing.getInstance().getIntegrationManager().getPlaceholderManager(); for (String endMsg : competitionConfig.getEndMessage()) { - List placeholders = new ArrayList<>(placeholderManager.detectPlaceholders(endMsg)); + List placeholders = new ArrayList<>(placeholderManager.detectBetterPlaceholders(endMsg)); for (String placeholder : placeholders) { - if (placeholder.endsWith("_player%")) { + System.out.println(placeholder); + if (placeholder.endsWith("_player}")) { int rank = Integer.parseInt(placeholder.substring(1, placeholder.length() - 8)); endMsg = endMsg.replace(placeholder, Optional.ofNullable(ranking.getPlayerAt(rank)).orElse(MessageManager.noPlayer)); } - else if (placeholder.endsWith("_score%")) { + else if (placeholder.endsWith("_score}")) { int rank = Integer.parseInt(placeholder.substring(1, placeholder.length() - 7)); float score = ranking.getScoreAt(rank); endMsg = endMsg.replace(placeholder, score == 0 ? MessageManager.noScore : String.format("%.1f", score)); diff --git a/src/main/java/net/momirealms/customfishing/fishing/loot/DroppedItem.java b/src/main/java/net/momirealms/customfishing/fishing/loot/DroppedItem.java index 33af0ee7..d6ec3492 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/loot/DroppedItem.java +++ b/src/main/java/net/momirealms/customfishing/fishing/loot/DroppedItem.java @@ -30,8 +30,8 @@ public class DroppedItem extends Loot { private float basicPrice; private float sizeBonus; - public DroppedItem(String key, String nick, String material, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score, boolean randomDurability) { - super(key, nick, fishingGames, weight, showInFinder, score); + public DroppedItem(String key, String nick, String material, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score, boolean randomDurability, boolean disableBar) { + super(key, nick, fishingGames, weight, showInFinder, score, disableBar); this.material = material; this.randomDurability = randomDurability; } diff --git a/src/main/java/net/momirealms/customfishing/fishing/loot/Loot.java b/src/main/java/net/momirealms/customfishing/fishing/loot/Loot.java index 6802802b..33c96217 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/loot/Loot.java +++ b/src/main/java/net/momirealms/customfishing/fishing/loot/Loot.java @@ -23,11 +23,12 @@ import net.momirealms.customfishing.object.action.ActionInterface; public class Loot { - public static Loot EMPTY = new Loot("null", "null", new MiniGameConfig[0], 0, false, 0d); + public static Loot EMPTY = new Loot("null", "null", new MiniGameConfig[0], 0, false, 0d, false); protected final String key; protected final String nick; protected String group; + protected boolean disableBar; protected final boolean showInFinder; protected ActionInterface[] successActions; protected ActionInterface[] failureActions; @@ -38,13 +39,14 @@ public class Loot { protected final int weight; protected final double score; - public Loot(String key, String nick, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score) { + public Loot(String key, String nick, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score, boolean disableBar) { this.key = key; this.nick = nick; this.weight = weight; this.showInFinder = showInFinder; this.score = score; this.fishingGames = fishingGames; + this.disableBar = disableBar; } public MiniGameConfig[] getFishingGames() { @@ -118,4 +120,8 @@ public class Loot { public void setRequirements(RequirementInterface[] requirements) { this.requirements = requirements; } + + public boolean isDisableBar() { + return disableBar; + } } diff --git a/src/main/java/net/momirealms/customfishing/fishing/loot/Mob.java b/src/main/java/net/momirealms/customfishing/fishing/loot/Mob.java index 725ccb82..37e26876 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/loot/Mob.java +++ b/src/main/java/net/momirealms/customfishing/fishing/loot/Mob.java @@ -26,8 +26,8 @@ public class Mob extends Loot{ private final int mobLevel; private final MobVector mobVector; - public Mob(String key, String nick, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score, String mobID, int mobLevel, MobVector mobVector) { - super(key, nick, fishingGames, weight, showInFinder, score); + public Mob(String key, String nick, MiniGameConfig[] fishingGames, int weight, boolean showInFinder, double score, String mobID, int mobLevel, MobVector mobVector, boolean disableBar) { + super(key, nick, fishingGames, weight, showInFinder, score, disableBar); this.mobID = mobID; this.mobLevel = mobLevel; this.mobVector = mobVector; diff --git a/src/main/java/net/momirealms/customfishing/fishing/totem/ActivatedTotem.java b/src/main/java/net/momirealms/customfishing/fishing/totem/ActivatedTotem.java index 0df2d472..6ed9b7a9 100644 --- a/src/main/java/net/momirealms/customfishing/fishing/totem/ActivatedTotem.java +++ b/src/main/java/net/momirealms/customfishing/fishing/totem/ActivatedTotem.java @@ -35,7 +35,8 @@ public class ActivatedTotem extends BukkitRunnable { public static int id = 127616121; private int timer; private final TotemConfig totem; - private final Location location; + private final Location bottomLoc; + private final Location coreLoc; private final Set nearbyPlayerSet; private final int[] entityID; private final boolean hasHolo; @@ -43,17 +44,18 @@ public class ActivatedTotem extends BukkitRunnable { private final FishingManager fishingManager; private final int direction; - public ActivatedTotem(Location location, TotemConfig totem, FishingManager fishingManager, int direction) { + public ActivatedTotem(Location coreLoc, TotemConfig totem, FishingManager fishingManager, int direction) { this.fishingManager = fishingManager; this.totem = totem; - this.location = location; + this.coreLoc = coreLoc; + this.bottomLoc = coreLoc.clone().subtract(0, totem.getOriginalModel().getCorePos().getY(), 0); this.entityID = new int[totem.getHoloText().length]; for (int i = 0; i < totem.getHoloText().length; i++) { this.entityID[i] = id++; } this.hasHolo = totem.getHoloText() != null; this.nearbyPlayerSet = Collections.synchronizedSet(new HashSet<>()); - this.particleTimerTask = new TotemParticle(location, totem.getRadius(), totem.getParticle()); + this.particleTimerTask = new TotemParticle(bottomLoc, totem.getRadius(), totem.getParticle()); this.particleTimerTask.runTaskTimerAsynchronously(CustomFishing.getInstance(), 0, 4); this.direction = direction; } @@ -68,7 +70,7 @@ public class ActivatedTotem extends BukkitRunnable { } HashSet temp = new HashSet<>(nearbyPlayerSet); - Collection nearbyPlayers = location.getNearbyPlayers(totem.getRadius()); + Collection nearbyPlayers = bottomLoc.getNearbyPlayers(totem.getRadius()); for (Player player : temp) { if (nearbyPlayers.remove(player)) { @@ -95,7 +97,7 @@ public class ActivatedTotem extends BukkitRunnable { for (Player newComer : nearbyPlayers) { if (hasHolo) { for (int i = 0; i < entityID.length; i++) { - CustomFishing.getProtocolManager().sendServerPacket(newComer, ArmorStandUtil.getSpawnPacket(entityID[i], location.clone().add(0.5, totem.getHoloOffset() + i * 0.4, 0.5))); + CustomFishing.getProtocolManager().sendServerPacket(newComer, ArmorStandUtil.getSpawnPacket(entityID[i], bottomLoc.clone().add(0.5, totem.getHoloOffset() + i * 0.4, 0.5))); CustomFishing.getProtocolManager().sendServerPacket(newComer, ArmorStandUtil.getMetaPacket(entityID[i], totem.getHoloText()[entityID.length - 1 - i].replace("{time}", String.valueOf(totem.getDuration() - timer)) .replace("{max_time}", String.valueOf(totem.getDuration())) @@ -118,8 +120,8 @@ public class ActivatedTotem extends BukkitRunnable { public void stop() { this.particleTimerTask.cancel(); cancel(); - fishingManager.removeTotem(location); - CustomFishing.getInstance().getTotemManager().clearBreakDetectCache(totem.getFinalModel(), location, direction); + fishingManager.removeTotem(coreLoc); + CustomFishing.getInstance().getTotemManager().clearBreakDetectCache(totem.getFinalModel(), bottomLoc, direction); if (hasHolo) { for (Player player : nearbyPlayerSet) { for (int j : entityID) { diff --git a/src/main/java/net/momirealms/customfishing/integration/papi/PlaceholderManager.java b/src/main/java/net/momirealms/customfishing/integration/papi/PlaceholderManager.java index 742e8e74..77881acf 100644 --- a/src/main/java/net/momirealms/customfishing/integration/papi/PlaceholderManager.java +++ b/src/main/java/net/momirealms/customfishing/integration/papi/PlaceholderManager.java @@ -17,6 +17,7 @@ package net.momirealms.customfishing.integration.papi; +import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.object.Function; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -29,14 +30,18 @@ import java.util.regex.Pattern; public class PlaceholderManager extends Function { - private final Pattern placeholderPattern = Pattern.compile("%([^%]*)%"); + private CustomFishing plugin; + private final Pattern basicPattern = Pattern.compile("%([^%]*)%"); + private final Pattern betterPattern = Pattern.compile("\\{(.+?)\\}"); private CompetitionPapi competitionPapi; + private StatisticsPapi statisticsPapi; private boolean hasPlaceholderAPI = false; - public PlaceholderManager() { + public PlaceholderManager(CustomFishing plugin) { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { hasPlaceholderAPI = true; this.competitionPapi = new CompetitionPapi(); + //this.statisticsPapi = new StatisticsPapi(plugin); } } @@ -50,17 +55,27 @@ public class PlaceholderManager extends Function { @Override public void load() { if (competitionPapi != null) competitionPapi.register(); + //if (statisticsPapi != null) statisticsPapi.register(); } @Override public void unload() { if (this.competitionPapi != null) competitionPapi.unregister(); + //if (this.statisticsPapi != null) statisticsPapi.unregister(); } - public List detectPlaceholders(String text){ + public List detectBasicPlaceholders(String text){ if (text == null || !text.contains("%")) return Collections.emptyList(); List placeholders = new ArrayList<>(); - Matcher matcher = placeholderPattern.matcher(text); + Matcher matcher = basicPattern.matcher(text); + while (matcher.find()) placeholders.add(matcher.group()); + return placeholders; + } + + public List detectBetterPlaceholders(String text){ + if (text == null || !(text.contains("{") && text.contains("}"))) return Collections.emptyList(); + List placeholders = new ArrayList<>(); + Matcher matcher = betterPattern.matcher(text); while (matcher.find()) placeholders.add(matcher.group()); return placeholders; } diff --git a/src/main/java/net/momirealms/customfishing/integration/papi/StatisticsPapi.java b/src/main/java/net/momirealms/customfishing/integration/papi/StatisticsPapi.java new file mode 100644 index 00000000..48a340c6 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/integration/papi/StatisticsPapi.java @@ -0,0 +1,41 @@ +package net.momirealms.customfishing.integration.papi; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.customfishing.CustomFishing; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class StatisticsPapi extends PlaceholderExpansion { + + private CustomFishing plugin; + + public StatisticsPapi(CustomFishing plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "fishingstats"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "1.0"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + return "null"; + } +} diff --git a/src/main/java/net/momirealms/customfishing/integration/quest/ClueScrollCFQuest.java b/src/main/java/net/momirealms/customfishing/integration/quest/ClueScrollCFQuest.java index 821444ca..97ebd5e0 100644 --- a/src/main/java/net/momirealms/customfishing/integration/quest/ClueScrollCFQuest.java +++ b/src/main/java/net/momirealms/customfishing/integration/quest/ClueScrollCFQuest.java @@ -17,9 +17,7 @@ package net.momirealms.customfishing.integration.quest; -import com.electro2560.dev.cluescrolls.api.ClueDataPair; -import com.electro2560.dev.cluescrolls.api.ClueScrollsAPI; -import com.electro2560.dev.cluescrolls.api.CustomClue; +import com.electro2560.dev.cluescrolls.api.*; import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.api.event.FishResultEvent; import net.momirealms.customfishing.fishing.FishResult; @@ -28,26 +26,16 @@ import org.bukkit.event.Listener; public class ClueScrollCFQuest implements Listener { - private final CustomClue fishClue; - private final CustomClue mobClue; private final CustomClue commonClue; public ClueScrollCFQuest() { - commonClue = ClueScrollsAPI.getInstance().registerCustomClue(CustomFishing.getInstance(), "fish"); - fishClue = ClueScrollsAPI.getInstance().registerCustomClue(CustomFishing.getInstance(), "catch_item"); - mobClue = ClueScrollsAPI.getInstance().registerCustomClue(CustomFishing.getInstance(), "catch_mob"); + commonClue = ClueScrollsAPI.getInstance().registerCustomClue(CustomFishing.getInstance(), "fish", new ClueConfigData("fish_id", DataType.STRING)); } @EventHandler public void onFish(FishResultEvent event) { if (event.isCancelled()) return; if (event.getResult() == FishResult.FAILURE) return; - commonClue.handle(event.getPlayer(), event.isDouble() ? 2 : 1, new ClueDataPair("id", event.getLoot_id())); - if (event.getResult() == FishResult.CATCH_SPECIAL_ITEM || event.getResult() == FishResult.CATCH_VANILLA_ITEM) { - fishClue.handle(event.getPlayer(), event.isDouble() ? 2 : 1, new ClueDataPair("id", event.getLoot_id())); - } - if (event.getResult() == FishResult.CATCH_MOB) { - mobClue.handle(event.getPlayer(), 1, new ClueDataPair("id", event.getLoot_id())); - } + commonClue.handle(event.getPlayer(), event.isDouble() ? 2 : 1, new ClueDataPair("fish_id", event.getLoot_id())); } } diff --git a/src/main/java/net/momirealms/customfishing/manager/BagDataManager.java b/src/main/java/net/momirealms/customfishing/manager/BagDataManager.java index 8962fcdd..e8a9ac24 100644 --- a/src/main/java/net/momirealms/customfishing/manager/BagDataManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/BagDataManager.java @@ -25,7 +25,6 @@ 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.data.PlayerBagData; import net.momirealms.customfishing.listener.InventoryListener; import net.momirealms.customfishing.listener.JoinQuitListener; import net.momirealms.customfishing.listener.WindowPacketListener; @@ -34,6 +33,7 @@ import net.momirealms.customfishing.util.AdventureUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.inventory.InventoryClickEvent; @@ -43,14 +43,14 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; import java.util.HashMap; -import java.util.HashSet; +import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class BagDataManager extends Function { - private final ConcurrentHashMap dataMap; - private final HashSet tempData; + private final ConcurrentHashMap dataMap; + private final HashMap tempData; private final InventoryListener inventoryListener; private final WindowPacketListener windowPacketListener; private final JoinQuitListener joinQuitListener; @@ -61,7 +61,7 @@ public class BagDataManager extends Function { public BagDataManager(CustomFishing plugin) { this.plugin = plugin; this.dataMap = new ConcurrentHashMap<>(); - this.tempData = new HashSet<>(); + this.tempData = new HashMap<>(); this.triedTimes = new HashMap<>(); this.inventoryListener = new InventoryListener(this); @@ -71,8 +71,8 @@ public class BagDataManager extends Function { this.timerSave = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, () -> { AdventureUtil.consoleMessage("[CustomFishing] Saving Fishing bag data..."); DataManager dataManager = plugin.getDataManager(); - for (PlayerBagData playerBagData : dataMap.values()) { - dataManager.getDataStorageInterface().saveBagData(playerBagData, false); + for (Map.Entry entry : dataMap.entrySet()) { + dataManager.getDataStorageInterface().saveBagData(entry.getKey(), entry.getValue(), false); } AdventureUtil.consoleMessage("[CustomFishing] Fishing bag data saved for " + dataMap.size() + " online players."); }, 12000, 12000); @@ -95,16 +95,19 @@ public class BagDataManager extends Function { public void disable() { unload(); - for (PlayerBagData playerBagData : dataMap.values()) { - DataManager dataManager = CustomFishing.getInstance().getDataManager(); - dataManager.getDataStorageInterface().saveBagData(playerBagData, true); + DataManager dataManager = plugin.getDataManager(); + for (Map.Entry entry : dataMap.entrySet()) { + for (HumanEntity humanEntity : entry.getValue().getViewers()) { + humanEntity.closeInventory(); + } + dataManager.getDataStorageInterface().saveBagData(entry.getKey(), entry.getValue(), false); } dataMap.clear(); tempData.clear(); timerSave.cancel(); } - public PlayerBagData getPlayerBagData(UUID uuid) { + public Inventory getPlayerBagData(UUID uuid) { return dataMap.get(uuid); } @@ -112,36 +115,36 @@ public class BagDataManager extends Function { Player owner = ownerOffline.getPlayer(); //not online if (owner == null) { - Inventory inventory = plugin.getDataManager().getDataStorageInterface().loadBagData(ownerOffline, force); + Inventory inventory = plugin.getDataManager().getDataStorageInterface().loadBagData(ownerOffline.getUniqueId(), force); if (inventory == null) { AdventureUtil.playerMessage(viewer, "[CustomFishing] Failed to load bag data for player " + ownerOffline.getName()); AdventureUtil.playerMessage(viewer, "This might be caused when the target player is online but on another server"); AdventureUtil.playerMessage(viewer, "Use /fishingbag open [Player] --force to ignore this warning"); return; } - PlayerBagData playerBagData = new PlayerBagData(ownerOffline, inventory); - tempData.add(playerBagData); + tempData.put(ownerOffline.getUniqueId(), inventory); viewer.openInventory(inventory); } //online else { - PlayerBagData playerBagData = dataMap.get(owner.getUniqueId()); - if (playerBagData == null) { + Inventory inventory = dataMap.get(owner.getUniqueId()); + if (inventory == null) { AdventureUtil.consoleMessage("[CustomFishing] Bag data is not loaded for player " + owner.getName()); } else { - openGui(owner, viewer, playerBagData); + openGui(owner, viewer, inventory); } } } @Override public void onQuit(Player player) { - PlayerBagData playerBagData = dataMap.remove(player.getUniqueId()); + UUID uuid = player.getUniqueId(); + Inventory inventory = dataMap.remove(uuid); triedTimes.remove(player.getUniqueId()); - if (playerBagData != null) { + if (inventory != null) { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - plugin.getDataManager().getDataStorageInterface().saveBagData(playerBagData, true); + plugin.getDataManager().getDataStorageInterface().saveBagData(uuid, inventory, true); }); } } @@ -155,24 +158,19 @@ public class BagDataManager extends Function { public void joinReadData(Player player, boolean force) { if (player == null || !player.isOnline()) return; - Inventory inventory = plugin.getDataManager().getDataStorageInterface().loadBagData(player, force); + Inventory inventory = plugin.getDataManager().getDataStorageInterface().loadBagData(player.getUniqueId(), force); if (inventory != null) { - PlayerBagData playerBagData = new PlayerBagData(player, inventory); - dataMap.put(player.getUniqueId(), playerBagData); + dataMap.put(player.getUniqueId(), inventory); } // If sql exception or data is locked else if (!force) { // can still try to load if (!checkTriedTimes(player.getUniqueId())) { - Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> { - joinReadData(player, false); - }, 20); + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> joinReadData(player, false), 20); } // tried 3 times else { - Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> { - joinReadData(player, true); - }, 20); + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> joinReadData(player, true), 20); } } } @@ -200,9 +198,8 @@ public class BagDataManager extends Function { @Override public void onClickInventory(InventoryClickEvent event) { final Player player = (Player) event.getWhoClicked(); - PlayerBagData playerBagData = dataMap.get(player.getUniqueId()); - if (playerBagData == null) return; - if (playerBagData.getInventory() == event.getInventory()) { + Inventory fishingBagInv = dataMap.get(player.getUniqueId()); + if (fishingBagInv == event.getInventory()) { ItemStack currentItem = event.getCurrentItem(); if (currentItem == null || currentItem.getType() == Material.AIR) return; NBTItem nbtItem = new NBTItem(currentItem); @@ -226,9 +223,9 @@ public class BagDataManager extends Function { public void onCloseInventory(InventoryCloseEvent event) { final Player player = (Player) event.getPlayer(); Inventory inventory = event.getInventory(); - PlayerBagData playerBagData = dataMap.get(player.getUniqueId()); - if (playerBagData != null) { - if (inventory == playerBagData.getInventory()) { + Inventory fishingBagInv = dataMap.get(player.getUniqueId()); + if (fishingBagInv != null) { + if (inventory == fishingBagInv) { for (ItemStack itemStack : event.getInventory().getContents()) { if (itemStack == null || itemStack.getType() == Material.AIR) continue; NBTItem nbtItem = new NBTItem(itemStack); @@ -238,19 +235,18 @@ public class BagDataManager extends Function { } return; } - for (PlayerBagData temp : tempData) { - if (temp.getInventory() == inventory) { - tempData.remove(temp); + for (Map.Entry entry : tempData.entrySet()) { + if (entry.getValue() == inventory) { + tempData.remove(entry.getKey()); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - plugin.getDataManager().getDataStorageInterface().saveBagData(temp, true); + plugin.getDataManager().getDataStorageInterface().saveBagData(entry.getKey(), entry.getValue(), true); }); } } } } - public void openGui(Player owner, Player viewer, PlayerBagData playerBagData) { - Inventory inventory = playerBagData.getInventory(); + public void openGui(Player owner, Player viewer, Inventory inventory) { int size = 1; for (int i = 6; i > 1; i--) { if (owner.hasPermission("fishingbag.rows." + i)) { @@ -259,10 +255,10 @@ public class BagDataManager extends Function { } } if (size * 9 != inventory.getSize()) { - ItemStack[] itemStacks = playerBagData.getInventory().getContents(); + ItemStack[] itemStacks = inventory.getContents(); Inventory newInv = Bukkit.createInventory(null, size * 9, "{CustomFishing_Bag_" + owner.getName() + "}"); newInv.setContents(itemStacks); - playerBagData.setInventory(newInv); + dataMap.put(owner.getUniqueId(), newInv); viewer.openInventory(newInv); } else { @@ -270,7 +266,7 @@ public class BagDataManager extends Function { } } - public boolean checkTriedTimes(UUID uuid) { + private boolean checkTriedTimes(UUID uuid) { Integer previous = triedTimes.get(uuid); if (previous == null) { triedTimes.put(uuid, 1); diff --git a/src/main/java/net/momirealms/customfishing/manager/CompetitionManager.java b/src/main/java/net/momirealms/customfishing/manager/CompetitionManager.java index 2604f928..c85c5a52 100644 --- a/src/main/java/net/momirealms/customfishing/manager/CompetitionManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/CompetitionManager.java @@ -38,7 +38,7 @@ import java.util.*; public class CompetitionManager extends Function { - private CustomFishing plugin; + private final CustomFishing plugin; // Competitions that can be triggered at a specified time private final HashMap competitionsT; // Competitions that can be triggered with a command @@ -83,81 +83,71 @@ public class CompetitionManager extends Function { YamlConfiguration config = YamlConfiguration.loadConfiguration(file); Set keys = config.getKeys(false); for (String key : keys) { - ConfigurationSection section = config.getConfigurationSection(key); - if (section == null) continue; + ConfigurationSection competitionSection = config.getConfigurationSection(key); + if (competitionSection == null) continue; + boolean enableBsb = competitionSection.getBoolean("bossbar.enable", false); + BossBarConfig bossBarConfig = new BossBarConfig( + competitionSection.getStringList("bossbar.text").toArray(new String[0]), + BossBarOverlay.valueOf(competitionSection.getString("bossbar.overlay","SOLID").toUpperCase()), + BarColor.valueOf(competitionSection.getString("bossbar.color","WHITE").toUpperCase()), + competitionSection.getInt("bossbar.refresh-rate",10), + competitionSection.getInt("bossbar.switch-interval", 200) + ); + HashMap rewardsMap = new HashMap<>(); + Objects.requireNonNull(competitionSection.getConfigurationSection("prize")).getKeys(false).forEach(rank -> { + List rewards = new ArrayList<>(); + if (competitionSection.contains("prize." + rank + ".messages")) + rewards.add(new MessageActionImpl(competitionSection.getStringList("prize." + rank + ".messages").toArray(new String[0]), null)); + if (competitionSection.contains("prize." + rank + ".commands")) + rewards.add(new CommandActionImpl(competitionSection.getStringList("prize." + rank + ".commands").toArray(new String[0]), null)); + rewardsMap.put(rank, rewards.toArray(new ActionInterface[0])); + }); + CompetitionConfig competitionConfig = new CompetitionConfig( + competitionSection.getInt("duration",600), + competitionSection.getInt("min-players",1), + competitionSection.getStringList("broadcast.start"), + competitionSection.getStringList("broadcast.end"), + competitionSection.getStringList("command.start"), + competitionSection.getStringList("command.end"), + competitionSection.getStringList("command.join"), + CompetitionGoal.valueOf(competitionSection.getString("goal", "RANDOM")), + bossBarConfig, + enableBsb, + rewardsMap + ); + + if (competitionSection.contains("start-weekday")) { + List days = new ArrayList<>(); + for (String weekDay : competitionSection.getStringList("start-weekday")) { + switch (weekDay) { + case "Sunday" -> days.add(1); + case "Monday" -> days.add(2); + case "Tuesday" -> days.add(3); + case "Wednesday" -> days.add(4); + case "Thursday" -> days.add(5); + case "Friday" -> days.add(6); + case "Saturday" -> days.add(7); + default -> AdventureUtil.consoleMessage("[CustomFishing] Unknown weekday: " + weekDay); + } + } + competitionConfig.setWeekday(days); + } + + if (competitionSection.contains("start-date")) { + List days = new ArrayList<>(); + for (String weekDay : competitionSection.getStringList("start-date")) { + days.add(Integer.parseInt(weekDay)); + } + competitionConfig.setDate(days); + } + competitionSection.getStringList("start-time").forEach(time -> competitionsT.put(time, competitionConfig)); + competitionsC.put(key, competitionConfig); amount++; } } - AdventureUtil.consoleMessage("[CustomFishing] Loaded " + amount + " competition(s)"); - - - YamlConfiguration config = ConfigUtil.getConfig("competitions/default.yml"); - Set keys = config.getKeys(false); - keys.forEach(key -> { - boolean enableBsb = config.getBoolean(key + ".bossbar.enable", false); - BossBarConfig bossBarConfig = new BossBarConfig( - config.getStringList(key + ".bossbar.text").toArray(new String[0]), - BossBarOverlay.valueOf(config.getString(key + ".bossbar.overlay","SOLID").toUpperCase()), - BarColor.valueOf(config.getString(key + ".bossbar.color","WHITE").toUpperCase()), - config.getInt(key + ".bossbar.refresh-rate",10), - config.getInt(key + ".bossbar.switch-interval", 200) - ); - - HashMap rewardsMap = new HashMap<>(); - Objects.requireNonNull(config.getConfigurationSection(key + ".prize")).getKeys(false).forEach(rank -> { - List rewards = new ArrayList<>(); - if (config.contains(key + ".prize." + rank + ".messages")) - rewards.add(new MessageActionImpl(config.getStringList(key + ".prize." + rank + ".messages").toArray(new String[0]), null)); - if (config.contains(key + ".prize." + rank + ".commands")) - rewards.add(new CommandActionImpl(config.getStringList(key + ".prize." + rank + ".commands").toArray(new String[0]), null)); - rewardsMap.put(rank, rewards.toArray(new ActionInterface[0])); - }); - - CompetitionConfig competitionConfig = new CompetitionConfig( - config.getInt(key + ".duration",600), - config.getInt(key + ".min-players",1), - config.getStringList(key + ".broadcast.start"), - config.getStringList(key + ".broadcast.end"), - config.getStringList(key + ".command.start"), - config.getStringList(key + ".command.end"), - config.getStringList(key + ".command.join"), - CompetitionGoal.valueOf(config.getString(key + ".goal", "RANDOM")), - bossBarConfig, - enableBsb, - rewardsMap - ); - - if (config.contains(key + ".start-weekday")) { - List days = new ArrayList<>(); - for (String weekDay : config.getStringList(key + ".start-weekday")) { - switch (weekDay) { - case "Sunday" -> days.add(1); - case "Monday" -> days.add(2); - case "Tuesday" -> days.add(3); - case "Wednesday" -> days.add(4); - case "Thursday" -> days.add(5); - case "Friday" -> days.add(6); - case "Saturday" -> days.add(7); - default -> AdventureUtil.consoleMessage("[CustomFishing] Unknown weekday: " + weekDay); - } - } - competitionConfig.setWeekday(days); - } - - if (config.contains(key + ".start-date")) { - List days = new ArrayList<>(); - for (String weekDay : config.getStringList(key + ".start-date")) { - days.add(Integer.parseInt(weekDay)); - } - competitionConfig.setDate(days); - } - - config.getStringList(key + ".start-time").forEach(time -> competitionsT.put(time, competitionConfig)); - competitionsC.put(key, competitionConfig); - }); } public HashMap getCompetitionsT() { diff --git a/src/main/java/net/momirealms/customfishing/manager/ConfigManager.java b/src/main/java/net/momirealms/customfishing/manager/ConfigManager.java index cd086747..5d413988 100644 --- a/src/main/java/net/momirealms/customfishing/manager/ConfigManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/ConfigManager.java @@ -34,7 +34,6 @@ public class ConfigManager { public static boolean whiteOrBlack; public static String priority; public static String lang; - public static boolean otherLootBar; public static boolean enableVanillaLoot; public static boolean enableMcMMOLoot; public static double vanillaLootRatio; @@ -47,7 +46,7 @@ public class ConfigManager { public static boolean convertMMOItems; public static boolean preventPickUp; public static boolean enableFishingBag; - public static boolean alwaysFishingBar; + public static boolean otherLootHasFishingBar; public static boolean allRodsFishInLava; public static boolean enableSuccessTitle; public static String[] successTitle; @@ -76,13 +75,15 @@ public class ConfigManager { public static boolean disableBar; public static boolean instantBar; public static String fishingBagTitle; - + public static boolean bStats; public static HashSet bagWhiteListItems; + public static boolean enableStatistics; public static void load() { ConfigUtil.update("config.yml"); YamlConfiguration config = ConfigUtil.getConfig("config.yml"); lang = config.getString("lang","english"); + bStats = config.getBoolean("metrics", true); loadMechanics(config); loadTitle(config); loadFishingWorlds(config); @@ -100,8 +101,7 @@ public class ConfigManager { private static void loadMechanics(YamlConfiguration config) { disableBar = config.getBoolean("mechanics.disable-bar-mechanic", false); instantBar = config.getBoolean("mechanics.instant-bar", false); - alwaysFishingBar = config.getBoolean("mechanics.other-loots.fishing-bar", true); - otherLootBar = config.getBoolean("mechanics.other-loots.fishing-bar", true); + otherLootHasFishingBar = config.getBoolean("mechanics.other-loots.fishing-bar", true); enableVanillaLoot = config.getBoolean("mechanics.other-loots.vanilla.enable", true); vanillaLootRatio = config.getDouble("mechanics.other-loots.vanilla.ratio", 0.4); enableMcMMOLoot = config.getBoolean("mechanics.other-loots.mcMMO.enable", false); diff --git a/src/main/java/net/momirealms/customfishing/manager/DataManager.java b/src/main/java/net/momirealms/customfishing/manager/DataManager.java index 9a603b4f..2a153f23 100644 --- a/src/main/java/net/momirealms/customfishing/manager/DataManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/DataManager.java @@ -21,23 +21,19 @@ import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.data.storage.DataStorageInterface; import net.momirealms.customfishing.data.storage.FileStorageImpl; import net.momirealms.customfishing.data.storage.MySQLStorageImpl; +import net.momirealms.customfishing.data.storage.StorageType; import net.momirealms.customfishing.object.Function; import net.momirealms.customfishing.util.ConfigUtil; import org.bukkit.configuration.file.YamlConfiguration; public class DataManager extends Function { - private final DataStorageInterface dataStorageInterface; - private CustomFishing plugin; + private DataStorageInterface dataStorageInterface; + private final CustomFishing plugin; + private StorageType storageType; public DataManager(CustomFishing plugin) { this.plugin = plugin; - YamlConfiguration config = ConfigUtil.getConfig("database.yml"); - if (config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML")) { - this.dataStorageInterface = new FileStorageImpl(plugin); - } else { - this.dataStorageInterface = new MySQLStorageImpl(plugin); - } load(); } @@ -45,13 +41,33 @@ public class DataManager extends Function { return dataStorageInterface; } + private boolean loadStorageMode() { + YamlConfiguration config = ConfigUtil.getConfig("database.yml"); + if (config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML")) { + if (storageType != StorageType.YAML) { + this.dataStorageInterface = new FileStorageImpl(plugin); + this.storageType = StorageType.YAML; + return true; + } + } else { + if (storageType != StorageType.SQL) { + this.dataStorageInterface = new MySQLStorageImpl(plugin); + this.storageType = StorageType.SQL; + return true; + } + } + return false; + } + @Override public void load() { - this.dataStorageInterface.initialize(); + if (loadStorageMode()) this.dataStorageInterface.initialize(); } @Override public void unload() { - this.dataStorageInterface.disable(); + YamlConfiguration config = ConfigUtil.getConfig("database.yml"); + StorageType st = config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML") ? StorageType.YAML : StorageType.SQL; + if (this.dataStorageInterface != null && dataStorageInterface.getStorageType() != st) this.dataStorageInterface.disable(); } } diff --git a/src/main/java/net/momirealms/customfishing/manager/EffectManager.java b/src/main/java/net/momirealms/customfishing/manager/EffectManager.java index 3d4b0bb1..55c0c893 100644 --- a/src/main/java/net/momirealms/customfishing/manager/EffectManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/EffectManager.java @@ -158,6 +158,7 @@ public class EffectManager extends Function { for (String key : keys) { ConfigurationSection rodSection = config.getConfigurationSection(key); if (rodSection == null) continue; + rodSection.set("material", "fishing_rod"); Item item = new Item(rodSection, key); rodItems.put(key, ItemStackUtil.addIdentifier(ItemStackUtil.getFromItem(item), "rod", key)); if (rodSection.contains("effect")) { @@ -186,8 +187,8 @@ public class EffectManager extends Function { case "time" -> effect.setTimeModifier(section.getDouble(modifier)); case "difficulty" -> effect.setDifficulty(section.getInt(modifier)); case "double-loot" -> effect.setDoubleLootChance(section.getDouble(modifier)); - case "score" -> effect.setScoreMultiplier(section.getDouble(modifier) - 1); - case "size-multiply" -> effect.setSizeMultiplier(section.getDouble(modifier) - 1); + case "score" -> effect.setScoreMultiplier(section.getDouble(modifier)); + case "size-multiply" -> effect.setSizeMultiplier(section.getDouble(modifier)); case "lava-fishing" -> effect.setCanLavaFishing(section.getBoolean(modifier, false)); } } diff --git a/src/main/java/net/momirealms/customfishing/manager/FishingManager.java b/src/main/java/net/momirealms/customfishing/manager/FishingManager.java index b2a23b96..cbda499f 100644 --- a/src/main/java/net/momirealms/customfishing/manager/FishingManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/FishingManager.java @@ -22,11 +22,9 @@ import de.tr7zw.changeme.nbtapi.NBTItem; import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; -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.*; -import net.momirealms.customfishing.data.PlayerBagData; import net.momirealms.customfishing.fishing.*; import net.momirealms.customfishing.fishing.bar.FishingBar; import net.momirealms.customfishing.fishing.bar.ModeOneBar; @@ -54,7 +52,6 @@ import net.momirealms.customfishing.util.AdventureUtil; import net.momirealms.customfishing.util.FakeItemUtil; import net.momirealms.customfishing.util.ItemStackUtil; import net.momirealms.customfishing.util.LocationUtils; -import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -78,6 +75,8 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class FishingManager extends Function { @@ -248,9 +247,8 @@ public class FishingManager extends Function { } if (ConfigManager.enableFishingBag && noBait) { - PlayerBagData playerBagData = plugin.getBagDataManager().getPlayerBagData(player.getUniqueId()); - if (playerBagData != null) { - Inventory baitInv = playerBagData.getInventory(); + Inventory baitInv = plugin.getBagDataManager().getPlayerBagData(player.getUniqueId()); + if (baitInv != null) { for (int i = 0; i < baitInv.getSize(); i++) { ItemStack itemStack = baitInv.getItem(i); if (itemStack == null || itemStack.getType() == Material.AIR) continue; @@ -373,18 +371,22 @@ public class FishingManager extends Function { if (ConfigManager.enableVanillaLoot) { // Not a vanilla loot if (ConfigManager.vanillaLootRatio < Math.random()) { - event.setCancelled(true); if (loot != null) { vanillaLoot.remove(player); + if (loot.isDisableBar()) { + noBarWaterReelIn(event); + return; + } } else { vanillaLoot.put(player, new VanillaLoot(item.getItemStack(), event.getExpToDrop())); } + event.setCancelled(true); showFishingBar(player, loot); } // Is vanilla loot else { - if (ConfigManager.alwaysFishingBar) { + if (ConfigManager.otherLootHasFishingBar) { event.setCancelled(true); vanillaLoot.put(player, new VanillaLoot(item.getItemStack(), event.getExpToDrop())); showFishingBar(player, null); @@ -400,6 +402,10 @@ public class FishingManager extends Function { AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.noLoot); } else { + if (loot.isDisableBar()) { + noBarWaterReelIn(event); + return; + } event.setCancelled(true); showFishingBar(player, loot); } @@ -507,6 +513,10 @@ public class FishingManager extends Function { if (bobberCheckTask != null && bobberCheckTask.isHooked()) { Loot loot = nextLoot.get(player); if (loot == Loot.EMPTY) return; + if (loot.isDisableBar()) { + noBarLavaReelIn(event); + return; + } showFishingBar(player, loot); event.setCancelled(true); } @@ -521,13 +531,7 @@ public class FishingManager extends Function { } if (Competition.currentCompetition != null) { - float score; - if (Competition.currentCompetition.getGoal() == CompetitionGoal.MAX_SIZE || Competition.currentCompetition.getGoal() == CompetitionGoal.TOTAL_SIZE) { - score = getSize(drop); - } - else { - score = (float) ((float) droppedItem.getScore() * scoreMultiplier); - } + float score = Competition.currentCompetition.getGoal() == CompetitionGoal.MAX_SIZE || Competition.currentCompetition.getGoal() == CompetitionGoal.TOTAL_SIZE ? getSize(drop) : (float) ((float) droppedItem.getScore() * scoreMultiplier); Competition.currentCompetition.refreshData(player, score, fishResultEvent.isDouble()); Competition.currentCompetition.tryAddBossBarToPlayer(player); } @@ -590,8 +594,8 @@ public class FishingManager extends Function { private void dropItem(Player player, Location location, boolean isDouble, ItemStack itemStack) { if (itemStack.getType() == Material.AIR) return; Entity item = location.getWorld().dropItem(location, itemStack); - Vector vector = player.getLocation().subtract(location).toVector().multiply(0.1); - vector = vector.setY((vector.getY()+0.2) * 1.15); + Vector vector = player.getLocation().subtract(location).toVector().multiply(0.105); + vector = vector.setY((vector.getY()+0.19) * 1.15); item.setVelocity(vector); if (isDouble) { Entity item2 = location.getWorld().dropItem(location, itemStack); @@ -637,12 +641,7 @@ public class FishingManager extends Function { } if (Competition.currentCompetition != null) { - float score; - if (Competition.currentCompetition.getGoal() == CompetitionGoal.MAX_SIZE || Competition.currentCompetition.getGoal() == CompetitionGoal.TOTAL_SIZE) { - score = 0; - } - else score = (float) loot.getScore(); - + float score = Competition.currentCompetition.getGoal() == CompetitionGoal.MAX_SIZE || Competition.currentCompetition.getGoal() == CompetitionGoal.TOTAL_SIZE ? 0 : (float) loot.getScore(); Competition.currentCompetition.refreshData(player, (float) (score * scoreMultiplier), false); Competition.currentCompetition.tryAddBossBarToPlayer(player); } @@ -655,24 +654,18 @@ public class FishingManager extends Function { @NotNull private Component getTitleComponent(ItemStack itemStack, String text) { - Component component; - if (text.contains("{loot}")){ - text = text.replace("{loot}","|"); - if (text.startsWith("|")){ - component = getDisplayName(itemStack).append(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.substring(1)))); - } - else if (text.endsWith("|")){ - component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.substring(0,text.length() - 1))).append(getDisplayName(itemStack)); - } - else { - String[] titleSplit = StringUtils.split(text, "|"); - component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(titleSplit[0])).append(getDisplayName(itemStack)).append(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(titleSplit[1]))); - } + Component titleComponent = Component.text(""); + int startIndex = 0; + int lootIndex; + while ((lootIndex = text.indexOf("{loot}", startIndex)) != -1) { + String before = text.substring(startIndex, lootIndex); + titleComponent = titleComponent.append(AdventureUtil.getComponentFromMiniMessage(before)); + startIndex = lootIndex + 6; + titleComponent = titleComponent.append(getDisplayName(itemStack)); } - else { - component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text)); - } - return component; + String after = text.substring(startIndex); + titleComponent = titleComponent.append(AdventureUtil.getComponentFromMiniMessage(after)); + return titleComponent; } private void sendSuccessTitle(Player player, String loot) { @@ -714,20 +707,25 @@ public class FishingManager extends Function { private void loseDurability(Player player) { if (player.getGameMode() == GameMode.CREATIVE) return; Bukkit.getScheduler().runTaskLater(plugin, () -> { - PlayerInventory inventory = player.getInventory(); - ItemStack mainHand = inventory.getItemInMainHand(); - if (mainHand.getType() == Material.FISHING_ROD){ - plugin.getIntegrationManager().loseCustomDurability(mainHand, player); - } - else { - ItemStack offHand = inventory.getItemInOffHand(); - if (offHand.getType() == Material.FISHING_ROD){ - plugin.getIntegrationManager().loseCustomDurability(offHand, player); - } + ItemStack rod = getFishingRod(player); + if (rod != null) { + plugin.getIntegrationManager().loseCustomDurability(rod, player); } }, 1); } + private ItemStack getFishingRod(Player player) { + ItemStack mainHand = player.getInventory().getItemInMainHand(); + if (mainHand.getType() == Material.FISHING_ROD) { + return mainHand; + } + ItemStack offHand = player.getInventory().getItemInOffHand(); + if (offHand.getType() == Material.FISHING_ROD) { + return offHand; + } + return null; + } + public void fail(Player player, Loot loot, boolean isVanilla) { FishResultEvent fishResultEvent = new FishResultEvent(player, FishResult.FAILURE, false, null, "null"); Bukkit.getServer().getPluginManager().callEvent(fishResultEvent); @@ -804,16 +802,13 @@ public class FishingManager extends Function { private void setCustomTag(ItemStack itemStack) { if(itemStack.getType() != Material.FISHING_ROD) return; NBTItem nbtItem = new NBTItem(itemStack); - if (nbtItem.getCompound("CustomFishing") != null) return; - if (!nbtItem.hasTag("MMOITEMS_ITEM_ID")) return; + if (nbtItem.getCompound("CustomFishing") != null || !nbtItem.hasTag("MMOITEMS_ITEM_ID")) return; ItemStackUtil.addIdentifier(itemStack, "rod", nbtItem.getString("MMOITEMS_ITEM_ID")); } public boolean isCoolDown(Player player, long delay) { long time = System.currentTimeMillis(); - if (time - (coolDown.getOrDefault(player, time - delay)) < delay) return true; - coolDown.put(player, time); - return false; + return coolDown.computeIfAbsent(player, k -> time - delay) + delay > time; } private void enchantBonus(Effect initialEffect, ItemStack itemStack) { @@ -828,24 +823,22 @@ public class FishingManager extends Function { } public List getPossibleLootList(FishingCondition fishingCondition, boolean finder, Collection values) { - List available = new ArrayList<>(); - outer: - for (Loot loot : values) { - if (finder && !loot.isShowInFinder()) continue; - RequirementInterface[] requirements = loot.getRequirements(); - if (requirements == null){ - available.add(loot); - } - else { - for (RequirementInterface requirement : requirements) { - if (!requirement.isConditionMet(fishingCondition)) { - continue outer; - } - } - available.add(loot); + Stream stream = values.stream(); + if (finder) { + stream = stream.filter(Loot::isShowInFinder); + } + return stream.filter(loot -> { + RequirementInterface[] requirements = loot.getRequirements(); + if (requirements == null) { + return true; + } + for (RequirementInterface requirement : requirements) { + if (!requirement.isConditionMet(fishingCondition)) { + return false; } } - return available; + return true; + }).collect(Collectors.toList()); } @Override @@ -907,10 +900,9 @@ public class FishingManager extends Function { } } - Location bottomLoc = coreLoc.clone().subtract(0, totem.getOriginalModel().getCorePos().getY(), 0); - ActivatedTotem activatedTotem = new ActivatedTotem(bottomLoc, totem, this, direction); + ActivatedTotem activatedTotem = new ActivatedTotem(coreLoc, totem, this, direction); activatedTotem.runTaskTimer(plugin, 10, 20); - activeTotemMap.put(LocationUtils.getSimpleLocation(bottomLoc), activatedTotem); + activeTotemMap.put(LocationUtils.getSimpleLocation(coreLoc), activatedTotem); } private void useFinder(Player player) { @@ -933,43 +925,26 @@ public class FishingManager extends Function { } private void showFishingBar(Player player, @Nullable Loot loot){ - MiniGameConfig game; - if (loot != null && loot.getFishingGames() != null) { - game = loot.getFishingGames()[new Random().nextInt(loot.getFishingGames().length)]; - } - else { - game = plugin.getBarMechanicManager().getRandomGame(); - } - int difficult = game.getRandomDifficulty(); - Effect effect = nextEffect.get(player); - if (effect != null) { - difficult += effect.getDifficulty(); - } - FishHookEvent fishHookEvent = new FishHookEvent(player, difficult); + MiniGameConfig game = (loot != null && loot.getFishingGames() != null) + ? loot.getFishingGames()[new Random().nextInt(loot.getFishingGames().length)] + : plugin.getBarMechanicManager().getRandomGame(); + int difficult = game.getRandomDifficulty() + nextEffect.getOrDefault(player, new Effect()).getDifficulty(); + FishHookEvent fishHookEvent = new FishHookEvent(player, Math.max(1, difficult)); Bukkit.getPluginManager().callEvent(fishHookEvent); - if (fishHookEvent.isCancelled()) { - return; - } - difficult = fishHookEvent.getDifficulty(); - if (difficult < 1) { - difficult = 1; - } - FishingBar fishingBar = game.getRandomBar(); + FishingGame fishingGame = null; if (fishingBar instanceof ModeOneBar modeOneBar) { - ModeOneGame modeOneGame = new ModeOneGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, difficult, modeOneBar); - modeOneGame.runTaskTimer(plugin, 0, 1); - fishingPlayerMap.put(player, modeOneGame); + fishingGame = new ModeOneGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, fishHookEvent.getDifficulty(), modeOneBar); } else if (fishingBar instanceof ModeTwoBar modeTwoBar) { - ModeTwoGame modeTwoGame = new ModeTwoGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, difficult, modeTwoBar); - modeTwoGame.runTaskTimer(plugin, 0, 1); - fishingPlayerMap.put(player, modeTwoGame); + fishingGame = new ModeTwoGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, fishHookEvent.getDifficulty(), modeTwoBar); } else if (fishingBar instanceof ModeThreeBar modeThreeBar) { - ModeThreeGame modeThreeGame = new ModeThreeGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, difficult, modeThreeBar); - modeThreeGame.runTaskTimer(plugin, 0, 1); - fishingPlayerMap.put(player, modeThreeGame); + fishingGame = new ModeThreeGame(plugin, this, System.currentTimeMillis() + game.getTime() * 1000L, player, fishHookEvent.getDifficulty(), modeThreeBar); + } + if (fishingGame != null) { + fishingGame.runTaskTimer(plugin, 0, 1); + fishingPlayerMap.put(player, fishingGame); } if (vanillaLoot.get(player) == null && loot != null){ for (ActionInterface action : loot.getHookActions()) { @@ -987,7 +962,6 @@ public class FishingManager extends Function { vanillaLoot.remove(player); BobberCheckTask task = hookCheckTaskMap.remove(player); if (task != null) task.stop(); - // prevent bar duplication removeBobber(player); } @@ -1014,8 +988,8 @@ public class FishingManager extends Function { else return GsonComponentSerializer.gson().deserialize("{\"translate\":\"item.minecraft." + type + "\"}"); } - public void removeTotem(Location location) { - activeTotemMap.remove(LocationUtils.getSimpleLocation(location)); + public void removeTotem(Location coreLoc) { + activeTotemMap.remove(LocationUtils.getSimpleLocation(coreLoc)); } public void removePlayerFromLavaFishing(Player player) { @@ -1023,16 +997,12 @@ public class FishingManager extends Function { } public float getSize(ItemStack itemStack) { - NBTItem nbtItem = new NBTItem(itemStack); - NBTCompound fishMeta = nbtItem.getCompound("FishMeta"); - if (fishMeta != null) { - return fishMeta.getFloat("size"); - } - return 0; + NBTCompound fishMeta = new NBTItem(itemStack).getCompound("FishMeta"); + return fishMeta != null ? fishMeta.getFloat("size") : 0; } - public void addTotemBreakDetectToCache(SimpleLocation part, SimpleLocation bottom) { - breakDetectionMap.put(part, bottom); + public void addTotemBreakDetectToCache(SimpleLocation part, SimpleLocation coreLoc) { + breakDetectionMap.put(part, coreLoc); } public void removeTotemBreakDetectFromCache(SimpleLocation part) { @@ -1041,12 +1011,13 @@ public class FishingManager extends Function { @Override public void onBreakBlock(BlockBreakEvent event) { - final Block block = event.getBlock(); - SimpleLocation bottomLoc = breakDetectionMap.get(LocationUtils.getSimpleLocation(block.getLocation())); - if (bottomLoc == null) return; - ActivatedTotem activatedTotem = activeTotemMap.get(bottomLoc); - if (activatedTotem == null) return; - activatedTotem.stop(); + SimpleLocation coreLoc = breakDetectionMap.get(LocationUtils.getSimpleLocation(event.getBlock().getLocation())); + if (coreLoc != null) { + ActivatedTotem activatedTotem = activeTotemMap.get(coreLoc); + if (activatedTotem != null) { + activatedTotem.stop(); + } + } } public void removeBobber(Player player) { @@ -1064,8 +1035,7 @@ public class FishingManager extends Function { @Override public void onConsumeItem(PlayerItemConsumeEvent event) { ItemStack itemStack = event.getItem(); - NBTItem nbtItem = new NBTItem(itemStack); - NBTCompound nbtCompound = nbtItem.getCompound("CustomFishing"); + NBTCompound nbtCompound = new NBTItem(itemStack).getCompound("CustomFishing"); if (nbtCompound == null) return; if (!nbtCompound.getString("type").equals("loot")) return; String lootKey = nbtCompound.getString("id"); diff --git a/src/main/java/net/momirealms/customfishing/manager/IntegrationManager.java b/src/main/java/net/momirealms/customfishing/manager/IntegrationManager.java index 7c736672..7b2e6a51 100644 --- a/src/main/java/net/momirealms/customfishing/manager/IntegrationManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/IntegrationManager.java @@ -63,7 +63,7 @@ public class IntegrationManager extends Function { public IntegrationManager(CustomFishing plugin) { this.plugin = plugin; this.pluginManager = Bukkit.getPluginManager(); - this.placeholderManager = new PlaceholderManager(); + this.placeholderManager = new PlaceholderManager(plugin); this.blockInterface = new VanillaBlockImpl(); } diff --git a/src/main/java/net/momirealms/customfishing/manager/LootManager.java b/src/main/java/net/momirealms/customfishing/manager/LootManager.java index 14db8db3..2647c8b9 100644 --- a/src/main/java/net/momirealms/customfishing/manager/LootManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/LootManager.java @@ -113,7 +113,8 @@ public class LootManager extends Function { new MobVector( mobSection.getDouble("vector.horizontal",1.1), mobSection.getDouble("vector.vertical",1.3) - ) + ), + mobSection.getBoolean("disable-bar-mechanic", false) ); setActions(mobSection, loot); @@ -152,7 +153,8 @@ public class LootManager extends Function { lootSection.getInt("weight",10), lootSection.getBoolean("show-in-fishfinder", true), lootSection.getDouble("score"), - lootSection.getBoolean("random-durability", false) + lootSection.getBoolean("random-durability", false), + lootSection.getBoolean("disable-bar-mechanic", false) ); if (lootSection.contains("size")) { diff --git a/src/main/java/net/momirealms/customfishing/manager/SellManager.java b/src/main/java/net/momirealms/customfishing/manager/SellManager.java index c48ce755..48e8f157 100644 --- a/src/main/java/net/momirealms/customfishing/manager/SellManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/SellManager.java @@ -56,6 +56,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; public class SellManager extends Function { @@ -150,7 +151,7 @@ public class SellManager extends Function { public void joinReadData(Player player, boolean force) { if (player == null || !player.isOnline()) return; - PlayerSellData sellData = plugin.getDataManager().getDataStorageInterface().loadSellData(player, force); + PlayerSellData sellData = plugin.getDataManager().getDataStorageInterface().loadSellData(player.getUniqueId(), force); if (sellData != null) { sellDataMap.put(player.getUniqueId(), sellData); } diff --git a/src/main/java/net/momirealms/customfishing/manager/StatisticsManager.java b/src/main/java/net/momirealms/customfishing/manager/StatisticsManager.java new file mode 100644 index 00000000..9ea6451b --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/manager/StatisticsManager.java @@ -0,0 +1,4 @@ +package net.momirealms.customfishing.manager; + +public class StatisticsManager { +} diff --git a/src/main/java/net/momirealms/customfishing/manager/TotemManager.java b/src/main/java/net/momirealms/customfishing/manager/TotemManager.java index 46af81bc..830cc559 100644 --- a/src/main/java/net/momirealms/customfishing/manager/TotemManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/TotemManager.java @@ -18,7 +18,6 @@ package net.momirealms.customfishing.manager; import net.momirealms.customfishing.CustomFishing; -import net.momirealms.customfishing.fishing.requirements.*; import net.momirealms.customfishing.fishing.totem.CorePos; import net.momirealms.customfishing.fishing.totem.FinalModel; import net.momirealms.customfishing.fishing.totem.OriginalModel; @@ -112,7 +111,7 @@ public class TotemManager extends Function { } private void loadBlocks() { - YamlConfiguration config = ConfigUtil.getConfig("totem-blocks/default.yml"); + YamlConfiguration config = ConfigUtil.getConfig("totem_blocks/default.yml"); config.getKeys(false).forEach(key -> blockIDs.put(key, config.getString(key))); config.getKeys(false).forEach(key -> invertedIDs.put(config.getString(key), key)); } @@ -427,7 +426,7 @@ public class TotemManager extends Function { return 0; } - public void removeModel(FinalModel model, Location location, int direction) { + public void removeModel(FinalModel model, Location coreLoc, int direction) { BlockInterface blockInterface = plugin.getIntegrationManager().getBlockInterface(); @@ -440,7 +439,7 @@ public class TotemManager extends Function { int length = model.getLength(); int width = model.getWidth(); - Location startLoc = location.clone().subtract(0, yOffset, 0); + Location startLoc = coreLoc.clone().subtract(0, yOffset, 0); switch (direction) { case 1: @@ -455,7 +454,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")) { blockInterface.replaceBlock(loc.clone().add(x, 0, z), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(x, 0, z)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(x, 0, z)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -471,7 +470,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(-x, 0, -z), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-x, 0, -z)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-x, 0, -z)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -487,7 +486,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(z, 0, -x), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(z, 0, -x)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(z, 0, -x)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -503,7 +502,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(-z, 0, x), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-z, 0, x)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-z, 0, x)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -519,7 +518,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(z, 0, x), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(z, 0, x)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(z, 0, x)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -535,7 +534,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(-z, 0, -x), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-z, 0, -x)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-z, 0, -x)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -551,7 +550,7 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(x, 0, -z), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(x, 0, -z)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(x, 0, -z)), LocationUtils.getSimpleLocation(coreLoc)); } } break; @@ -567,22 +566,20 @@ public class TotemManager extends Function { if (!model.getElement(x, z, i).equals("*")){ blockInterface.replaceBlock(loc.clone().add(-x, 0, z), model.getElement(x, z, i)); } - plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-x, 0, z)), LocationUtils.getSimpleLocation(startLoc)); + plugin.getFishingManager().addTotemBreakDetectToCache(LocationUtils.getSimpleLocation(loc.clone().add(-x, 0, z)), LocationUtils.getSimpleLocation(coreLoc)); } } break; } } - public void clearBreakDetectCache(FinalModel model, Location location, int direction) { + public void clearBreakDetectCache(FinalModel model, Location startLoc, int direction) { CorePos corePos = model.getCorePos(); int xOffset = corePos.getX(); - int yOffset = corePos.getY(); int zOffset = corePos.getZ(); int height = model.getHeight(); int length = model.getLength(); int width = model.getWidth(); - Location startLoc = location.clone().subtract(0, yOffset, 0); switch (direction) { case 1: for (int i = 0; i < height; i++) { diff --git a/src/main/java/net/momirealms/customfishing/object/DynamicText.java b/src/main/java/net/momirealms/customfishing/object/DynamicText.java index 51fbb9ff..dd348524 100644 --- a/src/main/java/net/momirealms/customfishing/object/DynamicText.java +++ b/src/main/java/net/momirealms/customfishing/object/DynamicText.java @@ -41,7 +41,7 @@ public class DynamicText { } private void analyze(String value) { - List placeholdersOwner = new ArrayList<>(CustomFishing.getInstance().getIntegrationManager().getPlaceholderManager().detectPlaceholders(value)); + List placeholdersOwner = new ArrayList<>(CustomFishing.getInstance().getIntegrationManager().getPlaceholderManager().detectBasicPlaceholders(value)); String origin = value; for (String placeholder : placeholdersOwner) { origin = origin.replace(placeholder, "%s"); diff --git a/src/main/java/net/momirealms/customfishing/util/AdventureUtil.java b/src/main/java/net/momirealms/customfishing/util/AdventureUtil.java index 802dfa6e..9e63f116 100644 --- a/src/main/java/net/momirealms/customfishing/util/AdventureUtil.java +++ b/src/main/java/net/momirealms/customfishing/util/AdventureUtil.java @@ -32,6 +32,10 @@ import java.time.Duration; public class AdventureUtil { + public static Component getComponentFromMiniMessage(String text) { + return MiniMessage.miniMessage().deserialize(replaceLegacy(text)); + } + /** * Send a message to a command sender * @param sender sender diff --git a/src/main/resources/competitions/default.yml b/src/main/resources/competitions/default.yml index 26deb869..ef671cc0 100644 --- a/src/main/resources/competitions/default.yml +++ b/src/main/resources/competitions/default.yml @@ -59,16 +59,16 @@ example: - ' <#B0C4DE>Start fishing to participate!' - '' - '<#D4F2E7>◣─────────────────────────◢' - # You can add unlimited player rank info by using %x_player% & %x_score% + # You can add unlimited player rank info by using {x_player} {x_score} end: - '<#D4F2E7>◤─────────────────────────◥' - '' - ' [<#87CEFA>🎣] Fishing Competition' - '' - ' <#E1FFFF>Results:' - - ' No.①: %1_player% - %1_score%' - - ' No.②: %2_player% - %2_score%' - - ' No.③: %3_player% - %3_score%' + - ' No.①: {1_player} - {1_score}' + - ' No.②: {2_player} - {2_score}' + - ' No.③: {3_player} - {3_score}' - '' - '<#D4F2E7>◣─────────────────────────◢' diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 47924900..411748af 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,8 @@ # Don't change -config-version: '16' +config-version: '17' + +# bStats +metrics: true # Wiki: https://mo-mi.gitbook.io/xiaomomi-plugins/ # chinese/english/spanish diff --git a/src/main/resources/loots/example.yml b/src/main/resources/loots/example.yml index 0aa6a699..691bf572 100644 --- a/src/main/resources/loots/example.yml +++ b/src/main/resources/loots/example.yml @@ -2,6 +2,9 @@ rainbow_fish: # Enable # 是否启用 enable: false + # Disable bar mechanic for a certain loot + # 为某个战利品关闭捕鱼条机制 + disable-bar-mechanic: false # Nick is what to show in fish finder and titles # 昵称将在标题和找鱼器信息中显示 nick: 'Example Fish' diff --git a/src/main/resources/totem-blocks/default.yml b/src/main/resources/totem_blocks/default.yml similarity index 100% rename from src/main/resources/totem-blocks/default.yml rename to src/main/resources/totem_blocks/default.yml