From e7772938664326fda2337edd7e456d65fcc54959 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 13 Jul 2017 15:38:56 +0100 Subject: [PATCH] Add achievements --- .../core/achievement/Achievement.java | 57 +++- .../core/achievement/AchievementCategory.java | 2 +- .../stats/game/GameStatisticsManager.java | 15 +- .../stats/game/GameStatisticsRepository.java | 6 +- .../game/arcade/game/games/moba/Moba.java | 10 +- .../arcade/game/games/moba/MobaClassic.java | 4 + .../game/arcade/game/games/moba/MobaRole.java | 18 +- .../games/moba/prepare/PrepareSelection.java | 14 +- .../moba/progression/MobaProgression.java | 251 ++++++++++++++++++ .../moba/progression/ui/MobaRolePage.java | 42 +++ .../moba/progression/ui/MobaRoleShop.java | 28 ++ .../arcade/game/games/moba/util/MobaUtil.java | 38 ++- 12 files changed, 457 insertions(+), 28 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/MobaProgression.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRolePage.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRoleShop.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 90872f27c..13e038ce0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -1225,7 +1225,62 @@ public enum Achievement new String[]{"Gem Hunters.ChestsOpened"}, new String[]{"+1 for each chest opened"}, new int[]{50,100,200,400,1000}, - AchievementCategory.GEM_HUNTERS); + AchievementCategory.GEM_HUNTERS), + + MOBA_GOLD_EARNED("Gold Farmer", 0, + new String[]{"Heroes of GWEN.GoldEarned"}, + new String[]{"Earn Gold"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{10000,50000,100000,250000,500000}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + + MOBA_KILLS("Champion Slayer", 0, + new String[]{"Heroes of GWEN.Kills"}, + new String[]{"Kill players"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{100,250,500,1000,5000}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + + MOBA_WINS_ASSASSIN("Assassin Victor", 0, + new String[]{"Heroes of GWEN.Assassin.Wins"}, + new String[]{"Win Games as an Assassin"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{10,50,100,250,500}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + + MOBA_WINS_HUNTER("Hunter Victor", 0, + new String[]{"Heroes of GWEN.Hunter.Wins"}, + new String[]{"Win Games as a Hunter"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{10,50,100,250,500}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + + MOBA_WINS_MAGE("Mage Victor", 0, + new String[]{"Heroes of GWEN.Mage.Wins"}, + new String[]{"Win Games as a Mage"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{10,50,100,250,500}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + + MOBA_WINS_WARRIOR("Warrior Victor", 0, + new String[]{"Heroes of GWEN.Warrior.Wins"}, + new String[]{"Win Games as a Warrior"}, + new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}}, + new int[]{10,50,100,250,500}, + "I", + new String[] {"II","III","IV","V","X"}, + AchievementCategory.MOBA), + ; private String _name; private String[] _desc; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 885bf7939..b448cd365 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -220,7 +220,7 @@ public enum AchievementCategory Material.EMERALD, 0, GameCategory.SURVIVAL, null, false, GameDisplay.GemHunters.getGameId()), MOBA("Heroes of GWEN", null, - new StatDisplay[] {StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED, null, StatDisplay.fromGame("Gold Earned", GameDisplay.MOBA, "GoldEarned")}, + new StatDisplay[] {StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, null, StatDisplay.fromGame("Gold Earned", GameDisplay.MOBA, "GoldEarned")}, Material.PRISMARINE_SHARD, 0, GameCategory.CLASSICS, null, false, GameDisplay.MOBA.getGameId()); private String _name; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsManager.java index fa0619e6d..d3ae17479 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsManager.java @@ -41,11 +41,16 @@ public class GameStatisticsManager extends MiniPlugin } else { - _repository.getMapId(mapId -> - { - _gameMaps.put(mapName, mapId); - callback.accept(mapId); - }, gameType.getGameId(), mapName); + runAsync(() -> + _repository.getMapId(mapId -> + { + _gameMaps.put(mapName, mapId); + + if (callback != null) + { + runSync(() -> callback.accept(mapId)); + } + }, gameType.getGameId(), mapName)); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsRepository.java index ee0a3e532..0d504478d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/game/GameStatisticsRepository.java @@ -23,8 +23,8 @@ public class GameStatisticsRepository extends RepositoryBase { private static final String INSERT_MAP = "INSERT INTO gameMaps (gameType,mapName) VALUES (?,?)"; - private static final String GET_MAP_BY_ID = "SELECT * FROM gameMaps WHERE mapName=?"; - private static final String SAVE_GAME = "INSERT INTO gameStatistics (region,gameId,map,startTime,endTime) VALUES (?,?,?,?,?)"; + private static final String GET_MAP_BY_ID = "SELECT mapId FROM gameMaps WHERE mapName=?"; + private static final String SAVE_GAME = "INSERT INTO gameStatistics (region,gameType,map,startTime,endTime) VALUES (?,?,?,?,?)"; private static final String SAVE_STAT = "INSERT INTO gamePlayerStatistics VALUES (?,?,?,?);"; private static final String GET_BY_ID = "SELECT * FROM gameStatistics WHERE gameId=?"; private static final String SQL_REGEX = "\\?"; @@ -45,7 +45,7 @@ public class GameStatisticsRepository extends RepositoryBase { if (resultSet.next()) { - callback.accept(resultSet.getInt(0)); + callback.accept(resultSet.getInt(1)); } else { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/Moba.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/Moba.java index b51e5050c..21aa9a064 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/Moba.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/Moba.java @@ -15,6 +15,7 @@ import mineplex.core.imagemap.objects.PlayerMapBoard; import mineplex.core.leaderboard.Leaderboard; import mineplex.core.leaderboard.LeaderboardManager; import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.stats.event.StatChangeEvent; import mineplex.minecraft.game.core.combat.DeathMessageType; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; @@ -45,6 +46,7 @@ import nautilus.game.arcade.game.games.moba.kit.larissa.HeroLarissa; import nautilus.game.arcade.game.games.moba.kit.rowena.HeroRowena; import nautilus.game.arcade.game.games.moba.minion.MinionManager; import nautilus.game.arcade.game.games.moba.overtime.OvertimeManager; +import nautilus.game.arcade.game.games.moba.progression.MobaProgression; import nautilus.game.arcade.game.games.moba.shop.MobaShop; import nautilus.game.arcade.game.games.moba.structure.point.CapturePointManager; import nautilus.game.arcade.game.games.moba.structure.tower.TowerManager; @@ -101,6 +103,7 @@ public class Moba extends TeamGame protected final TowerManager _tower; protected final CapturePointManager _capturePoint; protected final MinionManager _minion; + private final MobaProgression _progression; private final ImageMapManager _mapManager = Managers.require(ImageMapManager.class); private PlayerMapBoard _board; private MapBoardSelector _selector; @@ -137,6 +140,7 @@ public class Moba extends TeamGame _buffs = registerManager(new BuffManager()); _arrowKb = registerManager(new ArrowKBManager(this)); _minion = registerManager(new MinionManager(this)); + _progression = registerManager(new MobaProgression(this)); registerManager(new HPManager(this)); registerManager(new MobaDamageManager(this)); registerManager(new MobaFountain(this)); @@ -239,7 +243,9 @@ public class Moba extends TeamGame leaderboard.registerLeaderboard("TOP_HOG_GOLD", new Leaderboard("Top Gold Earned", goldPair, new String[]{GetName() + ".GoldEarned"}, LeaderboardSQLType.ALL, location, 10)); } - _board = _mapManager.createPlayerBoard(lobbyCustomLocs.get("HERO_VIEWER").get(0).clone().add(0, 1, 0), BlockFace.EAST, 7, 4, ITEM_IMAGES); + _progression.spawnRoleViewers(lobbyCustomLocs); + + _board = _mapManager.createPlayerBoard(lobbyCustomLocs.get("HERO_VIEWER").get(0), BlockFace.EAST, 7, 4, ITEM_IMAGES); _selector = new MapBoardSelector(_board); _selector.createHolograms(lobbyCustomLocs.get("HERO_VIEWER NEXT").get(0), lobbyCustomLocs.get("HERO_VIEWER BACK").get(0)); } @@ -267,7 +273,7 @@ public class Moba extends TeamGame // Cleanup tutorial boards _mapManager.cleanupBoard(_board); _selector.cleanup(); - + _progression.removeRoleViewers(); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaClassic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaClassic.java index 3d1f9bb52..ab2750c01 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaClassic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaClassic.java @@ -254,11 +254,15 @@ public class MobaClassic extends Moba for (Player player : otherTeam.GetPlayers(true)) { + MobaPlayer mobaPlayer = getMobaData(player); + + AddStat(player, mobaPlayer.getRole().getName() + ".Wins", 1, true, false); AddGems(player, 20, "Winning", false, false); } AnnounceEnd(otherTeam); SetState(GameState.End); + return; } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaRole.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaRole.java index dd09209b9..fd4b64d91 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaRole.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/MobaRole.java @@ -1,26 +1,29 @@ package nautilus.game.arcade.game.games.moba; +import mineplex.core.common.skin.SkinData; import org.bukkit.ChatColor; import org.bukkit.Color; public enum MobaRole { - ASSASSIN("Assassin", Color.GRAY, ChatColor.GRAY), - HUNTER("Hunter", Color.LIME, ChatColor.GREEN), - MAGE("Mage", Color.PURPLE, ChatColor.DARK_PURPLE), - WARRIOR("Warrior", Color.YELLOW, ChatColor.GOLD), + ASSASSIN("Assassin", Color.GRAY, ChatColor.GRAY, SkinData.HATTORI), + HUNTER("Hunter", Color.LIME, ChatColor.GREEN, SkinData.DEVON), + MAGE("Mage", Color.PURPLE, ChatColor.DARK_PURPLE, SkinData.ANATH), + WARRIOR("Warrior", Color.YELLOW, ChatColor.GOLD, SkinData.DANA), ; private final String _name; private final Color _color; private final ChatColor _chatColor; + private final SkinData _skinData; - MobaRole(String name, Color color, ChatColor chatColor) + MobaRole(String name, Color color, ChatColor chatColor, SkinData skinData) { _name = name; _color = color; _chatColor = chatColor; + _skinData = skinData; } public String getName() @@ -37,4 +40,9 @@ public enum MobaRole { return _chatColor; } + + public SkinData getSkin() + { + return _skinData; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/prepare/PrepareSelection.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/prepare/PrepareSelection.java index c55dfba5f..938d03258 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/prepare/PrepareSelection.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/prepare/PrepareSelection.java @@ -43,6 +43,11 @@ import java.util.concurrent.atomic.AtomicInteger; public class PrepareSelection implements Listener, IPacketHandler { + public static ItemStack buildColouredStack(Material material, MobaRole role) + { + return new ItemBuilder(material).setColor(role.getColor()).build(); + } + private final Moba _host; private final Map _roleStands = new HashMap<>(); private final Map _kitStands = new HashMap<>(); @@ -76,8 +81,6 @@ public class PrepareSelection implements Listener, IPacketHandler Location average = UtilAlg.getAverageLocation(team.GetSpawns()); Player[] players = team.GetPlayers(true).toArray(new Player[0]); - ItemStack head = new ItemBuilder(Material.SKULL_ITEM, (byte) 3).build(); - UtilServer.runSyncLater(() -> { for (Player player : team.GetPlayers(true)) @@ -99,7 +102,7 @@ public class PrepareSelection implements Listener, IPacketHandler stand.setCustomNameVisible(true); stand.setCustomName(C.cGreenB + role.getName() + C.cGray + " - " + C.cGreenB + "AVAILABLE"); stand.setArms(true); - stand.setHelmet(head); + stand.setHelmet(role.getSkin().getSkull()); stand.setChestplate(buildColouredStack(Material.LEATHER_CHESTPLATE, role)); stand.setLeggings(buildColouredStack(Material.LEATHER_LEGGINGS, role)); stand.setBoots(buildColouredStack(Material.LEATHER_BOOTS, role)); @@ -176,11 +179,6 @@ public class PrepareSelection implements Listener, IPacketHandler return location.clone().add(0, 1, 0); } - private ItemStack buildColouredStack(Material material, MobaRole role) - { - return new ItemBuilder(material).setColor(role.getColor()).build(); - } - private void removePodiums() { _host.getLocationStartsWith("KIT").forEach((key, location) -> location.getBlock().setType(Material.AIR)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/MobaProgression.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/MobaProgression.java new file mode 100644 index 000000000..86dde7520 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/MobaProgression.java @@ -0,0 +1,251 @@ +package nautilus.game.arcade.game.games.moba.progression; + +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilServer; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.DebugCommand; +import nautilus.game.arcade.game.Game.GameState; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.games.moba.Moba; +import nautilus.game.arcade.game.games.moba.MobaPlayer; +import nautilus.game.arcade.game.games.moba.MobaRole; +import nautilus.game.arcade.game.games.moba.prepare.PrepareSelection; +import nautilus.game.arcade.game.games.moba.progression.ui.MobaRoleShop; +import nautilus.game.arcade.game.games.moba.util.MobaUtil; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +public class MobaProgression implements Listener +{ + + private static final int[] EXP_LEVELS; + private static final DecimalFormat FORMAT = new DecimalFormat("0.0"); + + static + { + EXP_LEVELS = new int[100]; + int expRequired = 0; + + for (int level = 0; level < 10; level++) + { + EXP_LEVELS[level] = expRequired += 2000; + } + + for (int level = 10; level < 20; level++) + { + EXP_LEVELS[level] = expRequired += 4000; + } + + for (int level = 20; level < 40; level++) + { + EXP_LEVELS[level] = expRequired += 8000; + } + + for (int level = 40; level < 60; level++) + { + EXP_LEVELS[level] = expRequired += 16000; + } + + for (int level = 60; level < 80; level++) + { + EXP_LEVELS[level] = expRequired += 32000; + } + + for (int level = 80; level < 100; level++) + { + EXP_LEVELS[level] = expRequired += 64000; + } + } + + private final Moba _host; + private final Map _roleViewers; + private final MobaRoleShop _roleShop; + + public MobaProgression(Moba host) + { + _host = host; + _roleViewers = new HashMap<>(); + _roleShop = new MobaRoleShop(host.getArcadeManager()); + + host.registerDebugCommand(new DebugCommand("fakeexp", Rank.DEVELOPER) + { + @Override + public void Execute(Player caller, String[] args) + { + int exp = Integer.parseInt(args[0]); + _host.GetGems(caller).put("Fake Exp", new GemData(exp, false)); + caller.sendMessage(F.main("Debug", "Gave you " + F.elem(exp) + " fake exp.")); + } + }); + } + + public void spawnRoleViewers(Map> lobbyLocations) + { + Location center = lobbyLocations.get("SPAWN").get(0); + + for (MobaRole role : MobaRole.values()) + { + List locations = lobbyLocations.get(role.name()); + + if (locations == null || locations.isEmpty()) + { + continue; + } + + Location location = locations.get(0).clone(); + location.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(location, center))); + + ArmorStand stand = location.getWorld().spawn(location, ArmorStand.class); + + UtilEnt.vegetate(stand); + UtilEnt.ghost(stand, true, false); + + stand.setCustomName(C.cGreenB + role.getName()); + stand.setCustomNameVisible(true); + stand.setArms(true); + stand.setBasePlate(false); + stand.setHelmet(role.getSkin().getSkull()); + stand.setChestplate(PrepareSelection.buildColouredStack(Material.LEATHER_CHESTPLATE, role)); + stand.setLeggings(PrepareSelection.buildColouredStack(Material.LEATHER_LEGGINGS, role)); + stand.setBoots(PrepareSelection.buildColouredStack(Material.LEATHER_BOOTS, role)); + + _roleViewers.put(stand, role); + } + } + + public void removeRoleViewers() + { + for (ArmorStand stand : _roleViewers.keySet()) + { + stand.remove(); + } + + _roleViewers.clear(); + } + + @EventHandler + public void onClick(CustomDamageEvent event) + { + onClick(event.GetDamagerEntity(true), event.GetDamageeEntity()); + } + + @EventHandler + public void onClick(PlayerInteractAtEntityEvent event) + { + onClick(event.getPlayer(), event.getRightClicked()); + } + + private void onClick(Entity clicker, Entity clicked) + { + if (clicker == null || !(clicker instanceof Player) || !_roleViewers.containsKey(clicked)) + { + return; + } + + Player player = (Player) clicker; + MobaRole role = _roleViewers.get(clicked); + + if (role == null) + { + return; + } + + _roleShop.openShop(player, role); + } + + @EventHandler + public void end(GameStateChangeEvent event) + { + if (event.GetState() != GameState.End || !_host.getArcadeManager().IsRewardStats()) + { + return; + } + + _host.GetPlayers(true).forEach(this::rewardPlayer); + } + + private int getLevel(long exp) + { + int i = 0; + + for (int expRequired : EXP_LEVELS) + { + i++; + if (expRequired > exp) + { + return i; + } + } + + return 1; + } + + private void rewardPlayer(Player player) + { + MobaPlayer mobaPlayer = _host.getMobaData(player); + MobaRole role = mobaPlayer.getRole(); + String stat = _host.GetName() + "." + role.getName() + "." + "ExpEarned"; + long currentExp = _host.getArcadeManager().GetStatsManager().Get(player).getStat(stat); + AtomicInteger earnedExp = new AtomicInteger(); + + for (GemData data : _host.GetGems(player).values()) + { + earnedExp.getAndAdd((int) data.Gems); + } + + int level = getLevel(currentExp); + int newLevel = getLevel(currentExp + earnedExp.get()); + int expForThisLevel = EXP_LEVELS[level - 1]; + AtomicBoolean levelUp = new AtomicBoolean(); + + if (newLevel > level) + { + levelUp.set(true); + } + + _host.getArcadeManager().GetStatsManager().incrementStat(player, stat, earnedExp.get()); + + UtilServer.runSyncLater(() -> + { + player.sendMessage(ArcadeFormat.Line); + player.sendMessage(""); + + player.sendMessage(" " + role.getChatColor() + C.Bold + role.getName() + " Progression" + (levelUp.get() ? C.cGreenB + " LEVEL UP" : "")); + player.sendMessage(""); + player.sendMessage(MobaUtil.getProgressBar(currentExp, currentExp + earnedExp.get(), expForThisLevel, 100) + " " + C.cGray + "+" + C.cGreen + earnedExp + C.cGray + "/" + C.cAqua + expForThisLevel); + player.sendMessage(C.cGreen + FORMAT.format((currentExp + earnedExp.get()) / (double) expForThisLevel * 100D) + C.cWhite + "% complete for Level " + level); + + player.sendMessage(""); + player.sendMessage(ArcadeFormat.Line); + + if (levelUp.get()) + { + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + } + else + { + player.playSound(player.getLocation(), Sound.CLICK, 1, 1); + } + }, 60); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRolePage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRolePage.java new file mode 100644 index 000000000..c383b126e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRolePage.java @@ -0,0 +1,42 @@ +package nautilus.game.arcade.game.games.moba.progression.ui; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.UtilUI; +import mineplex.core.donation.DonationManager; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.shop.page.ShopPageBase; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.moba.MobaRole; +import org.bukkit.entity.Player; + +public class MobaRolePage extends ShopPageBase +{ + + private static final int SIZE = 45; + private static final int[] MAPPINGS = UtilUI.getIndicesFor(4, 3); + + private final MobaRole _role; + + public MobaRolePage(ArcadeManager plugin, MobaRoleShop shop, CoreClientManager clientManager, DonationManager donationManager, Player player, MobaRole role) + { + super(plugin, shop, clientManager, donationManager, role.getName(), player, SIZE); + + _role = role; + + buildPage(); + } + + @Override + protected void buildPage() + { + addButtonNoAction(13, new ItemBuilder(_role.getSkin().getSkull()) + .setTitle(_role.getChatColor() + _role.getName()) + .addLore("", "Every 10 levels you unlock a new", "hero within the " + _role.getName() + " category.") + .build()); + +// for (int slot : MAPPINGS) +// { +// addButton(slot, ); +// } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRoleShop.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRoleShop.java new file mode 100644 index 000000000..f7a76b1d1 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/progression/ui/MobaRoleShop.java @@ -0,0 +1,28 @@ +package nautilus.game.arcade.game.games.moba.progression.ui; + +import mineplex.core.shop.ShopBase; +import mineplex.core.shop.page.ShopPageBase; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.moba.MobaRole; +import org.bukkit.entity.Player; + +public class MobaRoleShop extends ShopBase +{ + + + public MobaRoleShop(ArcadeManager plugin) + { + super(plugin, plugin.GetClients(), plugin.GetDonation(), "Moba Heroes"); + } + + public void openShop(Player player, MobaRole role) + { + openPageForPlayer(player, new MobaRolePage(getPlugin(), this, getClientManager(), getDonationManager(), player, role)); + } + + @Override + protected ShopPageBase> buildPagesFor(Player player) + { + return null; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/util/MobaUtil.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/util/MobaUtil.java index 76721ad08..8483e03b7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/util/MobaUtil.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/util/MobaUtil.java @@ -137,16 +137,21 @@ public class MobaUtil } public static String getHealthBar(LivingEntity entity, double newHealth, int bars) + { + return getProgressBar(newHealth, entity.getMaxHealth(), bars); + } + + public static String getProgressBar(double value, double max, int bars) { StringBuilder out = new StringBuilder(); - double health = newHealth / entity.getMaxHealth(); - String colour = getColour(health); + double progress = value / max; + String colour = getColour(progress); for (int i = 0; i < bars; i++) { double cur = i * (1D / (double) bars); - if (cur < health) + if (cur < progress) { out.append(colour).append("|"); } @@ -159,6 +164,33 @@ public class MobaUtil return out.toString(); } + public static String getProgressBar(double valueA, double valueB, double max, int bars) + { + StringBuilder out = new StringBuilder(); + double progressA = valueA / max; + double progressB = valueB / max; + + for (int i = 0; i < bars; i++) + { + double cur = i * (1D / (double) bars); + + if (cur < progressA) + { + out.append(C.cAqua).append("|"); + } + else if (cur < progressB) + { + out.append(C.cGreen).append("|"); + } + else + { + out.append(C.cGrayB).append("|"); + } + } + + return out.toString(); + } + public static String getColour(double percentage) { if (percentage < 0.25)