diff --git a/src/main/java/net/momirealms/customfishing/ConfigReader.java b/src/main/java/net/momirealms/customfishing/ConfigReader.java index e0ba5fd4..b0d7bca2 100644 --- a/src/main/java/net/momirealms/customfishing/ConfigReader.java +++ b/src/main/java/net/momirealms/customfishing/ConfigReader.java @@ -21,6 +21,9 @@ import net.kyori.adventure.bossbar.BossBar; import net.momirealms.customfishing.competition.CompetitionConfig; import net.momirealms.customfishing.competition.Goal; import net.momirealms.customfishing.competition.bossbar.BossBarConfig; +import net.momirealms.customfishing.competition.reward.CommandImpl; +import net.momirealms.customfishing.competition.reward.MessageImpl; +import net.momirealms.customfishing.competition.reward.Reward; import net.momirealms.customfishing.titlebar.Difficulty; import net.momirealms.customfishing.titlebar.Layout; import net.momirealms.customfishing.hook.skill.Aurelium; @@ -59,7 +62,7 @@ public class ConfigReader{ public static HashMap Competitions = new HashMap<>(); public static HashMap CompetitionsCommand = new HashMap<>(); - private static YamlConfiguration getConfig(String configName) { + public static YamlConfiguration getConfig(String configName) { File file = new File(CustomFishing.instance.getDataFolder(), configName); if (!file.exists()) { CustomFishing.instance.saveResource(configName, false); @@ -366,7 +369,7 @@ public class ConfigReader{ loot.setNick(loot.getName()); } loot.setUnbreakable(config.getBoolean("items." + key + ".unbreakable",false)); - loot.setPoint((float) config.getDouble("items." + key + ".score")); + loot.setScore((float) config.getDouble("items." + key + ".score",0)); if (config.contains("items." + key + ".action.message")) loot.setMsg(config.getString("items." + key + ".action.message")); @@ -505,7 +508,7 @@ public class ConfigReader{ }else { loot.setShowInFinder(true); } - loot.setPoint((float) config.getDouble("mobs." + key + ".score")); + loot.setScore((float) config.getDouble("mobs." + key + ".score",0)); /* 设置捕获条件 */ @@ -673,6 +676,7 @@ public class ConfigReader{ case "time" -> rodInstance.setTime(config.getDouble("rods." + key + ".modifier.time")); case "difficulty" -> rodInstance.setDifficulty(config.getInt("rods." + key + ".modifier.difficulty")); case "double-loot" -> rodInstance.setDoubleLoot(config.getDouble("rods." + key + ".modifier.double-loot")); + case "score" -> rodInstance.setScoreModifier(config.getDouble("rods." + key + ".modifier.score")); } }); } @@ -750,6 +754,7 @@ public class ConfigReader{ case "time" -> baitInstance.setTime(config.getDouble("baits." + key + ".modifier.time")); case "difficulty" -> baitInstance.setDifficulty(config.getInt("baits." + key + ".modifier.difficulty")); case "double-loot" -> baitInstance.setDoubleLoot(config.getDouble("baits." + key + ".modifier.double-loot")); + case "score" -> baitInstance.setScoreModifier(config.getDouble("baits." + key + ".modifier.score")); } }); } @@ -791,10 +796,34 @@ public class ConfigReader{ if (config.contains(key + ".broadcast.end")){ competitionConfig.setEndMessage(config.getStringList(key + ".broadcast.end")); } + if (config.contains(key + ".prize")){ + HashMap> rewardsMap = new HashMap<>(); + config.getConfigurationSection(key + ".prize").getKeys(false).forEach(rank -> { + List rewards = new ArrayList<>(); + if (config.contains(key + ".prize." + rank + ".messages")){ + rewards.add(new MessageImpl(config.getStringList(key + ".prize." + rank + ".messages"))); + } + if (config.contains(key + ".prize." + rank + ".commands")){ + rewards.add(new CommandImpl(config.getStringList(key + ".prize." + rank + ".commands"))); + } + rewardsMap.put(rank, rewards); + }); + competitionConfig.setRewards(rewardsMap); + } config.getStringList(key + ".start-time").forEach(time -> { Competitions.put(time, competitionConfig); }); CompetitionsCommand.put(key, competitionConfig); }); } + + public static void tryEnableJedis(){ + YamlConfiguration configuration = ConfigReader.getConfig("redis.yml"); + if (configuration.getBoolean("redis.enable")){ + JedisUtil.initializeRedis(configuration); + JedisUtil.useRedis = true; + }else { + JedisUtil.useRedis = false; + } + } } diff --git a/src/main/java/net/momirealms/customfishing/CustomFishing.java b/src/main/java/net/momirealms/customfishing/CustomFishing.java index 58bfe512..523285d0 100644 --- a/src/main/java/net/momirealms/customfishing/CustomFishing.java +++ b/src/main/java/net/momirealms/customfishing/CustomFishing.java @@ -22,11 +22,11 @@ import net.momirealms.customfishing.command.Execute; import net.momirealms.customfishing.command.TabComplete; import net.momirealms.customfishing.competition.CompetitionSchedule; import net.momirealms.customfishing.competition.bossbar.BossBarManager; +import net.momirealms.customfishing.helper.LibraryLoader; import net.momirealms.customfishing.listener.PlayerListener; import net.momirealms.customfishing.utils.AdventureManager; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; -import org.checkerframework.checker.units.qual.C; import java.util.Objects; @@ -37,8 +37,14 @@ public final class CustomFishing extends JavaPlugin { private CompetitionSchedule competitionSchedule; @Override - public void onEnable() { + public void onLoad(){ instance = this; + LibraryLoader.load("redis.clients","jedis","4.2.3","https://repo.maven.apache.org/maven2/"); + LibraryLoader.load("org.apache.commons","commons-pool2","2.11.1","https://repo.maven.apache.org/maven2/"); + } + + @Override + public void onEnable() { adventure = BukkitAudiences.create(this); Objects.requireNonNull(Bukkit.getPluginCommand("customfishing")).setExecutor(new Execute()); Objects.requireNonNull(Bukkit.getPluginCommand("customfishing")).setTabCompleter(new TabComplete()); @@ -50,6 +56,7 @@ public final class CustomFishing extends JavaPlugin { competitionSchedule.checkTime(); Bukkit.getPluginManager().registerEvents(new BossBarManager(), this); } + ConfigReader.tryEnableJedis(); AdventureManager.consoleMessage("[CustomFishing] Plugin Enabled!"); } diff --git a/src/main/java/net/momirealms/customfishing/competition/Competition.java b/src/main/java/net/momirealms/customfishing/competition/Competition.java index fd671eaf..0500e504 100644 --- a/src/main/java/net/momirealms/customfishing/competition/Competition.java +++ b/src/main/java/net/momirealms/customfishing/competition/Competition.java @@ -21,8 +21,12 @@ import net.momirealms.customfishing.ConfigReader; import net.momirealms.customfishing.CustomFishing; import net.momirealms.customfishing.competition.bossbar.BossBarConfig; import net.momirealms.customfishing.competition.bossbar.BossBarManager; -import net.momirealms.customfishing.item.Loot; +import net.momirealms.customfishing.competition.ranking.Ranking; +import net.momirealms.customfishing.competition.ranking.RankingImpl; +import net.momirealms.customfishing.competition.ranking.RedisRankingImpl; +import net.momirealms.customfishing.competition.reward.Reward; import net.momirealms.customfishing.utils.AdventureManager; +import net.momirealms.customfishing.utils.JedisUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -43,6 +47,7 @@ public class Competition { private final BossBarConfig bossBarConfig; private final List startMessage; private final List endMessage; + private final HashMap> rewardsMap; public static long remainingTime; public static float progress; @@ -55,21 +60,24 @@ public class Competition { this.bossBarConfig = competitionConfig.getBossBarConfig(); this.startMessage = competitionConfig.getStartMessage(); this.endMessage = competitionConfig.getEndMessage(); + this.rewardsMap = competitionConfig.getRewards(); } public void begin(boolean forceStart) { - if (goal == Goal.RANDOM) { goal = getRandomGoal(); } - remainingTime = this.duration; this.startTime = Instant.now().getEpochSecond(); Collection playerCollections = Bukkit.getOnlinePlayers(); if (playerCollections.size() >= minPlayers || forceStart) { status = true; - ranking = new Ranking(); + if (JedisUtil.useRedis){ + ranking = new RedisRankingImpl(); + }else { + ranking = new RankingImpl(); + } startTimer(); if (startMessage != null){ playerCollections.forEach(player -> { @@ -118,16 +126,18 @@ public class Competition { BossBarManager.stopAllTimer(); this.timerTask.cancel(); status = false; + givePrize(); if (endMessage != null){ List newMessage = new ArrayList<>(); endMessage.forEach(message -> { - float first = ranking.getScoreAt(1); - float second = ranking.getScoreAt(2); - float third = ranking.getScoreAt(3); + CompetitionPlayer[] competitionPlayers = ranking.getTop3Player(); + float first = Optional.ofNullable(competitionPlayers[0]).orElse(CompetitionPlayer.emptyPlayer).getScore(); + float second = Optional.ofNullable(competitionPlayers[1]).orElse(CompetitionPlayer.emptyPlayer).getScore(); + float third = Optional.ofNullable(competitionPlayers[2]).orElse(CompetitionPlayer.emptyPlayer).getScore(); newMessage.add(message - .replace("{1st}", Optional.ofNullable(ranking.getPlayerAt(1)).orElse(ConfigReader.Message.noPlayer)) - .replace("{2nd}", Optional.ofNullable(ranking.getPlayerAt(2)).orElse(ConfigReader.Message.noPlayer)) - .replace("{3rd}", Optional.ofNullable(ranking.getPlayerAt(3)).orElse(ConfigReader.Message.noPlayer)) + .replace("{1st}", Optional.ofNullable(Optional.ofNullable(competitionPlayers[0]).orElse(CompetitionPlayer.emptyPlayer).getPlayer()).orElse(ConfigReader.Message.noPlayer)) + .replace("{2nd}", Optional.ofNullable(Optional.ofNullable(competitionPlayers[1]).orElse(CompetitionPlayer.emptyPlayer).getPlayer()).orElse(ConfigReader.Message.noPlayer)) + .replace("{3rd}", Optional.ofNullable(Optional.ofNullable(competitionPlayers[2]).orElse(CompetitionPlayer.emptyPlayer).getPlayer()).orElse(ConfigReader.Message.noPlayer)) .replace("{1st_points}", first < 0 ? ConfigReader.Message.noScore : String.format("%.1f",(first))) .replace("{2nd_points}", second < 0 ? ConfigReader.Message.noScore : String.format("%.1f",(second))) .replace("{3rd_points}", third < 0 ? ConfigReader.Message.noScore : String.format("%.1f",(third)))); @@ -138,7 +148,44 @@ public class Competition { }); }); } - ranking.clear(); + Bukkit.getScheduler().runTaskLaterAsynchronously(CustomFishing.instance, ()-> { + ranking.clear(); + }, 300); + } + + public void givePrize(){ + if (ranking.getSize() != 0 && rewardsMap != null) { + Iterator iterator = ranking.getIterator(); + int i = 1; + while (iterator.hasNext()) { + if (i < rewardsMap.size()) { + String playerName = iterator.next(); + Player player = Bukkit.getPlayer(playerName); + if (player != null){ + for (Reward reward : rewardsMap.get(String.valueOf(i))) { + reward.giveReward(player); + } + } + i++; + } + else { + List rewards = rewardsMap.get("participation"); + if (rewards != null) { + iterator.forEachRemaining(playerName -> { + Player player = Bukkit.getPlayer(playerName); + if (player != null){ + for (Reward reward : rewards) { + reward.giveReward(player); + } + } + }); + } + else { + break; + } + } + } + } } public void cancel() { @@ -148,18 +195,10 @@ public class Competition { status = false; } - public void refreshRanking(String player, Loot loot) { - CompetitionPlayer competitionPlayer = ranking.getCompetitionPlayer(player); - float score; - if (this.goal == Goal.TOTAL_POINTS) score = loot.getPoint(); - else score = 1.0f; - if (competitionPlayer != null) { - ranking.removePlayer(competitionPlayer); - competitionPlayer.addScore(score); - ranking.addPlayer(competitionPlayer); - } else { - ranking.addPlayer(player, score); - } + public void refreshRanking(String player, float score) { + if (this.goal != Goal.TOTAL_SCORE) score = 1.0f; + if (score == 0) return; + ranking.refreshData(player, score); } private Goal getRandomGoal() { diff --git a/src/main/java/net/momirealms/customfishing/competition/CompetitionConfig.java b/src/main/java/net/momirealms/customfishing/competition/CompetitionConfig.java index a7d424da..d2f73df4 100644 --- a/src/main/java/net/momirealms/customfishing/competition/CompetitionConfig.java +++ b/src/main/java/net/momirealms/customfishing/competition/CompetitionConfig.java @@ -18,7 +18,9 @@ package net.momirealms.customfishing.competition; import net.momirealms.customfishing.competition.bossbar.BossBarConfig; +import net.momirealms.customfishing.competition.reward.Reward; +import java.util.HashMap; import java.util.List; public class CompetitionConfig { @@ -30,6 +32,7 @@ public class CompetitionConfig { private Goal goal; private BossBarConfig bossBarConfig; private final boolean enableBossBar; + private HashMap> rewards; public CompetitionConfig(boolean enableBossBar){this.enableBossBar = enableBossBar;} @@ -38,6 +41,7 @@ public class CompetitionConfig { public void setGoal(Goal goal) {this.goal = goal;} public void setEndMessage(List endMessage) {this.endMessage = endMessage;} public void setStartMessage(List startMessage) {this.startMessage = startMessage;} + public HashMap> getRewards() {return rewards;} public Goal getGoal() {return goal;} public int getMinPlayers() {return minPlayers;} @@ -46,4 +50,5 @@ public class CompetitionConfig { public boolean isEnableBossBar() {return enableBossBar;} public List getEndMessage() {return endMessage;} public List getStartMessage() {return startMessage;} + public void setRewards(HashMap> rewards) {this.rewards = rewards;} } diff --git a/src/main/java/net/momirealms/customfishing/competition/CompetitionPlayer.java b/src/main/java/net/momirealms/customfishing/competition/CompetitionPlayer.java index ee611f5b..70984167 100644 --- a/src/main/java/net/momirealms/customfishing/competition/CompetitionPlayer.java +++ b/src/main/java/net/momirealms/customfishing/competition/CompetitionPlayer.java @@ -25,6 +25,8 @@ public class CompetitionPlayer implements Comparable{ private final String player; private float score; + public static CompetitionPlayer emptyPlayer = new CompetitionPlayer(null, 0); + public CompetitionPlayer(String player, float score) { this.player = player; this.score = score; diff --git a/src/main/java/net/momirealms/customfishing/competition/CompetitionSchedule.java b/src/main/java/net/momirealms/customfishing/competition/CompetitionSchedule.java index 557341bb..58ab73d4 100644 --- a/src/main/java/net/momirealms/customfishing/competition/CompetitionSchedule.java +++ b/src/main/java/net/momirealms/customfishing/competition/CompetitionSchedule.java @@ -39,7 +39,7 @@ public class CompetitionSchedule { public static boolean startCompetition(String competitionName){ CompetitionConfig competitionConfig = ConfigReader.CompetitionsCommand.get(competitionName); if (competitionConfig == null) return false; - if (competition != null){ + if (competition != null && competition.isGoingOn()){ competition.end(); } competition = new Competition(competitionConfig); @@ -61,7 +61,7 @@ public class CompetitionSchedule { } public void startCompetition(CompetitionConfig competitionConfig){ - if (competition != null){ + if (competition != null && competition.isGoingOn()){ competition.end(); } competition = new Competition(competitionConfig); diff --git a/src/main/java/net/momirealms/customfishing/competition/Goal.java b/src/main/java/net/momirealms/customfishing/competition/Goal.java index ae52de4f..76a0f66e 100644 --- a/src/main/java/net/momirealms/customfishing/competition/Goal.java +++ b/src/main/java/net/momirealms/customfishing/competition/Goal.java @@ -19,7 +19,7 @@ package net.momirealms.customfishing.competition; public enum Goal { - TOTAL_POINTS, + TOTAL_SCORE, CATCH_AMOUNT, RANDOM diff --git a/src/main/java/net/momirealms/customfishing/competition/bossbar/BossBarManager.java b/src/main/java/net/momirealms/customfishing/competition/bossbar/BossBarManager.java index 645aa9ef..666f5176 100644 --- a/src/main/java/net/momirealms/customfishing/competition/bossbar/BossBarManager.java +++ b/src/main/java/net/momirealms/customfishing/competition/bossbar/BossBarManager.java @@ -63,7 +63,7 @@ public class BossBarManager implements Listener { } public static void joinCompetition(Player player){ - if (cache.get(player) == null){ + if (cache.get(player) == null) { BossBarTimer timerTask = new BossBarTimer(player, CompetitionSchedule.competition.getBossBarConfig()); cache.put(player, timerTask); } diff --git a/src/main/java/net/momirealms/customfishing/competition/ranking/Ranking.java b/src/main/java/net/momirealms/customfishing/competition/ranking/Ranking.java new file mode 100644 index 00000000..1bc36989 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/competition/ranking/Ranking.java @@ -0,0 +1,15 @@ +package net.momirealms.customfishing.competition.ranking; + +import net.momirealms.customfishing.competition.CompetitionPlayer; + +import java.util.Iterator; + +public interface Ranking { + void clear(); + CompetitionPlayer getCompetitionPlayer(String player); + Iterator getIterator(); + int getSize(); + String getPlayerRank(String player); + CompetitionPlayer[] getTop3Player(); + void refreshData(String player, float score); +} diff --git a/src/main/java/net/momirealms/customfishing/competition/ranking/RankingImpl.java b/src/main/java/net/momirealms/customfishing/competition/ranking/RankingImpl.java new file mode 100644 index 00000000..dc76c2fc --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/competition/ranking/RankingImpl.java @@ -0,0 +1,134 @@ +/* + * 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.competition.ranking; + +import net.momirealms.customfishing.competition.CompetitionPlayer; + +import java.util.*; + +public class RankingImpl implements Ranking{ + + private final Set competitionPlayers = Collections.synchronizedSet(new TreeSet<>()); + + public void addPlayer(CompetitionPlayer competitionPlayer) { + competitionPlayers.add(competitionPlayer); + } + + public void removePlayer(CompetitionPlayer competitionPlayer) { + competitionPlayers.removeIf(e -> e == competitionPlayer); + } + + @Override + public void clear() { + competitionPlayers.clear(); + } + + @Override + public CompetitionPlayer getCompetitionPlayer(String player) { + for (CompetitionPlayer competitionPlayer : competitionPlayers) { + if (competitionPlayer.getPlayer().equals(player)) { + return competitionPlayer; + } + } + return null; + } + + @Override + public Iterator getIterator() { + List players = new ArrayList<>(); + for (CompetitionPlayer competitionPlayer: competitionPlayers){ + players.add(competitionPlayer.getPlayer()); + } + return players.iterator(); + } + + @Override + public int getSize() { + return competitionPlayers.size(); + } + + @Override + public String getPlayerRank(String player) { + int index = 1; + for (CompetitionPlayer competitionPlayer : competitionPlayers) { + if (competitionPlayer.getPlayer().equals(player)) { + return String.valueOf(index); + }else { + index++; + } + } + return null; + } + + @Override + public CompetitionPlayer[] getTop3Player() { + CompetitionPlayer[] competitionPlayers = new CompetitionPlayer[3]; + int index = 1; + for (CompetitionPlayer competitionPlayer : this.competitionPlayers) { + if (index == 1) { + competitionPlayers[0] = competitionPlayer; + } + if (index == 2) { + competitionPlayers[1] = competitionPlayer; + } + if (index == 3) { + competitionPlayers[2] = competitionPlayer; + return competitionPlayers; + } + index++; + } + return competitionPlayers; + } + + + public String getPlayerAt(int i) { + int index = 1; + for (CompetitionPlayer competitionPlayer : competitionPlayers) { + if (index == i) { + return competitionPlayer.getPlayer(); + } + index++; + } + return null; + } + + + public float getScoreAt(int i) { + int index = 1; + for (CompetitionPlayer competitionPlayer : competitionPlayers) { + if (index == i) { + return competitionPlayer.getScore(); + } + index++; + } + return -1.0f; + } + + @Override + public void refreshData(String player, float score) { + CompetitionPlayer competitionPlayer = getCompetitionPlayer(player); + if (competitionPlayer != null) { + removePlayer(competitionPlayer); + competitionPlayer.addScore(score); + addPlayer(competitionPlayer); + } else { + competitionPlayer = new CompetitionPlayer(player, score); + addPlayer(competitionPlayer); + } + } +} diff --git a/src/main/java/net/momirealms/customfishing/competition/ranking/RedisRankingImpl.java b/src/main/java/net/momirealms/customfishing/competition/ranking/RedisRankingImpl.java new file mode 100644 index 00000000..ed4bca62 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/competition/ranking/RedisRankingImpl.java @@ -0,0 +1,97 @@ +package net.momirealms.customfishing.competition.ranking; + +import net.momirealms.customfishing.competition.CompetitionPlayer; +import net.momirealms.customfishing.utils.JedisUtil; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.resps.Tuple; + +import java.util.Iterator; +import java.util.List; + +public class RedisRankingImpl implements Ranking{ + + public void addPlayer(CompetitionPlayer competitionPlayer) { + Jedis jedis = JedisUtil.getJedis(); + jedis.zadd("cf_competition", competitionPlayer.getScore(), competitionPlayer.getPlayer()); + jedis.close(); + } + + public void removePlayer(CompetitionPlayer competitionPlayer) { + Jedis jedis = JedisUtil.getJedis(); + jedis.zrem("cf_competition", competitionPlayer.getPlayer()); + jedis.close(); + } + + @Override + public void clear() { + Jedis jedis = JedisUtil.getJedis(); + jedis.zremrangeByRank("cf_competition",0,-1); + jedis.close(); + } + + @Override + public CompetitionPlayer getCompetitionPlayer(String player) { + Jedis jedis = JedisUtil.getJedis(); + Double score = jedis.zscore("cf_competition", player); + jedis.close(); + if (score == 0) return null; + return new CompetitionPlayer(player, Float.parseFloat(score.toString())); + } + + @Override + public Iterator getIterator() { + Jedis jedis = JedisUtil.getJedis(); + List players = jedis.zrevrange("cf_competition", 0, -1); + jedis.close(); + return players.iterator(); + } + + @Override + public int getSize() { + Jedis jedis = JedisUtil.getJedis(); + long size = jedis.zcard("cf_competition"); + jedis.close(); + return (int) size; + } + + @Override + public String getPlayerRank(String player) { + Jedis jedis = JedisUtil.getJedis(); + Long rank = jedis.zrevrank("cf_competition", player); + jedis.close(); + if(rank == null){ + return null; + } + return String.valueOf(rank + 1); + } + + @Override + public CompetitionPlayer[] getTop3Player() { + CompetitionPlayer[] competitionPlayers = new CompetitionPlayer[3]; + Jedis jedis = JedisUtil.getJedis(); + List players = jedis.zrevrangeWithScores("cf_competition", 0, -1); + jedis.close(); + int index = 1; + for (Tuple tuple : players){ + if (index == 1){ + competitionPlayers[0] = new CompetitionPlayer(tuple.getElement(), (float) tuple.getScore()); + } + if (index == 2){ + competitionPlayers[1] = new CompetitionPlayer(tuple.getElement(), (float) tuple.getScore()); + } + if (index == 3){ + competitionPlayers[2] = new CompetitionPlayer(tuple.getElement(), (float) tuple.getScore()); + return competitionPlayers; + } + index++; + } + return competitionPlayers; + } + + @Override + public void refreshData(String player, float score) { + Jedis jedis = JedisUtil.getJedis(); + jedis.zincrby("cf_competition", score, player); + jedis.close(); + } +} diff --git a/src/main/java/net/momirealms/customfishing/competition/reward/CommandImpl.java b/src/main/java/net/momirealms/customfishing/competition/reward/CommandImpl.java new file mode 100644 index 00000000..186fd596 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/competition/reward/CommandImpl.java @@ -0,0 +1,39 @@ +/* + * 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.competition.reward; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.List; + +public class CommandImpl implements Reward{ + + private final List commands; + + public CommandImpl(List commands){ + this.commands = commands; + } + + @Override + public void giveReward(Player player) { + commands.forEach(command -> { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command.replace("{player}", player.getName())); + }); + } +} diff --git a/src/main/java/net/momirealms/customfishing/competition/reward/MessageImpl.java b/src/main/java/net/momirealms/customfishing/competition/reward/MessageImpl.java new file mode 100644 index 00000000..2f250cc3 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/competition/reward/MessageImpl.java @@ -0,0 +1,40 @@ +/* + * 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.competition.reward; + +import net.momirealms.customfishing.utils.AdventureManager; +import org.bukkit.entity.Player; + +import java.util.List; + +public class MessageImpl implements Reward{ + + private final List messages; + + public MessageImpl(List messages){ + this.messages = messages; + } + + @Override + public void giveReward(Player player) { + if (!player.isOnline()) return; + messages.forEach(message -> { + AdventureManager.playerMessage(player, message); + }); + } +} diff --git a/src/main/java/net/momirealms/customfishing/item/Bait.java b/src/main/java/net/momirealms/customfishing/item/Bait.java index cb639fab..b90b399f 100644 --- a/src/main/java/net/momirealms/customfishing/item/Bait.java +++ b/src/main/java/net/momirealms/customfishing/item/Bait.java @@ -31,6 +31,7 @@ public class Bait implements Item{ private HashMap weightMQ; private HashMap weightPM; private double time; + private double scoreModifier; private double doubleLoot; private int difficulty; private final String material; @@ -43,7 +44,6 @@ public class Bait implements Item{ this.material = material; } - public void setName(String name) {this.name = name;} public void setItemFlags(List itemFlags) {this.itemFlags = itemFlags;} public void setDifficulty(int difficulty) {this.difficulty = difficulty;} @@ -56,12 +56,14 @@ public class Bait implements Item{ public void setEnchantment(List enchantment) {this.enchantment = enchantment;} public void setCustommodeldata(int custommodeldata){this.custommodeldata = custommodeldata;} public void setUnbreakable(boolean unbreakable){this.unbreakable = unbreakable;} + public void setScoreModifier(double scoreModifier) {this.scoreModifier = scoreModifier;} public double getDoubleLoot() {return this.doubleLoot;} public int getDifficulty() {return difficulty;} public double getTime() {return time;} public HashMap getWeightMQ() {return weightMQ;} public HashMap getWeightPM() {return weightPM;} + public double getScoreModifier() {return scoreModifier;} @Override public boolean isUnbreakable() {return this.unbreakable;} diff --git a/src/main/java/net/momirealms/customfishing/item/Loot.java b/src/main/java/net/momirealms/customfishing/item/Loot.java index a9c20e4d..181cdacb 100644 --- a/src/main/java/net/momirealms/customfishing/item/Loot.java +++ b/src/main/java/net/momirealms/customfishing/item/Loot.java @@ -50,7 +50,7 @@ public class Loot implements Item { private int custommodeldata; private boolean unbreakable; private double skillXP; - private float point; + private float score; public Loot(String key, Difficulty difficulty, int weight, int time){ this.key = key; @@ -75,7 +75,7 @@ public class Loot implements Item { public String getGroup() {return group;} public int getExp() {return exp;} public double getSkillXP() {return skillXP;} - public float getPoint() {return point;} + public float getScore() {return score;} @Override public List getLore(){return this.lore;} @@ -114,5 +114,5 @@ public class Loot implements Item { public void setCustommodeldata(int custommodeldata){this.custommodeldata = custommodeldata;} public void setUnbreakable(boolean unbreakable){this.unbreakable = unbreakable;} public void setSkillXP(double skillXP) {this.skillXP = skillXP;} - public void setPoint(float point) {this.point = point;} + public void setScore(float score) {this.score = score;} } diff --git a/src/main/java/net/momirealms/customfishing/item/Rod.java b/src/main/java/net/momirealms/customfishing/item/Rod.java index a47c293e..f34cdbeb 100644 --- a/src/main/java/net/momirealms/customfishing/item/Rod.java +++ b/src/main/java/net/momirealms/customfishing/item/Rod.java @@ -32,6 +32,7 @@ public class Rod implements Item{ private HashMap weightMQ; private HashMap weightPM; private double time; + private double scoreModifier; private int difficulty; private double doubleLoot; private List enchantment; @@ -51,12 +52,14 @@ public class Rod implements Item{ public void setCustommodeldata(int custommodeldata){this.custommodeldata = custommodeldata;} public void setUnbreakable(boolean unbreakable){this.unbreakable = unbreakable;} public void setName(String name) {this.name = name;} + public void setScoreModifier(double scoreModifier) {this.scoreModifier = scoreModifier;} public double getTime() {return time;} public HashMap getWeightMQ() {return weightMQ;} public HashMap getWeightPM() {return weightPM;} public int getDifficulty() {return difficulty;} public double getDoubleLoot() {return this.doubleLoot;} + public double getScoreModifier() {return scoreModifier;} @Override public boolean isUnbreakable() {return this.unbreakable;} diff --git a/src/main/java/net/momirealms/customfishing/listener/PlayerListener.java b/src/main/java/net/momirealms/customfishing/listener/PlayerListener.java index 189ebf5c..d19cceaa 100644 --- a/src/main/java/net/momirealms/customfishing/listener/PlayerListener.java +++ b/src/main/java/net/momirealms/customfishing/listener/PlayerListener.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.listener; import de.tr7zw.changeme.nbtapi.NBTCompound; import de.tr7zw.changeme.nbtapi.NBTItem; -import net.momirealms.customfishing.competition.Competition; import net.momirealms.customfishing.competition.CompetitionSchedule; import net.momirealms.customfishing.competition.bossbar.BossBarManager; import net.momirealms.customfishing.hook.MythicMobsUtils; @@ -35,6 +34,7 @@ import net.momirealms.customfishing.item.Rod; import net.momirealms.customfishing.requirements.FishingCondition; import net.momirealms.customfishing.requirements.Requirement; import net.momirealms.customfishing.titlebar.Timer; +import net.momirealms.customfishing.utils.Modifier; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -61,8 +61,7 @@ public class PlayerListener implements Listener { private final HashMap coolDown = new HashMap<>(); private final HashMap nextLoot = new HashMap<>(); - private final HashMap modifier = new HashMap<>(); - private final HashSet willDouble = new HashSet<>(); + private final HashMap modifiers = new HashMap<>(); public static ConcurrentHashMap fishingPlayers = new ConcurrentHashMap<>(); @EventHandler @@ -88,6 +87,7 @@ public class PlayerListener implements Listener { boolean noRod = true; double timeModifier = 1; double doubleLoot = 0; + double scoreModifier = 1; int difficultyModifier = 0; HashMap pm1 = new HashMap<>(); @@ -107,6 +107,7 @@ public class PlayerListener implements Listener { if (rod.getTime() != 0) timeModifier *= rod.getTime(); if (rod.getDoubleLoot() != 0) doubleLoot += rod.getDoubleLoot(); if (rod.getDifficulty() != 0) difficultyModifier += rod.getDifficulty(); + if (rod.getScoreModifier() != 0) scoreModifier *= rod.getScoreModifier(); noRod = false; } } @@ -119,6 +120,7 @@ public class PlayerListener implements Listener { if (bait.getTime() != 0) timeModifier *= bait.getTime(); if (bait.getDoubleLoot() != 0) doubleLoot += bait.getDoubleLoot(); if (bait.getDifficulty() != 0) difficultyModifier += bait.getDifficulty(); + if (bait.getScoreModifier() != 0) scoreModifier *= bait.getScoreModifier(); mainHandItem.setAmount(mainHandItem.getAmount() - 1); } } @@ -142,6 +144,7 @@ public class PlayerListener implements Listener { if (bait.getTime() != 0) timeModifier *= bait.getTime(); if (bait.getDoubleLoot() != 0) doubleLoot += bait.getDoubleLoot(); if (bait.getDifficulty() != 0) difficultyModifier += bait.getDifficulty(); + if (bait.getScoreModifier() != 0) scoreModifier *= bait.getScoreModifier(); offHandItem.setAmount(offHandItem.getAmount() - 1); } }else if (noRod && offHandCompound.getString("type").equals("rod")){ @@ -153,6 +156,7 @@ public class PlayerListener implements Listener { if (rod.getTime() != 0) timeModifier *= rod.getTime(); if (rod.getDoubleLoot() != 0) doubleLoot += rod.getDoubleLoot(); if (rod.getDifficulty() != 0) difficultyModifier += rod.getDifficulty(); + if (rod.getScoreModifier() != 0) scoreModifier *= rod.getScoreModifier(); noRod = false; } } @@ -179,15 +183,12 @@ public class PlayerListener implements Listener { return; } - //双倍掉落 - if (doubleLoot > Math.random()) { - willDouble.add(player); - }else { - willDouble.remove(player); - } - - //难度修改 - modifier.put(player, difficultyModifier); + Modifier modifier = new Modifier(); + modifier.setDifficultyModifier(difficultyModifier); + modifier.setScoreModifier(scoreModifier); + modifier.setWillDouble(doubleLoot > Math.random()); + //修改 + modifiers.put(player, modifier); double[] weights = new double[possibleLoots.size()]; int index = 0; @@ -262,7 +263,7 @@ public class PlayerListener implements Listener { }); int difficulty = lootInstance.getDifficulty().getSpeed(); - difficulty += modifier.get(player); + difficulty += Objects.requireNonNullElse(modifiers.get(player).getDifficultyModifier(), 0);; if (difficulty < 1){ difficulty = 1; } @@ -311,7 +312,7 @@ public class PlayerListener implements Listener { Vector vector = player.getLocation().subtract(location).toVector().multiply(0.1); vector = vector.setY((vector.getY()+0.2)*1.2); item.setVelocity(vector); - if (willDouble.contains(player)){ + if (modifiers.get(player).willDouble()){ Entity item2 = location.getWorld().dropItem(location, itemStack); item2.setVelocity(vector); } @@ -342,7 +343,8 @@ public class PlayerListener implements Listener { ConfigReader.Config.skillXP.addXp(player, lootInstance.getSkillXP()); } if (CompetitionSchedule.competition != null && CompetitionSchedule.competition.isGoingOn()){ - CompetitionSchedule.competition.refreshRanking(player.getName(), lootInstance); + float score = (float) (lootInstance.getScore() * modifiers.get(player).getScoreModifier()); + CompetitionSchedule.competition.refreshRanking(player.getName(), score); BossBarManager.joinCompetition(player); } //发送Title @@ -373,8 +375,7 @@ public class PlayerListener implements Listener { player.removePotionEffect(PotionEffectType.SLOW); coolDown.remove(player); nextLoot.remove(player); - modifier.remove(player); - willDouble.remove(player); + modifiers.remove(player); fishingPlayers.remove(player); } diff --git a/src/main/java/net/momirealms/customfishing/utils/JedisUtil.java b/src/main/java/net/momirealms/customfishing/utils/JedisUtil.java new file mode 100644 index 00000000..776ff47b --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/utils/JedisUtil.java @@ -0,0 +1,59 @@ +package net.momirealms.customfishing.utils; + +import net.momirealms.customfishing.helper.Log; +import org.bukkit.configuration.file.YamlConfiguration; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +import java.util.ArrayList; +import java.util.List; + +public class JedisUtil { + + private static JedisPool jedisPool; + public static boolean useRedis; + + public static Jedis getJedis(){ + return jedisPool.getResource(); + } + + public static void initializeRedis(YamlConfiguration configuration){ + + JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); + jedisPoolConfig.setTestWhileIdle(true); + jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000); + jedisPoolConfig.setNumTestsPerEvictionRun(-1); + jedisPoolConfig.setMinEvictableIdleTimeMillis(configuration.getInt("redis.MinEvictableIdleTimeMillis",1800000)); + jedisPoolConfig.setMaxTotal(configuration.getInt("redis.MaxTotal",8)); + jedisPoolConfig.setMaxIdle(configuration.getInt("redis.MaxIdle",8)); + jedisPoolConfig.setMinIdle(configuration.getInt("redis.MinIdle",1)); + jedisPoolConfig.setMaxWaitMillis(configuration.getInt("redis.MaxWaitMillis",30000)); + + jedisPool = new JedisPool(jedisPoolConfig, configuration.getString("redis.host","localhost"), configuration.getInt("redis.port",6379)); + + AdventureManager.consoleMessage("[CustomFishing] Redis Enabled!"); + + List minIdleJedisList = new ArrayList<>(jedisPoolConfig.getMinIdle()); + for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) { + Jedis jedis; + try { + jedis = jedisPool.getResource(); + minIdleJedisList.add(jedis); + jedis.ping(); + } catch (Exception e) { + Log.warn(e.getMessage()); + } + } + + for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) { + Jedis jedis; + try { + jedis = minIdleJedisList.get(i); + jedis.close(); + } catch (Exception e) { + Log.warn(e.getMessage()); + } + } + } +} diff --git a/src/main/java/net/momirealms/customfishing/utils/Modifier.java b/src/main/java/net/momirealms/customfishing/utils/Modifier.java new file mode 100644 index 00000000..8313735b --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/utils/Modifier.java @@ -0,0 +1,32 @@ +package net.momirealms.customfishing.utils; + +public class Modifier { + + private int difficulty; + private double score; + private boolean willDouble; + + public int getDifficultyModifier() { + return difficulty; + } + + public void setDifficultyModifier(int difficulty) { + this.difficulty = difficulty; + } + + public double getScoreModifier() { + return score; + } + + public void setScoreModifier(double score) { + this.score = score; + } + + public boolean willDouble() { + return willDouble; + } + + public void setWillDouble(boolean willDouble) { + this.willDouble = willDouble; + } +} diff --git a/src/main/resources/baits.yml b/src/main/resources/baits.yml index 01c9e92a..aa76130c 100644 --- a/src/main/resources/baits.yml +++ b/src/main/resources/baits.yml @@ -23,4 +23,6 @@ baits: #更改难度,例如原来难度为(1-6),现在变成(1-5) difficulty: 3 #双倍掉落概率 - double-loot: 0.05 \ No newline at end of file + double-loot: 0.05 + #比赛分数加成 + score: 1.2 \ No newline at end of file diff --git a/src/main/resources/competition.yml b/src/main/resources/competition.yml index a56eb847..2e15e1cd 100644 --- a/src/main/resources/competition.yml +++ b/src/main/resources/competition.yml @@ -1,8 +1,8 @@ example: - #TOTAL_POINTS + #TOTAL_SCORE #CATCH_AMOUNT - goal: TOTAL_POINTS + goal: TOTAL_SCORE start-time: - '5:30' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 96e7b60a..4a8f3fa4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -14,4 +14,6 @@ commands: customfishing: usage: /customfishing description: main command - permission: customfishing.admin \ No newline at end of file + permission: customfishing.admin + aliases: + - cfishing \ No newline at end of file diff --git a/src/main/resources/redis.yml b/src/main/resources/redis.yml new file mode 100644 index 00000000..619483e2 --- /dev/null +++ b/src/main/resources/redis.yml @@ -0,0 +1,9 @@ +redis: + enable: false + host: localhost + port: 6379 + MaxTotal: 10 + MaxIdle: 10 + MinIdle: 1 + MaxWaitMillis: 30000 + MinEvictableIdleTimeMillis: 1800000 \ No newline at end of file diff --git a/src/main/resources/rods.yml b/src/main/resources/rods.yml index 6ab8d751..a5f82c6a 100644 --- a/src/main/resources/rods.yml +++ b/src/main/resources/rods.yml @@ -21,4 +21,6 @@ rods: #更改难度,例如原来难度为(1-6),现在变成(1-5) difficulty: -1 #双倍掉落概率 - double-loot: 0.05 \ No newline at end of file + double-loot: 0.05 + #比赛分数加成 + score: 1.2 \ No newline at end of file