diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/Fountain.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/Fountain.java index cf45e66e7..564034ec3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/Fountain.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/Fountain.java @@ -1,52 +1,62 @@ package mineplex.core.brawl.fountain; -import java.util.concurrent.atomic.AtomicLong; +import mineplex.core.common.util.UtilText; +import mineplex.core.hologram.Hologram; +import mineplex.core.hologram.HologramManager; +import mineplex.core.stats.StatsManager; +import mineplex.serverdata.redis.counter.Counter; +import org.bukkit.Location; +import org.bukkit.entity.Player; /** - * A fountain represents an atomic counter that is trying to hit a goal. Once the fountain - * reaches it's goal you can either reset it or let it stay completed for an indefinite time. - * * @author Shaun Bennett */ public class Fountain { - // Cached count for the fountain - private AtomicLong _count = new AtomicLong(0); - // The System.currentTimeMillis() when cached count was last updated - private long _cacheLastUpdated; - // The goal that this fountain is trying to reach - private long _goal; + // Manager Injections + private final HologramManager _hologramManager; + private final StatsManager _statsManager; - // Redis repository to store the count - private FountainRedisRepository _redisRepository; + private final String _name; + private final String _dataKey; + private final Location _location; + private final Hologram _hologram; + private final Counter _counter; - public Fountain(String dataKey, long goal) + public Fountain(Location location, String name, String dataKey, long goal, HologramManager hologramManager, StatsManager statsManager) { - _goal = goal; - _redisRepository = new FountainRedisRepository(dataKey); + _hologramManager = hologramManager; + _statsManager = statsManager; - updateCount(); + _name = name; + _dataKey = dataKey; + _location = location; + _hologram = new Hologram(hologramManager, location.clone().add(0, 2, 0), name); + _counter = new Counter(dataKey, goal); + + updateHologram(); } - public void updateCount() + protected void updateHologram() { - _count.set(_redisRepository.getCount()); - _cacheLastUpdated = System.currentTimeMillis(); + String progressBar = UtilText.getProgress(null, _counter.getFillPercent(), null, false); + _hologram.setText(_name, progressBar); } - public long getCount() + public void increment(Player player, long amount) { - return _count.get(); + _statsManager.incrementStat(player, "Global.Fountain." + getDataKey(), amount); + _counter.increment(amount); + updateHologram(); } - public long getGoal() + public String getName() { - return _goal; + return _name; } - public double getFillPercent() + public String getDataKey() { - return Math.min(100, (((double) getCount()) / _goal)); + return _dataKey; } - -} \ No newline at end of file +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainManager.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainManager.java index 3fd49f97e..c0c35e2e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainManager.java @@ -1,9 +1,17 @@ package mineplex.core.brawl.fountain; import mineplex.core.MiniPlugin; +import mineplex.core.brawl.fountain.command.FountainCommand; +import mineplex.core.common.util.C; +import mineplex.core.hologram.HologramManager; +import mineplex.core.stats.StatsManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.serverdata.redis.counter.Counter; +import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.plugin.java.JavaPlugin; /** @@ -11,13 +19,26 @@ import org.bukkit.plugin.java.JavaPlugin; */ public class FountainManager extends MiniPlugin { + private HologramManager _hologramManager; + private StatsManager _statsManager; + private Fountain _gemFountain; - public FountainManager(JavaPlugin plugin) + public FountainManager(JavaPlugin plugin, HologramManager hologramManager, StatsManager statsManager) { - super("Fountain", plugin); + super("Counter", plugin); - _gemFountain = new Fountain("GemFountain", 1000000); + _hologramManager = hologramManager; + _statsManager = statsManager; + + _gemFountain = new Fountain(new Location(Bukkit.getWorld("world"), -32.5, 72, -23.5), + C.cGreen + "Gem Fountain", "GemFountain", 1000000, _hologramManager, _statsManager); + } + + @Override + public void addCommands() + { + addCommand(new FountainCommand(this)); } @EventHandler @@ -26,6 +47,11 @@ public class FountainManager extends MiniPlugin if (event.getType() != UpdateType.SLOW) return; - _gemFountain.updateCount(); + _gemFountain.updateHologram(); } -} + + public Fountain getGemFountain() + { + return _gemFountain; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/AddCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/AddCommand.java new file mode 100644 index 000000000..f296c735d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/AddCommand.java @@ -0,0 +1,44 @@ +package mineplex.core.brawl.fountain.command; + +import mineplex.core.brawl.fountain.FountainManager; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; +import org.bukkit.entity.Player; + +/** + * @author Shaun Bennett + */ +public class AddCommand extends CommandBase +{ + public AddCommand(FountainManager plugin) + { + super(plugin, Rank.ADMIN, "add"); + } + + @Override + public void Execute(Player caller, String[] args) + { + if (args == null || args.length != 1) + { + help(caller); + return; + } + + try + { + long amount = Long.parseLong(args[0]); + Plugin.getGemFountain().increment(caller, amount); + } + catch (NumberFormatException ex) + { + help(caller); + } + } + + private void help(Player player) + { + UtilPlayer.message(player, F.help("/fountain add", "", Rank.ADMIN)); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/FountainCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/FountainCommand.java new file mode 100644 index 000000000..9268549ae --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/command/FountainCommand.java @@ -0,0 +1,25 @@ +package mineplex.core.brawl.fountain.command; + +import mineplex.core.brawl.fountain.FountainManager; +import mineplex.core.command.MultiCommandBase; +import mineplex.core.common.Rank; +import org.bukkit.entity.Player; + +/** + * @author Shaun Bennett + */ +public class FountainCommand extends MultiCommandBase +{ + public FountainCommand(FountainManager plugin) + { + super(plugin, Rank.ADMIN, "fountain"); + + AddCommand(new AddCommand(plugin)); + } + + @Override + protected void Help(Player caller, String[] args) + { + + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainPage.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainPage.java new file mode 100644 index 000000000..e82d1ef56 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainPage.java @@ -0,0 +1,26 @@ +package mineplex.core.brawl.fountain.gui; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.brawl.fountain.FountainManager; +import mineplex.core.donation.DonationManager; +import mineplex.core.shop.page.ShopPageBase; +import org.bukkit.entity.Player; + +/** + * @author Shaun Bennett + */ +public class FountainPage extends ShopPageBase +{ + public FountainPage(FountainManager plugin, FountainShop shop, CoreClientManager clientManager, DonationManager donationManager, Player player) + { + super(plugin, shop, clientManager, donationManager, "Counter Keeper", player); + + buildPage(); + } + + @Override + protected void buildPage() + { + + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainShop.java b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainShop.java new file mode 100644 index 000000000..0180d4088 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/gui/FountainShop.java @@ -0,0 +1,25 @@ +package mineplex.core.brawl.fountain.gui; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.brawl.fountain.FountainManager; +import mineplex.core.donation.DonationManager; +import mineplex.core.shop.ShopBase; +import mineplex.core.shop.page.ShopPageBase; +import org.bukkit.entity.Player; + +/** + * @author Shaun Bennett + */ +public class FountainShop extends ShopBase +{ + public FountainShop(FountainManager plugin, CoreClientManager clientManager, DonationManager donationManager) + { + super(plugin, clientManager, donationManager, "Counter Shop"); + } + + @Override + protected ShopPageBase> buildPagesFor(Player player) + { + return new FountainPage(getPlugin(), this, getClientManager(), getDonationManager(), player); + } +} diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/Counter.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/Counter.java new file mode 100644 index 000000000..f7dfb9199 --- /dev/null +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/Counter.java @@ -0,0 +1,70 @@ +package mineplex.serverdata.redis.counter; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * A counter represents an atomic number that is trying to hit a goal. Once the counter + * reaches it's goal you can either reset it or let it stay completed for an indefinite time. + * + * @author Shaun Bennett + */ +public class Counter +{ + // Cached count for the fountain + private AtomicLong _count = new AtomicLong(0); + // The System.currentTimeMillis() when cached count was last updated + private long _cacheLastUpdated; + // The goal that this fountain is trying to reach + private final long _goal; + // The unique key to reference this counter + private final String _dataKey; + + // Redis repository to store the count + private CounterRedisRepository _redisRepository; + + public Counter(String dataKey, long goal) + { + _goal = goal; + _dataKey = dataKey; + _redisRepository = new CounterRedisRepository(dataKey); + + updateCount(); + } + + public void updateCount() + { + updateCount(_redisRepository.getCount()); + } + + protected void updateCount(long newCount) + { + _count.set(newCount); + _cacheLastUpdated = System.currentTimeMillis(); + } + + public void increment(long amount) + { + long newCount = _redisRepository.incrementCount(amount); + updateCount(newCount); + } + + public long getCount() + { + return _count.get(); + } + + public long getGoal() + { + return _goal; + } + + public double getFillPercent() + { + return Math.min(100, (((double) getCount()) / _goal)); + } + + public String getDataKey() + { + return _dataKey; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainRedisRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/CounterRedisRepository.java similarity index 78% rename from Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainRedisRepository.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/CounterRedisRepository.java index cbfb51b76..eebf35e20 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/brawl/fountain/FountainRedisRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/counter/CounterRedisRepository.java @@ -1,18 +1,18 @@ -package mineplex.core.brawl.fountain; +package mineplex.serverdata.redis.counter; import mineplex.serverdata.Region; import mineplex.serverdata.redis.RedisRepository; import redis.clients.jedis.Jedis; /** - * Redis repository to store the count for {@link Fountain} + * Redis repository to store the count for {@link Counter} * @author Shaun Bennett */ -public class FountainRedisRepository extends RedisRepository +public class CounterRedisRepository extends RedisRepository { private String _dataKey; - public FountainRedisRepository(String dataKey) + public CounterRedisRepository(String dataKey) { super(Region.ALL); @@ -31,6 +31,10 @@ public class FountainRedisRepository extends RedisRepository { count = Long.parseLong(jedis.get(getKey())); } + catch (NumberFormatException ex) + { + ex.printStackTrace(); + } return count; }