From 30fb899bee4f9ac59795179ed4b8f30653fd90e1 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Apr 2017 18:26:22 +0100 Subject: [PATCH 001/170] Move debug commands over to the proper system --- .../arcade/game/games/smash/SuperSmash.java | 258 +++++++----------- 1 file changed, 103 insertions(+), 155 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index ba21dfd17..b75aff778 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -1,16 +1,30 @@ package nautilus.game.arcade.game.games.smash; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.bukkit.ChatColor; -import org.bukkit.Color; +import com.google.common.collect.Sets; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.common.Rank; +import mineplex.core.common.util.*; +import mineplex.core.hologram.Hologram; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.DebugCommand; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.game.games.smash.kits.*; +import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.*; import org.bukkit.FireworkEffect.Type; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.LivingEntity; @@ -18,70 +32,19 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -import org.bukkit.event.entity.ItemSpawnEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; -import com.google.common.collect.Sets; - -import mineplex.core.blockrestore.BlockRestore; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.hologram.Hologram; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; - -import nautilus.game.arcade.ArcadeFormat; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.GameTeam.PlayerState; -import nautilus.game.arcade.game.games.smash.kits.KitBlaze; -import nautilus.game.arcade.game.games.smash.kits.KitChicken; -import nautilus.game.arcade.game.games.smash.kits.KitCow; -import nautilus.game.arcade.game.games.smash.kits.KitCreeper; -import nautilus.game.arcade.game.games.smash.kits.KitEnderman; -import nautilus.game.arcade.game.games.smash.kits.KitGolem; -import nautilus.game.arcade.game.games.smash.kits.KitGuardian; -import nautilus.game.arcade.game.games.smash.kits.KitMagmaCube; -import nautilus.game.arcade.game.games.smash.kits.KitPig; -import nautilus.game.arcade.game.games.smash.kits.KitSheep; -import nautilus.game.arcade.game.games.smash.kits.KitSkeletalHorse; -import nautilus.game.arcade.game.games.smash.kits.KitSkeleton; -import nautilus.game.arcade.game.games.smash.kits.KitSkySquid; -import nautilus.game.arcade.game.games.smash.kits.KitSlime; -import nautilus.game.arcade.game.games.smash.kits.KitSnowman; -import nautilus.game.arcade.game.games.smash.kits.KitSpider; -import nautilus.game.arcade.game.games.smash.kits.KitWitch; -import nautilus.game.arcade.game.games.smash.kits.KitWitherSkeleton; -import nautilus.game.arcade.game.games.smash.kits.KitWolf; -import nautilus.game.arcade.game.games.smash.kits.KitZombie; -import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; -import nautilus.game.arcade.game.modules.compass.CompassModule; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.Perk; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; public abstract class SuperSmash extends Game { @@ -128,6 +91,80 @@ public abstract class SuperSmash extends Game new CompassModule() .setGiveCompassToAlive(true) .register(this); + + registerDebugCommand(new DebugCommand("cooldown", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + for (Player other : UtilServer.getPlayers()) + { + Recharge.Instance.Reset(other); + } + + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " reset cooldowns!"); + } + }); + registerDebugCommand(new DebugCommand("nextsmash", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + _nextPowerup = System.currentTimeMillis() + 1000; + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " spawned a smash crystal!"); + } + }); + registerDebugCommand(new DebugCommand("smash", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + giveSmashItem(caller); + } + }); + registerDebugCommand(new DebugCommand("kit", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + String kit = ""; + + for (int i = 0; i < args.length; i++) + { + kit += args[i] + " "; + } + + kit = kit.trim(); + + for (Kit kits : GetKits()) + { + if (kit.equalsIgnoreCase(kits.GetName())) + { + SetKit(caller, kits, true); + return; + } + } + + caller.sendMessage(F.main("Kit", "Sorry that is not a kit!")); + } + }); + registerDebugCommand(new DebugCommand("lives", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " reset their lives!"); + + if (!IsAlive(caller)) + { + SetPlayerState(caller, PlayerState.IN); + RespawnPlayer(caller); + caller.sendMessage(F.main("Revive", "You are back in the game!")); + } + + _lives.put(caller, MAX_LIVES); + } + }); } @EventHandler(priority = EventPriority.HIGH) @@ -153,18 +190,6 @@ public abstract class SuperSmash extends Game { SetPlayerState(event.getEntity(), PlayerState.OUT); } - - // I think this causes players to sometimes be invisible - // DisguiseManager disguiseManager = Manager.GetDisguise(); - // DisguiseBase disguise = - // disguiseManager.getActiveDisguise(event.getEntity()); - // - // if (disguise == null) - // { - // return; - // } - // - // disguiseManager.undisguise(disguise); } @EventHandler @@ -696,81 +721,4 @@ public abstract class SuperSmash extends Game { return _lives; } - - @EventHandler - public void debugCommands(PlayerCommandPreprocessEvent event) - { - if (!UtilServer.isTestServer()) - { - return; - } - - String message = event.getMessage(); - Player player = event.getPlayer(); - - if (message.startsWith("/cooldown")) - { - event.setCancelled(true); - - for (Player other : UtilServer.getPlayers()) - { - Recharge.Instance.Reset(other); - } - - Announce(C.cWhiteB + player.getName() + C.cAquaB + " reset cooldowns!"); - } - else if (message.startsWith("/nextsmash")) - { - event.setCancelled(true); - - _nextPowerup = System.currentTimeMillis() + 1000; - Announce(C.cWhiteB + player.getName() + C.cAquaB + " spawned a smash crystal!"); - } - else if (message.startsWith("/smash")) - { - event.setCancelled(true); - - giveSmashItem(player); - } - else if (message.startsWith("/kit")) - { - event.setCancelled(true); - - String[] args = message.split(" "); - String kit = ""; - - for (int i = 1; i < args.length; i++) - { - kit += args[i] + " "; - } - - kit = kit.trim(); - - for (Kit kits : GetKits()) - { - if (kit.equalsIgnoreCase(kits.GetName())) - { - SetKit(player, kits, true); - return; - } - } - - player.sendMessage(F.main("Kit", "Sorry that is not a kit!")); - } - else if (message.startsWith("/lives")) - { - event.setCancelled(true); - - Announce(C.cWhiteB + player.getName() + C.cAquaB + " reset their lives!"); - - if (!IsAlive(player)) - { - SetPlayerState(player, PlayerState.IN); - RespawnPlayer(player); - player.sendMessage(F.main("Revive", "You are back in the game!")); - } - - _lives.put(player, MAX_LIVES); - } - } } From 01f74a3e1238437b0a1382c8144aec988617ce9b Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 21 Apr 2017 17:35:10 +0100 Subject: [PATCH 002/170] SSM Training Ground --- .../src/mineplex/core/game/GameDisplay.java | 1 + .../src/nautilus/game/arcade/GameType.java | 2 + .../arcade/game/games/smash/SuperSmash.java | 8 +- .../game/games/smash/SuperSmashTraining.java | 193 +++++++++ .../game/modules/training/TrainingBot.java | 138 ++++++ .../modules/training/TrainingGameModule.java | 398 ++++++++++++++++++ .../game/arcade/kit/perks/PerkRopedArrow.java | 5 + 7 files changed, 743 insertions(+), 2 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index cc5ba27d4..63061ae7f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -49,6 +49,7 @@ public enum GameDisplay Smash("Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.CLASSICS, 34, true), SmashDomination("Super Smash Mobs Domination", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.EXTRA, 36, false), SmashTeams("Super Smash Mobs Teams", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.TEAM_VARIANT, 35, false), + SmashTraining("Super Smash Mobs Training", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.EXTRA, 34, false), Snake("Snake", Material.WOOL, (byte)0, GameCategory.ARCADE, 37, true), SneakyAssassins("Sneaky Assassins", Material.INK_SACK, (byte)0, GameCategory.ARCADE, 38, true), SnowFight("Snow Fight", Material.SNOW_BALL, (byte)0, GameCategory.EXTRA, 39, false), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 66bef53c0..fdcddb842 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -1,5 +1,6 @@ package nautilus.game.arcade; +import nautilus.game.arcade.game.games.smash.SuperSmashTraining; import org.bukkit.Material; import mineplex.core.common.MinecraftVersion; @@ -182,6 +183,7 @@ public enum GameType Smash(SoloSuperSmash.class, GameDisplay.Smash), SmashDomination(SuperSmashDominate.class, GameDisplay.SmashDomination), SmashTeams(TeamSuperSmash.class, GameDisplay.SmashTeams, new GameType[]{GameType.Smash}, false), + SmashTraining(SuperSmashTraining.class, GameDisplay.SmashTraining), Snake(Snake.class, GameDisplay.Snake), SneakyAssassins(SneakyAssassins.class, GameDisplay.SneakyAssassins), SnowFight(SnowFight.class, GameDisplay.SnowFight), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index b75aff778..3bcdcb304 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -582,6 +582,12 @@ public abstract class SuperSmash extends Game return; } + displayKitInto(player); + event.setCancelled(true); + } + + protected void displayKitInto(Player player) + { for (int i = player.getItemInHand().getItemMeta().getLore().size(); i <= 7; i++) { UtilPlayer.message(player, ""); @@ -600,8 +606,6 @@ public abstract class SuperSmash extends Game UtilPlayer.message(player, ArcadeFormat.Line); player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 2f); - - event.setCancelled(true); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java new file mode 100644 index 000000000..d4e37452e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -0,0 +1,193 @@ +package nautilus.game.arcade.game.games.smash; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilTime; +import mineplex.core.hologram.Hologram; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.modules.training.TrainingBot; +import nautilus.game.arcade.game.modules.training.TrainingGameModule; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +public class SuperSmashTraining extends SuperSmash +{ + + private static final long GAME_TIME = TimeUnit.HOURS.toMillis(3); + private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(5); + private static final String[] INFO_HOLOGRAM = { + C.cYellow + "Select a " + C.cGreen + "Kit", + C.cYellow + "Jump off the island to use your abilities", + C.cYellow + "You can then " + C.cGreen + "PVP" + C.cYellow + " other players", + C.cYellow + "Click the " + C.cGreen + "Bed" + C.cYellow + " to return to this island" + }; + + private Location _borderA; + private Location _borderB; + + private boolean _announceEnd; + + public SuperSmashTraining(ArcadeManager manager) + { + super(manager, GameType.SmashTraining, new String[]{ + "Super Smash Mobs Training Ground" + }); + + DamageTeamSelf = true; + DeathSpectateSecs = 0; + PrepareTime = 500; + GiveClock = false; + + Function playerFunction = player -> + { + return !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); + }; + + new TrainingGameModule() + .setSkillFunction(playerFunction) + .setDamageFunction(playerFunction) + .addBot(TrainingBot.class) + .register(this); + } + + @Override + public void ParseData() + { + List locations = WorldData.GetDataLocs("BROWN"); + + _borderA = locations.get(0); + _borderB = locations.get(1); + } + + @EventHandler + public void customTeamGeneration(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Recruit) + { + return; + } + + GameTeam players = GetTeamList().get(0); + players.SetColor(ChatColor.YELLOW); + players.SetName("Players"); + players.setDisplayName(C.cYellowB + "Players"); + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + { + return; + } + + List locations = WorldData.GetDataLocs("BLUE"); + + for (Location location : locations) + { + spawnInfoHologram(location); + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + Scoreboard.writeNewLine(); + + List alive = GetPlayers(true); + + Scoreboard.write(C.cYellowB + "Players"); + + if (alive.size() > 9) + { + Scoreboard.write(alive.size() + " Alive"); + } + else + { + for (Player player : alive) + { + Scoreboard.write(player.getName()); + } + } + + Scoreboard.writeNewLine(); + + Scoreboard.write(C.cYellowB + "Time"); + Scoreboard.write(UtilTime.MakeStr(System.currentTimeMillis() - GetStateTime())); + + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public List getWinners() + { + return null; + } + + @Override + public List getLosers() + { + return null; + } + + @Override + @EventHandler + public void playerDeath(PlayerDeathEvent event) + { + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + if (UtilTime.elapsed(GetStateTime(), GAME_TIME)) + { + SetState(GameState.Dead); + Announce(C.cRedB + "Game Over! Resetting the map, you will be able to play again."); + } + else if (UtilTime.elapsed(GetStateTime(), GAME_WARN_TIME) && !_announceEnd) + { + _announceEnd = true; + Announce(C.cRedB + "The Game Will End In 5 Minutes."); + } + } + + @Override + public long getNewSmashTime() + { + return (long) (System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(2) + TimeUnit.MINUTES.toMillis(2) * Math.random()); + } + + private void spawnInfoHologram(Location location) + { + CreatureAllowOverride = true; + + new Hologram(getArcadeManager().getHologramManager(), location, true, INFO_HOLOGRAM).start(); + + CreatureAllowOverride = false; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java new file mode 100644 index 000000000..c311b5d35 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java @@ -0,0 +1,138 @@ +package nautilus.game.arcade.game.modules.training; + +import mineplex.core.common.skin.SkinData; +import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguisePlayer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.text.DecimalFormat; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +public class TrainingBot implements Listener +{ + + private static final SkinData[] SKIN_DATAS = + { + SkinData.SNOWMAN, + SkinData.MOOSHROOM, + SkinData.WITCH + }; + private static final int DAMAGE_HOLOGRAMS_LIFE = 40; + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.0"); + private static final long RESPAWN_TIME = TimeUnit.SECONDS.toMillis(5); + + private TrainingGameModule _module; + private Location _location; + private int _number; + + protected ArmorStand _stand; + private long _lastDeath; + + private final Set _damageHolograms; + + public TrainingBot(TrainingGameModule module, Location location, int number) + { + _module = module; + _location = location; + _number = number; + _lastDeath = System.currentTimeMillis(); + _damageHolograms = new HashSet<>(); + + UtilServer.RegisterEvents(this); + } + + public void cleanup() + { + UtilServer.Unregister(this); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void botDamage(CustomDamageEvent event) + { + if (_stand == null || !_stand.equals(event.GetDamageeEntity())) + { + return; + } + + spawnDamageHologram(event.GetDamage()); + } + + @EventHandler + public void botDeath(CombatDeathEvent event) + { + if (_stand == null || !_stand.equals(event.GetEvent().getEntity())) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + _stand.remove(); + } + + private void spawnDamageHologram(double damage) + { + String damageSting = DECIMAL_FORMAT.format(damage); + Location location = UtilAlg.getRandomLocation(_stand.getLocation().add(0, 1, 0), 1, 0, 1); + ArmorStand stand = location.getWorld().spawn(location, ArmorStand.class); + + stand.setVisible(false); + stand.setGravity(false); + stand.setCustomName(C.cRedB + "-" + damageSting); + stand.setCustomNameVisible(true); + + _damageHolograms.add(stand); + } + + @EventHandler + public void cleanupDamageHolograms(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTEST) + { + return; + } + + Iterator iterator = _damageHolograms.iterator(); + + while (iterator.hasNext()) + { + ArmorStand stand = iterator.next(); + + if (stand.getTicksLived() > DAMAGE_HOLOGRAMS_LIFE) + { + stand.remove(); + iterator.remove(); + continue; + } + + stand.teleport(stand.getLocation().add(0, 0.25, 0)); + } + } + + @EventHandler + public void respawn(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || !UtilTime.elapsed(_lastDeath, RESPAWN_TIME)) + { + return; + } + + _lastDeath = System.currentTimeMillis(); + _stand = _location.getWorld().spawn(_location, ArmorStand.class); + + DisguisePlayer disguise = new DisguisePlayer(_stand, C.cYellowB + "Bot #" + _number, SKIN_DATAS[UtilMath.r(SKIN_DATAS.length)]); + disguise.setSendSkinDataToSelf(false); + _module.getGame().getArcadeManager().GetDisguise().disguise(disguise); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java new file mode 100644 index 000000000..e3c19bf3f --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java @@ -0,0 +1,398 @@ +package nautilus.game.arcade.game.modules.training; + +import mineplex.core.command.CommandCenter; +import mineplex.core.common.util.*; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.modules.Module; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.ProgressingKit; +import nautilus.game.arcade.managers.LobbyEnt; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.*; +import java.util.function.Function; + +public class TrainingGameModule extends Module +{ + + private static final String RETURN_TO_SPAWN_RECHARGE = "Return To Select A Kit"; + private static final int RETURN_TO_SPAWN_COOLDOWN = 8000; + private static final ItemStack RETURN_TO_SPAWN_ITEM = new ItemBuilder(Material.BED) + .setTitle(C.cGreenB + RETURN_TO_SPAWN_RECHARGE) + .addLore("Click to return to the spawn island", "where you can select a new kit.") + .build(); + + private final Set _kits; + private Function _teamFunction; + private Function _skillFunction; + private Function _damageFunction; + private final Set> _botClasses; + private final Set _bots; + + public TrainingGameModule() + { + _kits = new HashSet<>(); + _botClasses = new HashSet<>(); + _bots = new HashSet<>(); + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != Game.GameState.Live) + { + return; + } + + List locations = getGame().WorldData.GetDataLocs("PURPLE"); + int i = 0; + getGame().CreatureAllowOverride = true; + + for (Kit kit : getGame().GetKits()) + { + Location location = locations.get(i++); + Entity entity = kit.SpawnEntity(location); + + _kits.add(new LobbyEnt(entity, location, kit)); + } + + Location average = UtilAlg.getAverageLocation(locations); + + for (LobbyEnt entity : _kits) + { + UtilEnt.CreatureLook(entity.GetEnt(), average); + } + + Map> map = getGame().WorldData.GetAllCustomLocs(); + int j = 0; + + for (Map.Entry> entry : map.entrySet()) + { + String s = entry.getKey(); + + if (s.startsWith("BOT")) + { + String[] split = s.split(" "); + + if (split.length < 2) + { + continue; + } + + String clazzName = split[1]; + + for (Class clazz : _botClasses) + { + if (clazzName.equals(clazz.getSimpleName())) + { + for (Location location : entry.getValue()) + { + spawnBot(clazz, location, ++j); + } + } + } + } + } + + getGame().CreatureAllowOverride = false; + } + + @Override + public void cleanup() + { + for (LobbyEnt lobbyEnt : _kits) + { + lobbyEnt.GetEnt().remove(); + } + + for (TrainingBot bot : _bots) + { + bot.cleanup(); + } + + _kits.clear(); + } + + @EventHandler + public void kitMove(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + for (LobbyEnt ent : _kits) + { + Location location = ent.GetLocation(); + + ((CraftEntity) ent.GetEnt()).getHandle().setPosition(location.getX(), location.getY(), location.getZ()); + } + } + + @EventHandler + public void kitInteract(PlayerInteractEntityEvent event) + { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + LobbyEnt lobbyEnt = getFromEntity(entity); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + if (lobbyEnt != null) + { + getGame().getArcadeManager().Clear(player); + getGame().SetKit(event.getPlayer(), lobbyEnt.GetKit(), true); + event.setCancelled(true); + } + } + + @EventHandler + public void kitCombust(EntityCombustEvent event) + { + if (getFromEntity(event.getEntity()) != null) + { + event.setCancelled(true); + } + } + + @EventHandler + public void kitDamage(CustomDamageEvent event) + { + if (getFromEntity(event.GetDamageeEntity()) != null) + { + event.SetCancelled("Kit NPC"); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void playerLogin(PlayerLoginEvent event) + { + Player player = event.getPlayer(); + Game game = getGame(); + GameTeam team = _teamFunction == null ? game.GetTeamList().get(0) : _teamFunction.apply(player); + + team.AddPlayer(player, true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void playerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + GameTeam team = getGame().GetTeam(player); + + team.SpawnTeleport(player); + + getGame().getArcadeManager().runSyncLater(() -> + { + Kit kit = null; + + for (Kit otherKit : getGame().GetKits()) + { + if (otherKit instanceof ProgressingKit) + { + ProgressingKit progressingKit = (ProgressingKit) otherKit; + + if (progressingKit.isDefault(player.getUniqueId())) + { + kit = progressingKit; + break; + } + } + } + + if (kit == null) + { + kit = getGame().GetKits()[0]; + } + + getGame().SetKit(player, kit, true); + }, 1); + } + + + @EventHandler(priority = EventPriority.LOWEST) + public void playerInteract(PlayerInteractEvent event) + { + if (_skillFunction == null) + { + return; + } + + Player player = event.getPlayer(); + + if (!_skillFunction.apply(player)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void playerInteract(EntityDamageEvent event) + { + if (_skillFunction == null || !(event.getEntity() instanceof Player)) + { + return; + } + + Player player = (Player) event.getEntity(); + + if (!_skillFunction.apply(player)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void entityDamage(CustomDamageEvent event) + { + if (!(event.GetDamageeEntity() instanceof Player)) + { + return; + } + + Player player = event.GetDamageePlayer(); + + if (!event.isCancelled()) + { + Recharge.Instance.useForce(player, RETURN_TO_SPAWN_RECHARGE, RETURN_TO_SPAWN_COOLDOWN); + } + + if (_damageFunction == null) + { + return; + } + + if (!_damageFunction.apply(player)) + { + event.SetCancelled("Training Area"); + } + } + + @EventHandler + public void giveReturnToSpawn(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + for (Player player : getGame().GetPlayers(true)) + { + if (player.getInventory().contains(RETURN_TO_SPAWN_ITEM)) + { + continue; + } + + player.getInventory().setItem(8, RETURN_TO_SPAWN_ITEM); + } + } + + @EventHandler + public void interactReturnToSpawn(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + ItemStack itemStack = player.getItemInHand(); + + if (itemStack == null || !itemStack.isSimilar(RETURN_TO_SPAWN_ITEM)) + { + return; + } + + if (event.isCancelled()) + { + player.sendMessage(F.main("Game", "You are already at the " + F.greenElem("Kit Selection Island") + ".")); + return; + } + + if (Recharge.Instance.usable(player, RETURN_TO_SPAWN_RECHARGE)) + { + getGame().RespawnPlayer(player); + } + else + { + player.sendMessage(F.main("Game", "You can't return to the " + F.greenElem("Kit Selection Island") + " if you are in " + F.greenElem("PVP") + ".")); + } + } + + private T spawnBot(Class clazz, Location location, int number) + { + try + { + T bot = clazz.getConstructor(TrainingGameModule.class, Location.class, int.class).newInstance(this, location, number); + _bots.add(bot); + return bot; + } + catch (Exception e) + { + e.printStackTrace(); + } + + return null; + } + + public TrainingGameModule setTeamFunction(Function function) + { + _teamFunction = function; + return this; + } + + public TrainingGameModule setSkillFunction(Function function) + { + _skillFunction = function; + return this; + } + + public TrainingGameModule setDamageFunction(Function function) + { + _damageFunction = function; + return this; + } + + public TrainingGameModule addBot(Class clazz) + { + _botClasses.add(clazz); + return this; + } + + private LobbyEnt getFromEntity(Entity entity) + { + for (LobbyEnt lobbyEnt : _kits) + { + if (lobbyEnt.GetEnt().equals(entity)) + { + return lobbyEnt; + } + } + + return null; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java index 3d0d4b759..1f022bd35 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java @@ -49,6 +49,11 @@ public class PerkRopedArrow extends SmashPerk @EventHandler public void Fire(PlayerInteractEvent event) { + if (event.isCancelled()) + { + return; + } + if (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) return; From 2f478e46f3bf2a05063f179828336bcfb49e9220 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 21 Apr 2017 21:53:16 +0100 Subject: [PATCH 003/170] Fix various bugs found in testing --- .../arcade/game/games/smash/SuperSmash.java | 53 ++++++++----------- .../game/games/smash/SuperSmashTraining.java | 30 ++++++++--- .../smash/events/SmashActivateEvent.java | 42 +++++++++++++++ .../game/games/smash/perks/SmashUltimate.java | 2 + .../modules/training/TrainingGameModule.java | 5 ++ 5 files changed, 93 insertions(+), 39 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index 3bcdcb304..7e607018e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -18,6 +18,7 @@ import nautilus.game.arcade.game.DebugCommand; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; import nautilus.game.arcade.game.games.smash.kits.*; import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; import nautilus.game.arcade.game.modules.compass.CompassModule; @@ -252,12 +253,12 @@ public abstract class SuperSmash extends Game @EventHandler public void triggerSuper(PlayerInteractEvent event) { - if (!IsLive()) + if (!IsLive() || !UtilEvent.isAction(event, UtilEvent.ActionType.R)) { return; } - if (event.getMaterial() != Material.NETHER_STAR) + if (event.getMaterial() != null && event.getMaterial() != Material.NETHER_STAR) { return; } @@ -276,6 +277,15 @@ public abstract class SuperSmash extends Game continue; } + SmashActivateEvent smashActivateEvent = new SmashActivateEvent(player); + + UtilServer.CallEvent(smashActivateEvent); + + if (smashActivateEvent.isCancelled()) + { + return; + } + UtilInv.remove(player, Material.NETHER_STAR, (byte) 0, 1); player.setHealth(player.getMaxHealth()); @@ -547,47 +557,19 @@ public abstract class SuperSmash extends Game @EventHandler(priority = EventPriority.LOWEST) public void abilityDescription(PlayerInteractEvent event) { - if (event.isCancelled()) - { - return; - } - Player player = event.getPlayer(); ItemStack itemStack = player.getItemInHand(); - if (itemStack == null) + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getItemMeta().getDisplayName() == null || itemStack.getItemMeta().getLore() == null || !displayKitInfo(player)) { return; } - if (itemStack.getItemMeta() == null) + if (itemStack.getType() == Material.WATCH || itemStack.getType() == Material.BED) { return; } - ItemMeta itemMeta = itemStack.getItemMeta(); - - if (itemMeta.getDisplayName() == null) - { - return; - } - - if (itemMeta.getLore() == null) - { - return; - } - - if (GetState() != GameState.Recruit) - { - return; - } - - displayKitInto(player); - event.setCancelled(true); - } - - protected void displayKitInto(Player player) - { for (int i = player.getItemInHand().getItemMeta().getLore().size(); i <= 7; i++) { UtilPlayer.message(player, ""); @@ -606,6 +588,8 @@ public abstract class SuperSmash extends Game UtilPlayer.message(player, ArcadeFormat.Line); player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 2f); + + event.setCancelled(true); } @Override @@ -725,4 +709,9 @@ public abstract class SuperSmash extends Game { return _lives; } + + protected boolean displayKitInfo(Player player) + { + return GetState() == GameState.Recruit; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java index d4e37452e..a12fd581c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -10,6 +10,7 @@ import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; import nautilus.game.arcade.game.modules.training.TrainingBot; import nautilus.game.arcade.game.modules.training.TrainingGameModule; import org.bukkit.ChatColor; @@ -36,6 +37,10 @@ public class SuperSmashTraining extends SuperSmash private Location _borderA; private Location _borderB; + private Function safeFunction = player -> + { + return !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); + }; private boolean _announceEnd; @@ -49,15 +54,11 @@ public class SuperSmashTraining extends SuperSmash DeathSpectateSecs = 0; PrepareTime = 500; GiveClock = false; - - Function playerFunction = player -> - { - return !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); - }; + HungerSet = 20; new TrainingGameModule() - .setSkillFunction(playerFunction) - .setDamageFunction(playerFunction) + .setSkillFunction(safeFunction) + .setDamageFunction(safeFunction) .addBot(TrainingBot.class) .register(this); } @@ -156,6 +157,15 @@ public class SuperSmashTraining extends SuperSmash { } + @EventHandler + public void smashActivating(SmashActivateEvent event) + { + if (!safeFunction.apply(event.getPlayer())) + { + event.setCancelled(true); + } + } + @Override public void EndCheck() { @@ -182,6 +192,12 @@ public class SuperSmashTraining extends SuperSmash return (long) (System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(2) + TimeUnit.MINUTES.toMillis(2) * Math.random()); } + @Override + protected boolean displayKitInfo(Player player) + { + return super.displayKitInfo(player) || !safeFunction.apply(player); + } + private void spawnInfoHologram(Location location) { CreatureAllowOverride = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java new file mode 100644 index 000000000..44b89f7ef --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java @@ -0,0 +1,42 @@ +package nautilus.game.arcade.game.games.smash.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; + +public class SmashActivateEvent extends PlayerEvent implements Cancellable +{ + + private static final HandlerList HANDLERS = new HandlerList(); + + private boolean _cancelled; + + public SmashActivateEvent(Player who) + { + super(who); + } + + @Override + public boolean isCancelled() + { + return _cancelled; + } + + @Override + public void setCancelled(boolean b) + { + _cancelled = b; + } + + public HandlerList getHandlers() + { + return HANDLERS; + } + + public static HandlerList getHandlerList() + { + return HANDLERS; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java index 8bddb995c..7fbee53c9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import mineplex.core.common.util.UtilServer; +import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java index e3c19bf3f..4f83b37f1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java @@ -284,6 +284,11 @@ public class TrainingGameModule extends Module if (!event.isCancelled()) { Recharge.Instance.useForce(player, RETURN_TO_SPAWN_RECHARGE, RETURN_TO_SPAWN_COOLDOWN); + + if (event.GetDamagerEntity(true) instanceof Player) + { + Recharge.Instance.useForce(event.GetDamagerPlayer(true), RETURN_TO_SPAWN_RECHARGE, RETURN_TO_SPAWN_COOLDOWN); + } } if (_damageFunction == null) From e350c62f540c72f41066efabc1ffea46154ba020 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 22 Apr 2017 23:07:44 +0100 Subject: [PATCH 004/170] Iron Golem and Skeleton converted to Google Sheets --- .../nautilus/game/arcade/ArcadeManager.java | 9 + .../src/nautilus/game/arcade/game/Game.java | 135 +++++-------- .../arcade/game/games/smash/SuperSmash.java | 5 +- .../game/games/smash/SuperSmashTraining.java | 48 +++-- .../game/games/smash/kits/KitGolem.java | 4 +- .../game/games/smash/kits/KitSkeleton.java | 12 +- .../games/smash/perks/PerkSmashStats.java | 88 ++++++--- .../game/games/smash/perks/SmashUltimate.java | 24 ++- .../games/smash/perks/golem/PerkFissure.java | 10 +- .../games/smash/perks/golem/SmashGolem.java | 25 ++- .../smash/perks/skeleton/PerkBarrage.java | 16 ++ .../perks/skeleton/PerkBoneExplosion.java | 25 ++- .../smash/perks/skeleton/SmashSkeleton.java | 18 +- .../src/nautilus/game/arcade/kit/Perk.java | 144 ++++++++++++-- .../game/arcade/kit/perks/PerkDoubleJump.java | 15 +- .../game/arcade/kit/perks/PerkFletcher.java | 17 +- .../game/arcade/kit/perks/PerkIronHook.java | 15 +- .../arcade/kit/perks/PerkKnockbackArrow.java | 22 ++- .../game/arcade/kit/perks/PerkRopedArrow.java | 25 ++- .../arcade/kit/perks/PerkSeismicSlam.java | 30 ++- .../managers/PerkSpreadsheetModule.java | 180 ++++++++++++++++++ .../googlesheets/GoogleSheetController.java | 22 ++- .../googlesheets/SpreadsheetType.java | 3 +- 23 files changed, 652 insertions(+), 240 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index af4d8cea5..6644d927d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.ArrayList; import java.util.HashSet; +import mineplex.core.google.GoogleSheetsManager; import net.minecraft.server.v1_8_R3.EntityLiving; import org.bukkit.Bukkit; @@ -233,6 +234,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation private ScoreboardManager _scoreboardManager; private NextBestGameManager _nextBestGameManager; private TrackManager _trackManager; + private GoogleSheetsManager _sheetsManager; private IncognitoManager _incognitoManager; @@ -578,6 +580,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation _trackManager = require(TrackManager.class); _titles = require(Titles.class); Titles.BOOK_SLOT = 4; + + _sheetsManager = require(GoogleSheetsManager.class); } @Override @@ -790,6 +794,11 @@ public class ArcadeManager extends MiniPlugin implements IRelation return _customDataManager; } + public GoogleSheetsManager getSheetsManager() + { + return _sheetsManager; + } + public ChatColor GetColor(Player player) { if (_game == null) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 89fe831d5..8fa799ffb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -1,27 +1,52 @@ package nautilus.game.arcade.game; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - +import com.google.common.collect.Lists; +import com.mojang.authlib.GameProfile; +import mineplex.core.Managers; +import mineplex.core.antihack.AntiHack; +import mineplex.core.arcadeevents.CoreGameStartEvent; +import mineplex.core.arcadeevents.CoreGameStopEvent; +import mineplex.core.command.CommandCenter; +import mineplex.core.common.Rank; +import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguisePlayer; +import mineplex.core.elo.EloPlayer; +import mineplex.core.elo.EloTeam; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.lifetimes.Lifetimed; +import mineplex.core.lifetimes.ListenerComponent; +import mineplex.core.lifetimes.PhasedLifetime; +import mineplex.core.packethandler.IPacketHandler; +import mineplex.core.packethandler.PacketInfo; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilGameProfile; +import mineplex.minecraft.game.classcombat.event.ClassCombatCreatureAllowSpawnEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerGameRespawnEvent; +import nautilus.game.arcade.events.PlayerStateChangeEvent; +import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.game.games.build.Build; +import nautilus.game.arcade.game.games.draw.Draw; +import nautilus.game.arcade.game.games.speedbuilders.SpeedBuilders; +import nautilus.game.arcade.game.modules.AntiExpOrbModule; +import nautilus.game.arcade.game.modules.Module; +import nautilus.game.arcade.kit.*; +import nautilus.game.arcade.managers.chat.ChatStatData; +import nautilus.game.arcade.managers.lobby.LobbyManager; +import nautilus.game.arcade.scoreboard.GameScoreboard; +import nautilus.game.arcade.stats.*; +import nautilus.game.arcade.wineffect.WinEffectManager; +import nautilus.game.arcade.world.WorldData; import net.minecraft.server.v1_8_R3.EntityItem; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; - import org.apache.commons.lang3.tuple.Triple; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; @@ -41,79 +66,12 @@ import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; -import com.google.common.collect.Lists; -import com.mojang.authlib.GameProfile; - -import mineplex.core.Managers; -import mineplex.core.antihack.AntiHack; -import mineplex.core.arcadeevents.CoreGameStartEvent; -import mineplex.core.arcadeevents.CoreGameStopEvent; -import mineplex.core.command.CommandCenter; -import mineplex.core.common.Rank; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTabTitle; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.common.util.UtilTime; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.elo.EloPlayer; -import mineplex.core.elo.EloTeam; -import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.lifetimes.Lifetimed; -import mineplex.core.lifetimes.ListenerComponent; -import mineplex.core.lifetimes.PhasedLifetime; -import mineplex.core.packethandler.IPacketHandler; -import mineplex.core.packethandler.PacketInfo; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.utils.UtilGameProfile; -import mineplex.minecraft.game.classcombat.event.ClassCombatCreatureAllowSpawnEvent; -import mineplex.minecraft.game.core.combat.DeathMessageType; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; - -import nautilus.game.arcade.ArcadeFormat; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.events.PlayerGameRespawnEvent; -import nautilus.game.arcade.events.PlayerStateChangeEvent; -import nautilus.game.arcade.game.GameTeam.PlayerState; -import nautilus.game.arcade.game.games.build.Build; -import nautilus.game.arcade.game.games.draw.Draw; -import nautilus.game.arcade.game.games.speedbuilders.SpeedBuilders; -import nautilus.game.arcade.game.modules.AntiExpOrbModule; -import nautilus.game.arcade.game.modules.Module; -import nautilus.game.arcade.kit.ChampionsKit; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.KitAvailability; -import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.ProgressingKit; -import nautilus.game.arcade.managers.chat.ChatStatData; -import nautilus.game.arcade.managers.lobby.LobbyManager; -import nautilus.game.arcade.scoreboard.GameScoreboard; -import nautilus.game.arcade.stats.AssistsStatTracker; -import nautilus.game.arcade.stats.DamageDealtStatTracker; -import nautilus.game.arcade.stats.DamageTakenStatTracker; -import nautilus.game.arcade.stats.DeathsStatTracker; -import nautilus.game.arcade.stats.ExperienceStatTracker; -import nautilus.game.arcade.stats.GamesPlayedStatTracker; -import nautilus.game.arcade.stats.KillsStatTracker; -import nautilus.game.arcade.stats.LoseStatTracker; -import nautilus.game.arcade.stats.StatTracker; -import nautilus.game.arcade.stats.WinStatTracker; -import nautilus.game.arcade.wineffect.WinEffectManager; -import nautilus.game.arcade.world.WorldData; +import java.util.*; +import java.util.Map.Entry; public abstract class Game extends ListenerComponent implements Lifetimed { @@ -2460,7 +2418,6 @@ public abstract class Game extends ListenerComponent implements Lifetimed public void cleanupCommands() { this._debugCommands.forEach(command -> CommandCenter.Instance.removeCommand(command)); - this._debugCommands.clear(); } public T getModule(Class clazz) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index 7e607018e..3d2f3f2f0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -24,6 +24,7 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.managers.PerkSpreadsheetModule; import org.bukkit.*; import org.bukkit.FireworkEffect.Type; import org.bukkit.block.Block; @@ -39,7 +40,6 @@ import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashMap; @@ -89,10 +89,13 @@ public abstract class SuperSmash extends Game WorldWaterDamage = 1000; HideTeamSheep = true; ReplaceTeamsWithKits = true; + new CompassModule() .setGiveCompassToAlive(true) .register(this); + new PerkSpreadsheetModule(this, "SMASH_KITS"); + registerDebugCommand(new DebugCommand("cooldown", Rank.ADMIN) { @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java index a12fd581c..7ca13623e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -19,15 +19,18 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.PlayerDeathEvent; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.function.Function; public class SuperSmashTraining extends SuperSmash { - private static final long GAME_TIME = TimeUnit.HOURS.toMillis(3); - private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(5); + private static final long GAME_TIME = TimeUnit.MINUTES.toMillis(3); + private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(1); private static final String[] INFO_HOLOGRAM = { C.cYellow + "Select a " + C.cGreen + "Kit", C.cYellow + "Jump off the island to use your abilities", @@ -37,10 +40,8 @@ public class SuperSmashTraining extends SuperSmash private Location _borderA; private Location _borderB; - private Function safeFunction = player -> - { - return !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); - }; + private Function _safeFunction = player -> !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); + private Map _lastDeath; private boolean _announceEnd; @@ -56,9 +57,11 @@ public class SuperSmashTraining extends SuperSmash GiveClock = false; HungerSet = 20; + _lastDeath = new HashMap<>(); + new TrainingGameModule() - .setSkillFunction(safeFunction) - .setDamageFunction(safeFunction) + .setSkillFunction(_safeFunction) + .setDamageFunction(_safeFunction) .addBot(TrainingBot.class) .register(this); } @@ -155,12 +158,30 @@ public class SuperSmashTraining extends SuperSmash @EventHandler public void playerDeath(PlayerDeathEvent event) { + _lastDeath.put(event.getEntity().getUniqueId(), System.currentTimeMillis()); } @EventHandler - public void smashActivating(SmashActivateEvent event) + public void cleanlastDeath(UpdateEvent event) { - if (!safeFunction.apply(event.getPlayer())) + if (!IsLive() || event.getType() != UpdateType.FAST) + { + return; + } + + for (Player player : GetPlayers(true)) + { + if (_safeFunction.apply(player)) + { + _lastDeath.remove(player.getUniqueId()); + } + } + } + + @EventHandler + public void smashActivate(SmashActivateEvent event) + { + if (!_safeFunction.apply(event.getPlayer())) { event.setCancelled(true); } @@ -195,7 +216,12 @@ public class SuperSmashTraining extends SuperSmash @Override protected boolean displayKitInfo(Player player) { - return super.displayKitInfo(player) || !safeFunction.apply(player); + if (_lastDeath.containsKey(player.getUniqueId())) + { + return UtilTime.elapsed(_lastDeath.get(player.getUniqueId()), 2000); + } + + return super.displayKitInfo(player) || !_safeFunction.apply(player); } private void spawnInfoHologram(Location location) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java index 00c38f95f..649a3c072 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java @@ -27,8 +27,8 @@ public class KitGolem extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(7, 1.0, 0.2, 8), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSlow(0), new PerkFissure(), new PerkIronHook(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java index 07f123e5b..8237cf19a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java @@ -35,13 +35,13 @@ public class KitSkeleton extends SmashKit private static double ARROW_DAMAGE = 6; private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.25, 0.2, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkFletcher(3, 3, false), - new PerkKnockbackArrow(1.5), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), new PerkBoneExplosion(), - new PerkRopedArrow("Roped Arrow", 1, 5000), - new PerkBarrage(5, 300, true, false, true), + new PerkRopedArrow("Roped Arrow"), + new PerkBarrage(), new SmashSkeleton() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java index 2b5d00808..a545ca357 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java @@ -17,67 +17,99 @@ public class PerkSmashStats extends Perk private double _damage; private double _knockbackTaken; private double _regen; - - public PerkSmashStats(double damage, double knockbackTaken, double regen, double armor) + private double _armor; + + public PerkSmashStats() { - super("Smash Stats", new String[] - { - - (C.cAqua + "Damage: " + C.cWhite + damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int)(knockbackTaken*100) + "%"), - (C.cAqua + "Armor: " + C.cWhite + armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + regen + " per Second"), - }); - + super("Smash Stats"); + } + + public PerkSmashStats(double damage, double knockbackTaken, double regen, double armor) + { + super("Smash Stats", new String[]{}); + _damage = damage; _knockbackTaken = knockbackTaken; _regen = regen; - } - + _armor = armor; + + setDesc( + (C.cAqua + "Damage: " + C.cWhite + _damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int) (_knockbackTaken * 100) + "%"), + (C.cAqua + "Armor: " + C.cWhite + _armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + _regen + " per Second") + ); + } + + @Override + public void setupValues() + { + _damage = getPerkDouble("Damage"); + _knockbackTaken = getPerkPercentage("Knockback Taken"); + _regen = getPerkDouble("Regeneration"); + _armor = getPerkDouble("Armor"); + + setDesc( + (C.cAqua + "Damage: " + C.cWhite + _damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int) (_knockbackTaken * 100) + "%"), + (C.cAqua + "Armor: " + C.cWhite + _armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + _regen + " per Second") + ); + } + @EventHandler(priority = EventPriority.HIGH) public void Damage(CustomDamageEvent event) { if (event.GetCause() != DamageCause.ENTITY_ATTACK) + { return; - + } + Player damager = event.GetDamagerPlayer(false); - if (damager == null) return; - - if (!Kit.HasKit(damager)) + + if (damager == null || !Kit.HasKit(damager) || !Manager.IsAlive(damager)) + { return; - - if (!Manager.IsAlive(damager)) - return; - + } + double mod = _damage - event.GetDamageInitial(); - + event.AddMod(damager.getName(), "Attack", mod, true); } - + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { Player damagee = event.GetDamageePlayer(); - if (damagee == null) return; - + if (damagee == null) + { + return; + } + if (!Kit.HasKit(damagee)) + { return; - + } + if (!Manager.IsAlive(damagee)) + { return; - + } + event.AddKnockback("Knockback Multiplier", _knockbackTaken); } - + @EventHandler public void Regeneration(UpdateEvent event) { if (event.getType() != UpdateType.SEC) + { return; - + } + for (Player player : Manager.GetGame().GetPlayers(true)) { if (!Kit.HasKit(player)) + { continue; - + } + UtilPlayer.health(player, _regen); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java index 7fbee53c9..cb0c4f566 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java @@ -1,17 +1,5 @@ package nautilus.game.arcade.game.games.smash.perks; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import mineplex.core.common.util.UtilServer; -import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; - import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; @@ -19,10 +7,14 @@ import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; - import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.kit.Perk; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import java.util.*; public class SmashUltimate extends Perk { @@ -42,6 +34,12 @@ public class SmashUltimate extends Perk _length = length; } + @Override + public void setupValues() + { + _length = getPerkTime("Duration", _length); + } + public void activate(Player player) { _lastUltimate.put(player.getUniqueId(), System.currentTimeMillis()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java index ad8cd2688..e625809ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java @@ -24,7 +24,7 @@ import nautilus.game.arcade.kit.perks.data.FissureData; public class PerkFissure extends Perk { - private static final int COOLDOWN = 8000; + private int _cooldown; private Set _active = new HashSet<>(); @@ -33,6 +33,12 @@ public class PerkFissure extends Perk super("Fissure", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Fissure" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -69,7 +75,7 @@ public class PerkFissure extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java index a92739364..0cfd4b163 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java @@ -25,14 +25,23 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashGolem extends SmashUltimate { - private static final int DURATION = 16000; - private static final int HIT_FREQUENCY = 400; - private static final int DAMAGE_RADIUS = 2; - private static final int EFFECT_RADIUS = 5; + private int _hitFrequency; + private int _damageRadius; + private int _effectRadius; public SmashGolem() { - super("Earthquake", new String[] {}, Sound.IRONGOLEM_HIT, DURATION); + super("Earthquake", new String[] {}, Sound.IRONGOLEM_HIT, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _effectRadius = getPerkInt("Effect Radius"); } @Override @@ -71,7 +80,7 @@ public class SmashGolem extends SmashUltimate boolean grounded = false; - for (Block block : UtilBlock.getInRadius(other.getLocation(), DAMAGE_RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(other.getLocation(), _damageRadius).keySet()) { if (block.getType() != Material.AIR) { @@ -89,13 +98,13 @@ public class SmashGolem extends SmashUltimate Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, 1 + 2 * Math.random(), false, false, false, other.getName(), GetName()); // Velocity - if (Recharge.Instance.use(other, GetName() + " Hit", HIT_FREQUENCY, false, false)) + if (Recharge.Instance.use(other, GetName() + " Hit", _hitFrequency, false, false)) { UtilAction.velocity(other, new Vector(Math.random() - 0.5, Math.random() * 0.2, Math.random() - 0.5), Math.random() * 1 + 1, false, 0, 0.1 + Math.random() * 0.2, 2, true); } // Effect - for (Block block : UtilBlock.getInRadius(other.getLocation(), EFFECT_RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(other.getLocation(), _effectRadius).keySet()) { if (Math.random() < 0.98) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java index d8089da13..8dc18f5ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java @@ -33,6 +33,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import org.jooq.util.derby.sys.Sys; public class PerkBarrage extends SmashPerk { @@ -48,6 +49,11 @@ public class PerkBarrage extends SmashPerk private boolean _noDelay; private boolean _useExp; + public PerkBarrage() + { + this(0, 0, false, false); + } + public PerkBarrage(int max, int tick, boolean remove, boolean noDelay) { this(max, tick, remove, noDelay, false); @@ -63,6 +69,16 @@ public class PerkBarrage extends SmashPerk _noDelay = noDelay; } + @Override + public void setupValues() + { + _max = getPerkInt("Max", _max); + _tick = getPerkInt("Tick", _tick); + _remove = getPerkBoolean("Remove", _remove); + _noDelay = getPerkBoolean("No Delay", _noDelay); + _useExp = getPerkBoolean("Exp Bar", _useExp); + } + @EventHandler public void BarrageDrawBow(PlayerInteractEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java index 5fe9a20db..37f301290 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java @@ -23,16 +23,25 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBoneExplosion extends SmashPerk { - private static final int COOLDOWN = 10000; - private static final int DAMAGE_RADIUS = 7; - private static final int DAMAGE = 6; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _damageRadius; + private int _damage; + private float _knockbackMagnitude; public PerkBoneExplosion() { super("Bone Explosion", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Bone Explosion" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -68,12 +77,12 @@ public class PerkBoneExplosion extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } - Map nearby = UtilPlayer.getInRadius(player.getLocation(), DAMAGE_RADIUS); + Map nearby = UtilPlayer.getInRadius(player.getLocation(), _damageRadius); for (Player other : nearby.keySet()) { @@ -86,7 +95,7 @@ public class PerkBoneExplosion extends SmashPerk UtilPlayer.message(other, F.main("Game", F.elem(Manager.GetColor(player) + player.getName()) + " used " + F.skill(GetName()) + ".")); // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * nearby.get(other), true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * nearby.get(other), true, true, false, player.getName(), GetName()); } // Inform @@ -104,6 +113,6 @@ public class PerkBoneExplosion extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java index bb86fdbcf..1e5e9c635 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java @@ -20,14 +20,12 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSkeleton extends SmashUltimate { - - private static final int DURATION = 10000; - - private Set _arrows = new HashSet(); + + private Set _arrows = new HashSet<>(); public SmashSkeleton() { - super("Arrow Storm", new String[] {}, Sound.SKELETON_HURT, DURATION); + super("Arrow Storm", new String[] {}, Sound.SKELETON_HURT, 0); } @EventHandler @@ -71,15 +69,7 @@ public class SmashSkeleton extends SmashUltimate { return; } - - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Projectile arrow = arrowIterator.next(); - if (arrow.isDead() || !arrow.isValid()) - { - arrowIterator.remove(); - } - } + _arrows.removeIf(arrow -> arrow.isDead() || !arrow.isValid()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java index 18a51d276..0b26d69b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java @@ -1,9 +1,7 @@ package nautilus.game.arcade.kit; import nautilus.game.arcade.ArcadeManager; - -import org.bukkit.Bukkit; -import org.bukkit.Material; +import nautilus.game.arcade.managers.PerkSpreadsheetModule; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -17,57 +15,79 @@ public abstract class Perk implements Listener private boolean _display; private int _upgradeLevel; - + + private PerkSpreadsheetModule _spreadsheet; + + public Perk(String name) + { + this(name, new String[0], true); + } + public Perk(String name, String[] perkDesc) { this(name, perkDesc, true); } - + public Perk(String name, String[] perkDesc, boolean display) { _perkName = name; _perkDesc = perkDesc; _display = display; } - + public boolean hasPerk(Player player) - { + { if (Manager.GetGame() == null) { return false; } - + if (!Manager.GetGame().IsLive()) { return false; } - + if (!(Kit instanceof ProgressingKit)) { return Kit.HasKit(player); } - + ProgressingKit progressingKit = (ProgressingKit) Kit; - + return Kit.HasKit(player) && progressingKit.getUpgradeLevel(player.getUniqueId()) == _upgradeLevel; } - + public void setUpgradeLevel(int upgradeLevel) { _upgradeLevel = upgradeLevel; } - + public void SetHost(Kit kit) { Manager = kit.Manager; Kit = kit; } + public final void setSpreadsheet(PerkSpreadsheetModule spreadsheet) + { + _spreadsheet = spreadsheet; + setupValues(); + } + + public void setupValues() + { + } + public String GetName() - { + { return _perkName; } - + + public void setDesc(String... desc) + { + _perkDesc = desc; + } + public String[] GetDesc() { return _perkDesc; @@ -77,8 +97,8 @@ public abstract class Perk implements Listener { return _display; } - - public void Apply(Player player) + + public void Apply(Player player) { //Null Default } @@ -93,8 +113,92 @@ public abstract class Perk implements Listener // When listener has been registered } - public Material getIcon() + private String getPerkObject(String id) { - return Material.SLIME_BALL; + String key = _spreadsheet.getKey(this, id); + + if (!_spreadsheet.getDataMap().containsKey(key)) + { + return null; + } + + return _spreadsheet.getDataMap().get(key); } -} + + protected boolean getPerkBoolean(String id) + { + return Boolean.valueOf(getPerkObject(id)); + } + + protected int getPerkInt(String id) + { + return Integer.parseInt(getPerkObject(id)); + } + + protected double getPerkDouble(String id) + { + return Double.parseDouble(getPerkObject(id)); + } + + protected float getPerkFloat(String id) + { + return Float.parseFloat(getPerkObject(id)); + } + + protected double getPerkPercentage(String id) + { + String value = getPerkObject(id); + value = value.substring(0, value.length() - 1); + double doubleValue = Double.parseDouble(value); + return doubleValue / 100; + } + + protected int getPerkTime(String id) + { + return getPerkInt(id) * 1000; + } + + protected boolean getPerkBoolean(String id, boolean defaultV) + { + String v = getPerkObject(id); + return v != null ? Boolean.valueOf(v) : defaultV; + } + + protected int getPerkInt(String id, int defaultV) + { + String v = getPerkObject(id); + return v != null ? Integer.valueOf(v) : defaultV; + } + + protected double getPerkDouble(String id, double defaultV) + { + String v = getPerkObject(id); + return v != null ? Double.valueOf(v) : defaultV; + } + + protected double getPerkFloat(String id, float defaultV) + { + String v = getPerkObject(id); + return v != null ? Float.valueOf(v) : defaultV; + } + + protected double getPerkPercentage(String id, double defaultV) + { + String value = getPerkObject(id); + + if (value == null) + { + return defaultV; + } + + value = value.substring(0, value.length() - 1); + double doubleValue = Double.parseDouble(value); + return doubleValue / 100; + } + + protected int getPerkTime(String id, int defaultV) + { + int v = getPerkInt(id, Integer.MIN_VALUE); + return v == Integer.MIN_VALUE ? defaultV : v * 1000; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java index 1af48f4f8..415a2060b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java @@ -29,7 +29,12 @@ public class PerkDoubleJump extends Perk private boolean _displayForce; private HashSet _disabled = new HashSet(); - + + public PerkDoubleJump(String name) + { + this(name, 0, 0, false); + } + public PerkDoubleJump(String name, double power, double heightLimit, boolean control) { super(name, new String[] @@ -70,6 +75,14 @@ public class PerkDoubleJump extends Perk _displayForce = displayForce; } + @Override + public void setupValues() + { + _power = getPerkDouble("Power", _power); + _heightMax = getPerkDouble("Height Limit", _heightMax); + _control = getPerkBoolean("Control", _control); + } + @EventHandler public void FlightHop(PlayerToggleFlightEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java index 3867996c0..98db019eb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java @@ -39,7 +39,12 @@ public class PerkFletcher extends Perk private int _slot; private boolean _instant = true; private String _name; - + + public PerkFletcher() + { + this(0, 0, false); + } + public PerkFletcher(int time, int max, boolean remove) { this(time, max, remove, -1); @@ -75,6 +80,16 @@ public class PerkFletcher extends Perk _name = name; } + @Override + public void setupValues() + { + _time = getPerkInt("Time", _time); + _max = getPerkInt("Max", _max); + _remove = getPerkBoolean("Remove", _remove); + + setDesc("Receive 1 Arrow every " + _time + " seconds. Maximum of " + _max + "."); + } + public boolean isFletchedArrow(ItemStack stack) { if (!UtilGear.isMat(stack, Material.ARROW)) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java index 1f9f786f4..1b86acc73 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java @@ -31,14 +31,21 @@ import nautilus.game.arcade.kit.Perk; public class PerkIronHook extends Perk implements IThrown { - private static final long COOLDOWN = 8000; - private static final int DAMAGE = 4; + private long _cooldown; + private int _damage; public PerkIronHook() { super("Iron Hook", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Pickaxe to " + C.cGreen + "Iron Hook" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -69,7 +76,7 @@ public class PerkIronHook extends Perk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -118,7 +125,7 @@ public class PerkIronHook extends Perk implements IThrown Manager.GetCondition().Factory().Falling(GetName(), target, player, 10, false, true); // Damage Event - Manager.GetDamage().NewDamageEvent(target, player, null, DamageCause.CUSTOM, velocity * DAMAGE, false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(target, player, null, DamageCause.CUSTOM, velocity * _damage, false, true, false, player.getName(), GetName()); // Inform UtilPlayer.message(target, F.main("Skill", F.name(player.getName()) + " hit you with " + F.skill(GetName()) + ".")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java index 26f9979a0..403560712 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java @@ -12,17 +12,27 @@ import nautilus.game.arcade.kit.Perk; public class PerkKnockbackArrow extends Perk { private double _power; - + + public PerkKnockbackArrow() + { + this(0); + } + public PerkKnockbackArrow(double power) { - super("Arrow Knockback", new String[] - { - C.cGray + "Arrows deal " + (int)(power*100) + "% Knockback.", - }); + super("Knockback Arrow"); _power = power; } - + + @Override + public void setupValues() + { + _power = getPerkPercentage("Power", _power); + + setDesc(C.cGray + "Arrows deal " + (int)(_power * 100) + "% Knockback."); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java index 1f022bd35..2a206a065 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java @@ -1,7 +1,6 @@ package nautilus.game.arcade.kit.perks; import java.util.HashSet; -import java.util.Iterator; import org.bukkit.Material; import org.bukkit.Sound; @@ -32,9 +31,14 @@ public class PerkRopedArrow extends SmashPerk private String _name; private double _power; - private long _recharge; + private int _recharge; - public PerkRopedArrow(String name, double power, long recharge) + public PerkRopedArrow(String name) + { + this(name, 0, 0); + } + + public PerkRopedArrow(String name, double power, int recharge) { super(name, new String[] { @@ -46,6 +50,13 @@ public class PerkRopedArrow extends SmashPerk _recharge = recharge; } + @Override + public void setupValues() + { + _power = getPerkDouble("Power", _power); + _recharge = getPerkTime("Cooldown", _recharge); + } + @EventHandler public void Fire(PlayerInteractEvent event) { @@ -111,12 +122,6 @@ public class PerkRopedArrow extends SmashPerk if (event.getType() != UpdateType.SEC) return; - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Entity arrow = arrowIterator.next(); - - if (!arrow.isValid()) - arrowIterator.remove(); - } + _arrows.removeIf(arrow -> !arrow.isValid()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java index 9b93d6fe8..db45b760e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java @@ -34,11 +34,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkSeismicSlam extends Perk { - private static final long COOLDOWN = 7000; - private static final long TIME = 1000; - private static final int DAMAGE = 10; - private static final int RADIUS = 8; - private static final float KNOCKBACK_MAGNITUDE = 2.4F; + private long _cooldown; + private long _time; + private int _damage; + private int _radius; + private float _knockbackMagnitude; private Map _live = new HashMap<>(); @@ -47,6 +47,16 @@ public class PerkSeismicSlam extends Perk super("Seismic Slam", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Seismic Slam" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _time = getPerkTime("Time"); + _damage = getPerkInt("Damage"); + _radius = getPerkInt("Radius"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void deactivateDeath(PlayerDeathEvent event) { @@ -93,7 +103,7 @@ public class PerkSeismicSlam extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) return; // Action @@ -132,7 +142,7 @@ public class PerkSeismicSlam extends Perk continue; } - if (!UtilTime.elapsed(_live.get(player), TIME)) + if (!UtilTime.elapsed(_live.get(player), _time)) { continue; } @@ -141,7 +151,7 @@ public class PerkSeismicSlam extends Perk // Action - Map targets = UtilEnt.getInRadius(player.getLocation(), RADIUS); + Map targets = UtilEnt.getInRadius(player.getLocation(), _radius); for (LivingEntity cur : targets.keySet()) { @@ -156,7 +166,7 @@ public class PerkSeismicSlam extends Perk } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 0.5, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 0.5, true, true, false, player.getName(), GetName()); // Condition Manager.GetCondition().Factory().Falling(GetName(), cur, player, 10, false, true); @@ -187,6 +197,6 @@ public class PerkSeismicSlam extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java new file mode 100644 index 000000000..7eec2ff42 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java @@ -0,0 +1,180 @@ +package nautilus.game.arcade.managers; + +import mineplex.core.common.Pair; +import mineplex.core.common.util.UtilServer; +import mineplex.core.google.GoogleSheetsManager; +import mineplex.core.google.SheetObjectDeserialiser; +import mineplex.core.slack.SlackAPI; +import mineplex.core.slack.SlackMessage; +import mineplex.core.slack.SlackTeam; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PerkSpreadsheetModule implements Listener +{ + + private static final String SLACK_CHANNEL_NAME = "#google-sheet-errors"; + private static final String SLACK_USERNAME = "Google Sheets"; + private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/google-sheets-image.png"; + private static boolean _reportedError; + + private static final SheetObjectDeserialiser> DESERIALISER = values -> Pair.create(values[0], values.length == 1 ? "" : values[1]); + + private final Game _game; + private final Map _dataMap; + private final String _fileName; + + public PerkSpreadsheetModule(Game game, String fileName) + { + _game = game; + _fileName = fileName; + + _dataMap = new HashMap<>(); + + UtilServer.RegisterEvents(this); + + setup(); + } + + @EventHandler + public void cleanup(GameStateChangeEvent event) + { + if (event.GetState() != Game.GameState.End) + { + return; + } + + UtilServer.Unregister(this); + } + + private void setup() + { + // File Name must not be null + Objects.requireNonNull(_fileName); + + GoogleSheetsManager manager = _game.getArcadeManager().getSheetsManager(); + + Map>> map = manager.getSheetData(_fileName); + + for (Map.Entry>> entry : map.entrySet()) + { + String key = entry.getKey(); + List> value = entry.getValue(); + + Kit kit = getFromName(key); + + if (kit == null) + { + manager.log("No kit found for the name " + key); + continue; + } + + Perk currentPerk = null; + + for (List rows : value) + { + try + { + Pair pair = DESERIALISER.deserialise(rows.toArray(new String[0])); + + Perk perk = getFromName(kit, pair.getLeft()); + + if (perk != null) + { + currentPerk = perk; + continue; + } + + if (currentPerk != null) + { + String id = getKey(currentPerk, pair.getLeft()); + _dataMap.put(id, pair.getRight()); + } + } + catch (Exception e) + { + // Continue the loop + } + } + } + + for (Kit kit : _game.GetKits()) + { + for (Perk perk : kit.GetPerks()) + { + perk.setSpreadsheet(this); + } + } + } + + private Kit getFromName(String name) + { + for (Kit kit : _game.GetKits()) + { + if (kit.GetName().equalsIgnoreCase(name)) + { + return kit; + } + } + + return null; + } + + private Perk getFromName(Kit kit, String name) + { + for (Perk perk : kit.GetPerks()) + { + if (perk.GetName().equalsIgnoreCase(name)) + { + return perk; + } + } + + return null; + } + + public String getKey(Perk perk, String value) + { + return perk.GetName() + "." + value; + } + + public Map getDataMap() + { + return _dataMap; + } + + public void reportError(Exception exception, String sheetName, String dataKey) + { + // Only allow one error report per lifetime, as the game causes an infinite loop. + if (_reportedError) + { + return; + } + + _reportedError = true; + + String message = "A parsing error has occurred on spreadsheet *" + sheetName + "* with data key *" + dataKey + "*.\n Details: " + exception.getMessage(); + + System.out.println(message); + try + { + SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), message), true); + } + catch (MalformedURLException e) + { + e.printStackTrace(); + } + } + +} diff --git a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java index f6244df65..0c96d03b8 100644 --- a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java +++ b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java @@ -14,11 +14,23 @@ public class GoogleSheetController public static void main(String[] args) throws InterruptedException { + String sheetToRead = System.getProperty("sheet"); + SpreadsheetType[] types; + + if (sheetToRead == null) + { + types = SpreadsheetType.values(); + } + else + { + types = new SpreadsheetType[]{SpreadsheetType.valueOf(sheetToRead)}; + } + System.out.println("Loading Sheet Provider"); SheetProvider provider = new SheetProvider(); System.out.println("Loaded Sheet Provider"); - for (SpreadsheetType type : SpreadsheetType.values()) + for (SpreadsheetType type : types) { System.out.println("Sleeping..."); Thread.sleep(SLEEP_TIME); @@ -28,10 +40,10 @@ public class GoogleSheetController System.out.println("Done"); System.out.println("Saving to file..."); - + File dir = new File(DATA_STORE_DIR); File file = new File(dir + File.separator + type.name() + ".json"); - + if (!dir.exists()) { System.out.println("mkdir"); @@ -44,12 +56,12 @@ public class GoogleSheetController file.delete(); System.out.println("new File"); file.createNewFile(); - + FileWriter writer = new FileWriter(file); System.out.println("Writing"); writer.write(object.toString()); - + System.out.println("Closing..."); writer.close(); } diff --git a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java index af2acf11c..953d4be08 100644 --- a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java +++ b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java @@ -8,11 +8,12 @@ public enum SpreadsheetType GEM_HUNTERS_CHESTS("11Noztgbpu_gUKkc5F4evKKfyxS-Jv1coE0IrBToX_gg"), GEM_HUNTERS_SHOP("1OcYktxVZaW6Fm29Zh6w4Lb-UVyuN8r1x-TFb_3USYYI"), + SMASH_KITS("1Z_SLBzjiIVqu25PMGw9TwNKR3wd9Y9sX7rSDBl_rpxk") ; private String _id; - private SpreadsheetType(String id) + SpreadsheetType(String id) { _id = id; } From 1d7fb77bc43fd2a714ac4379d4069a6e3891e066 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 22 Apr 2017 23:10:08 +0100 Subject: [PATCH 005/170] Deleted some code by accident --- .../src/nautilus/game/arcade/game/Game.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 8fa799ffb..01136f60d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -2417,7 +2417,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public void cleanupCommands() { - this._debugCommands.forEach(command -> CommandCenter.Instance.removeCommand(command)); + _debugCommands.forEach(command -> CommandCenter.Instance.removeCommand(command)); + _debugCommands.clear(); } public T getModule(Class clazz) From 43d703d9b7c44457f8a79db36862a670dfa1eea9 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 22 Apr 2017 23:53:01 +0100 Subject: [PATCH 006/170] Spider converted to Google Sheets --- .../game/games/smash/SuperSmashTraining.java | 4 ++-- .../game/games/smash/kits/KitSpider.java | 2 +- .../games/smash/perks/spider/PerkNeedler.java | 23 +++++++++++++------ .../smash/perks/spider/PerkSpiderLeap.java | 21 +++++++++++------ .../games/smash/perks/spider/PerkWebShot.java | 18 +++++++++++---- .../games/smash/perks/spider/SmashSpider.java | 8 +++---- 6 files changed, 49 insertions(+), 27 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java index 7ca13623e..514e60b7d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -29,8 +29,8 @@ import java.util.function.Function; public class SuperSmashTraining extends SuperSmash { - private static final long GAME_TIME = TimeUnit.MINUTES.toMillis(3); - private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(1); + private static final long GAME_TIME = TimeUnit.HOURS.toMillis(3); + private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(5); private static final String[] INFO_HOLOGRAM = { C.cYellow + "Select a " + C.cGreen + "Kit", C.cYellow + "Jump off the island to use your abilities", diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java index 67cac165b..343ad990b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java @@ -26,7 +26,7 @@ public class KitSpider extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 6), + new PerkSmashStats(), new PerkSpiderLeap(), new PerkNeedler(), new PerkWebShot(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java index d65af9d03..e453fe471 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java @@ -31,10 +31,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkNeedler extends SmashPerk { - private static final int COOLDOWN_NORMAL = 2000; - private static final int COOLDOWN_SMASH = 600; - private static final float DAMAGE = 1.1F; - private static final int MAX_TICKS = 300; + private long _cooldownNormal; + private long _cooldownSmash; + private double _damage; + private int _maxTicks; private Map _active = new HashMap<>(); private Set _arrows = new HashSet<>(); @@ -44,6 +44,15 @@ public class PerkNeedler extends SmashPerk super("Needler", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Needler" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkInt("Cooldown Smash (ms)"); + _damage = getPerkDouble("Damage"); + _maxTicks = getPerkInt("Max Ticks"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -74,7 +83,7 @@ public class PerkNeedler extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !isSuperActive(player), !isSuperActive(player))) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, !isSuperActive(player), !isSuperActive(player))) { return; } @@ -156,7 +165,7 @@ public class PerkNeedler extends SmashPerk event.GetProjectile().remove(); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, DamageCause.THORNS, DAMAGE, true, true, false, damager.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, DamageCause.THORNS, _damage, true, true, false, damager.getName(), GetName()); if (!isTeamDamage(damager, event.GetDamageePlayer())) { @@ -176,7 +185,7 @@ public class PerkNeedler extends SmashPerk { Arrow arrow = arrowIterator.next(); - if (arrow.isOnGround() || !arrow.isValid() || arrow.getTicksLived() > MAX_TICKS) + if (arrow.isOnGround() || !arrow.isValid() || arrow.getTicksLived() > _maxTicks) { arrowIterator.remove(); arrow.remove(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java index dc62b516e..984ba2f32 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java @@ -26,8 +26,8 @@ import nautilus.game.arcade.kit.Perk; public class PerkSpiderLeap extends Perk { - private static final float ENERGY_PER_TICK = 0.005F; - private static final float ENERGY_PER_LEAP = 0.17F; + private float _energyTick; + private float _energyJump; private Set _secondJump = new HashSet<>(); private Set _finalJump = new HashSet<>(); @@ -38,6 +38,13 @@ public class PerkSpiderLeap extends Perk + "Wall Climb requires Energy (Experience Bar)." }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Per Tick"); + _energyJump = getPerkFloat("Energy Per Jump"); + } + @EventHandler public void WallClimb(UpdateEvent event) { @@ -62,19 +69,19 @@ public class PerkSpiderLeap extends Perk _secondJump.remove(player.getUniqueId()); } - player.setExp(Math.min(0.999F, player.getExp() + (grounded ? ENERGY_PER_TICK * 2 : ENERGY_PER_TICK))); + player.setExp(Math.min(0.999F, player.getExp() + (grounded ? _energyTick * 2 : _energyTick))); continue; } - player.setExp(Math.max(0, player.getExp() - ENERGY_PER_TICK)); + player.setExp(Math.max(0, player.getExp() - _energyTick)); if (player.getExp() <= 0) { continue; } - if (player.getExp() >= ENERGY_PER_LEAP) + if (player.getExp() >= _energyJump) { _finalJump.remove(player.getUniqueId()); } @@ -116,7 +123,7 @@ public class PerkSpiderLeap extends Perk // Disable Flight player.setAllowFlight(false); - if (player.getExp() < ENERGY_PER_LEAP) + if (player.getExp() < _energyJump) { if (!_finalJump.contains(player.getUniqueId())) { @@ -132,7 +139,7 @@ public class PerkSpiderLeap extends Perk UtilAction.velocity(player, 1.0, 0.2, 1.0, true); // Energy - player.setExp(Math.max(0, player.getExp() - ENERGY_PER_LEAP)); + player.setExp(Math.max(0, player.getExp() - _energyJump)); // Sound player.getWorld().playSound(player.getLocation(), Sound.SPIDER_IDLE, 1f, 1.5f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java index 1fdd08267..ec2bb90fa 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java @@ -30,15 +30,23 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWebShot extends SmashPerk implements IThrown { - private static final int COOLDOWN_NORMAL = 10000; - private static final int COOLDOWN_SMASH = 1000; - private static final int WEBS = 20; + private int _cooldownNormal = 10000; + private int _cooldownSmash = 1000; + private int _webs = 20; public PerkWebShot() { super("Spin Web", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Spin Web" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _webs = getPerkInt("Webs"); + } + @EventHandler public void ShootWeb(PlayerInteractEvent event) { @@ -69,7 +77,7 @@ public class PerkWebShot extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !isSuperActive(player), !isSuperActive(player))) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, !isSuperActive(player), !isSuperActive(player))) { return; } @@ -79,7 +87,7 @@ public class PerkWebShot extends SmashPerk implements IThrown // Boost UtilAction.velocity(player, 1.2, 0.2, 1.2, true); - for (int i = 0; i < WEBS; i++) + for (int i = 0; i < _webs; i++) { Item ent = player.getWorld().dropItem(player.getLocation().add(0, 0.5, 0), ItemStackFactory.Instance.CreateStack(Material.WEB, (byte) 0, 1, "Web " + player.getName() + " " + i)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java index 3ffcf8635..b0ed1055e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java @@ -22,13 +22,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSpider extends SmashUltimate { - private static final int DURATION = 30000; - private Map _preHealth = new HashMap<>(); public SmashSpider() { - super("Spider Nest", new String[] {}, Sound.SPIDER_DEATH, DURATION); + super("Spider Nest", new String[] {}, Sound.SPIDER_DEATH, 0); } @Override @@ -61,11 +59,11 @@ public class SmashSpider extends SmashUltimate continue; } - Manager.GetBlockRestore().add(block, 30, (byte) 0, (int) (DURATION + 5000 * Math.random())); + Manager.GetBlockRestore().add(block, 30, (byte) 0, (int) (getLength() + 5000 * Math.random())); } // Regen - Manager.GetCondition().Factory().Regen(GetName(), player, player, DURATION / 1000, 2, false, false, false); + Manager.GetCondition().Factory().Regen(GetName(), player, player, getLength() / 1000, 2, false, false, false); } @EventHandler(priority = EventPriority.HIGH) From f1b45bc29eaf84999cab5153fba8f9bc82193461 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 14:37:29 +0100 Subject: [PATCH 007/170] Slime converted to Google Sheets --- .../game/games/smash/kits/KitSlime.java | 4 +- .../smash/perks/slime/PerkSlimeRocket.java | 30 +++++--- .../smash/perks/slime/PerkSlimeSlam.java | 69 ++++++++++--------- .../games/smash/perks/slime/SmashSlime.java | 20 ++++-- 4 files changed, 70 insertions(+), 53 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index f439afb7c..d31d0028a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -25,8 +25,8 @@ public class KitSlime extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.75, 0.35, 3), - new PerkDoubleJump("Double Jump", 1.2, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSlimeSlam(), new PerkSlimeRocket(), new SmashSlime() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java index a9994d4a1..c8659cd43 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java @@ -43,11 +43,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkSlimeRocket extends SmashPerk implements IThrown { - private static final int COOLDOWN = 6000; - private static final float ENERGY_PER_TICK = 0.004F; - private static final int KNOCKBACK_MAGNITUDE = 3; - private static final int MAX_ENERGY_TIME = 3000; - private static final int MAX_HOLD_TIME = 5000; + private int _cooldown = 6000; + private float _energyTick = 0.004F; + private int _knockbackMagnitude = 3; + private int _maxEnergyTime = 3000; + private int _maxHoldTime = 5000; private Map _charge = new HashMap<>(); private Map _owner = new HashMap<>(); @@ -58,6 +58,16 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown super("Slime Rocket", new String[] { C.cYellow + "Hold/Release Block" + C.cGray + " to use " + C.cGreen + "Slime Rocket" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _energyTick = getPerkFloat("Energy Per Tick"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _maxEnergyTime = getPerkTime("Max Energy Time"); + _maxHoldTime = getPerkTime("Max Hold Time"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -101,7 +111,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown continue; } - player.setExp((float) Math.min(0.999, player.getExp() + ENERGY_PER_TICK)); + player.setExp((float) Math.min(0.999, player.getExp() + _energyTick)); } } @@ -140,7 +150,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -187,13 +197,13 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown double elapsed = Math.min(3, (double) (System.currentTimeMillis() - time) / 1000d); // Use Energy - if (!UtilTime.elapsed(time, MAX_ENERGY_TIME)) + if (!UtilTime.elapsed(time, _maxEnergyTime)) { player.setExp((float) Math.max(0, player.getExp() - 0.01f)); } // AutoFire - if (UtilTime.elapsed(time, MAX_HOLD_TIME)) + if (UtilTime.elapsed(time, _maxHoldTime)) { FireRocket(player); chargeIterator.remove(); @@ -310,7 +320,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java index 6d27af729..fc36d01bb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java @@ -1,42 +1,32 @@ package nautilus.game.arcade.game.games.smash.perks.slime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class PerkSlimeSlam extends SmashPerk { - private static final int COOLDOWN = 6000; - private static final int HIT_BOX = 2; - private static final int START_TIME = 1000; - private static final int DAMAGE_RATE_LIMIT = 500; - private static final int DAMAGE = 7; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _hitBox; + private int _startTime; + private int _damageRateLimit; + private int _damage; + private int _knockbackMagnitude; private Map _live = new HashMap<>(); @@ -45,6 +35,17 @@ public class PerkSlimeSlam extends SmashPerk super("Slime Slam", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Slime Slam" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _hitBox = getPerkInt("Hit Box"); + _startTime = getPerkTime("Start Time"); + _damageRateLimit = getPerkInt("Damage Rate Limit (ms)"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -75,7 +76,7 @@ public class PerkSlimeSlam extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -114,7 +115,7 @@ public class PerkSlimeSlam extends SmashPerk continue; } - if (UtilMath.offset(player, other) < HIT_BOX) + if (UtilMath.offset(player, other) < _hitBox) { doSlam(player, other); _live.remove(player.getUniqueId()); @@ -138,7 +139,7 @@ public class PerkSlimeSlam extends SmashPerk continue; } - if (!UtilTime.elapsed(_live.get(key), START_TIME)) + if (!UtilTime.elapsed(_live.get(key), _startTime)) { continue; } @@ -151,7 +152,7 @@ public class PerkSlimeSlam extends SmashPerk { if (damagee instanceof Player) { - if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", DAMAGE_RATE_LIMIT, false, false)) + if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", _damageRateLimit, false, false)) { return; } @@ -160,10 +161,10 @@ public class PerkSlimeSlam extends SmashPerk // Recoil Event if (!isSuperActive(damager)) { - Manager.GetDamage().NewDamageEvent(damager, damagee, null, DamageCause.CUSTOM, DAMAGE / 4, true, true, false, damager.getName(), GetName() + " Recoil"); + Manager.GetDamage().NewDamageEvent(damager, damagee, null, DamageCause.CUSTOM, _damage / 4, true, true, false, damager.getName(), GetName() + " Recoil"); // Damage Event - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, DAMAGE, true, true, false, damager.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _damage, true, true, false, damager.getName(), GetName()); } // Inform @@ -179,6 +180,6 @@ public class PerkSlimeSlam extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java index 16bfccd4e..f4cfd2385 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java @@ -26,13 +26,19 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSlime extends SmashUltimate { - private static final int DURATION = 19000; - private static final int HIT_BOX = 5; - private static final int DAMAGE = 8; + private int _hitBox; + private int _damage; public SmashSlime() { - super("Giga Slime", new String[] {}, Sound.SLIME_ATTACK, DURATION); + super("Giga Slime", new String[] {}, Sound.SLIME_ATTACK, 0); + } + + @Override + public void setupValues() + { + _hitBox = getPerkInt("Hit Box"); + _damage = getPerkInt("Damage"); } @Override @@ -53,7 +59,7 @@ public class SmashSlime extends SmashUltimate player.setExp(0.99f); - Manager.GetCondition().Factory().Speed(GetName(), player, player, DURATION / 1000, 2, false, false, false); + Manager.GetCondition().Factory().Speed(GetName(), player, player, getLength() / 1000, 2, false, false, false); } @@ -128,9 +134,9 @@ public class SmashSlime extends SmashUltimate continue; } - if (UtilMath.offset(player.getLocation().add(0, 3, 0), other.getLocation()) < HIT_BOX) + if (UtilMath.offset(player.getLocation().add(0, 3, 0), other.getLocation()) < _hitBox) { - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(ParticleType.SLIME, other.getLocation().add(0, 0.6, 0), 1f, 1f, 1f, 0, 20, ViewDist.LONG, UtilServer.getPlayers()); From 09300b499f3d5890348641faed77e2c9a17df121 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 14:41:59 +0100 Subject: [PATCH 008/170] Adjust the time before the player recieves kit information after death --- .../game/arcade/game/games/smash/SuperSmashTraining.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java index 514e60b7d..6eeb2b6a8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -218,7 +218,7 @@ public class SuperSmashTraining extends SuperSmash { if (_lastDeath.containsKey(player.getUniqueId())) { - return UtilTime.elapsed(_lastDeath.get(player.getUniqueId()), 2000); + return UtilTime.elapsed(_lastDeath.get(player.getUniqueId()), 4000); } return super.displayKitInfo(player) || !_safeFunction.apply(player); From 02ffec8618c2299b8486829a24b38ca663fbeb6e Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 14:42:26 +0100 Subject: [PATCH 009/170] Fix players being affected by velocity inside on the spawn island --- .../modules/training/TrainingGameModule.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java index 4f83b37f1..c90fe0fce 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java @@ -1,6 +1,7 @@ package nautilus.game.arcade.game.modules.training; import mineplex.core.command.CommandCenter; +import mineplex.core.common.events.EntityVelocityChangeEvent; import mineplex.core.common.util.*; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.recharge.Recharge; @@ -302,6 +303,24 @@ public class TrainingGameModule extends Module } } + @EventHandler + public void entityVelocity(EntityVelocityChangeEvent event) + { + Entity entity = event.getEntity(); + + if (!(entity instanceof Player)) + { + return; + } + + Player player = (Player) entity; + + if (!_damageFunction.apply(player)) + { + event.setCancelled(true); + } + } + @EventHandler public void giveReturnToSpawn(UpdateEvent event) { From 9d48a5f1a5381c8d3e58b5762d90aa668d133bc4 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 16:08:45 +0100 Subject: [PATCH 010/170] Creeper converted to Google Sheets --- .../mineplex/core/explosion/Explosion.java | 39 ++++- .../arcade/game/games/smash/SuperSmash.java | 3 + .../game/games/smash/kits/KitCreeper.java | 4 +- .../perks/creeper/PerkCreeperElectricity.java | 25 ++- .../perks/creeper/PerkCreeperExplode.java | 145 ++++++++++-------- .../perks/creeper/PerkCreeperSulphurBomb.java | 20 ++- .../smash/perks/creeper/SmashCreeper.java | 2 +- .../arcade/managers/GameCreationManager.java | 3 +- 8 files changed, 153 insertions(+), 88 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java b/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java index dedb8c37b..02601d751 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.UUID; +import java.util.concurrent.TimeUnit; import mineplex.core.MiniPlugin; import mineplex.core.blockrestore.BlockRestore; @@ -38,10 +39,11 @@ import org.bukkit.util.Vector; public class Explosion extends MiniPlugin { - private boolean _regenerateGround = false; + private boolean _regenerateGround; + private long _regenerateTime; private boolean _temporaryDebris = true; private boolean _enableDebris = false; - private boolean _tntSpread = true; + private boolean _tntSpread; private boolean _liquidDamage = true; private HashSet _explosionBlocks = new HashSet(); @@ -52,6 +54,8 @@ public class Explosion extends MiniPlugin super("Block Restore", plugin); _blockRestore = blockRestore; + + resetConfiguration(); } @EventHandler @@ -134,7 +138,7 @@ public class Explosion extends MiniPlugin else { int heightDiff = cur.getLocation().getBlockY() - event.getEntity().getLocation().getBlockY(); - _blockRestore.add(cur, 0, (byte) 0, (long) (20000 + (heightDiff * 3000) + Math.random() * 2900)); + _blockRestore.add(cur, 0, (byte) 0, (long) (_regenerateTime + (heightDiff * 3000) + Math.random() * 2900)); } } @@ -276,6 +280,11 @@ public class Explosion extends MiniPlugin _regenerateGround = regenerate; } + public void setRegenerateTime(long time) + { + _regenerateTime = time; + } + public void SetDebris(boolean value) { _enableDebris = value; @@ -296,6 +305,13 @@ public class Explosion extends MiniPlugin _temporaryDebris = value; } + public void resetConfiguration() + { + _regenerateGround = false; + _regenerateTime = TimeUnit.SECONDS.toMillis(20); + _tntSpread = true; + } + public HashSet GetExplosionBlocks() { return _explosionBlocks; @@ -326,7 +342,14 @@ public class Explosion extends MiniPlugin if (removeBlock) { - cur.setType(Material.AIR); + if (_regenerateGround) + { + _blockRestore.add(cur, 0, (byte) 0, (long) (_regenerateTime + (cur.getLocation().getBlockY() * 3000) + (Math.random() * 1500))); + } + else + { + cur.setType(Material.AIR); + } } } @@ -356,12 +379,16 @@ public class Explosion extends MiniPlugin _explosionBlocks.add(fall); } - } } }, 1); } - + + private void addToRegenerate(Block block) + { + + } + public void setEnabled(boolean var) { if (var) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index 3d2f3f2f0..f4d146e8a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -90,6 +90,9 @@ public abstract class SuperSmash extends Game HideTeamSheep = true; ReplaceTeamsWithKits = true; + manager.GetExplosion().SetRegenerate(true); + manager.GetExplosion().setRegenerateTime(TimeUnit.SECONDS.toMillis(30)); + new CompassModule() .setGiveCompassToAlive(true) .register(this); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java index 9503a5c9f..6d56a56ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java @@ -25,8 +25,8 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitCreeper extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.65, 0.4, 3.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkCreeperElectricity(), new PerkCreeperSulphurBomb(), new PerkCreeperExplode(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java index a92cb53b5..476e3eca9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java @@ -25,10 +25,10 @@ import nautilus.game.arcade.kit.Perk; public class PerkCreeperElectricity extends Perk { - private static final int DURATION = 2000; - private static final int SHOCK = 1; - private static final int DAMAGE = 4; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _duration; + private int _shock; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -37,6 +37,15 @@ public class PerkCreeperElectricity extends Perk super("Lightning Shield", new String[] { "When hit by a non-melee attack, you gain " + C.cGreen + "Lightning Shield" }); } + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _shock = getPerkInt("Shock"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Shield(CustomDamageEvent event) { @@ -103,7 +112,7 @@ public class PerkCreeperElectricity extends Perk continue; } - if (UtilTime.elapsed(_active.get(key), DURATION)) + if (UtilTime.elapsed(_active.get(key), _duration)) { shieldIterator.remove(); @@ -152,12 +161,12 @@ public class PerkCreeperElectricity extends Perk // Elec damagee.getWorld().strikeLightningEffect(damagee.getLocation()); - Manager.GetCondition().Factory().Shock(GetName(), event.GetDamagerEntity(false), event.GetDamageeEntity(), SHOCK, false, false); + Manager.GetCondition().Factory().Shock(GetName(), event.GetDamagerEntity(false), event.GetDamageeEntity(), _shock, false, false); SetPowered(damagee, false); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamagerEntity(false), damagee, null, DamageCause.LIGHTNING, DAMAGE, true, true, false, damagee.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(event.GetDamagerEntity(false), damagee, null, DamageCause.LIGHTNING, _damage, true, true, false, damagee.getName(), GetName()); } public DisguiseCreeper GetDisguise(Player player) @@ -211,6 +220,6 @@ public class PerkCreeperElectricity extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index e07b996fa..c6a5c9649 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -1,11 +1,18 @@ package nautilus.game.arcade.game.games.smash.perks.creeper; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.disguise.disguises.DisguiseCreeper; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -16,48 +23,43 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.disguise.disguises.DisguiseBase; -import mineplex.core.disguise.disguises.DisguiseCreeper; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.*; public class PerkCreeperExplode extends SmashPerk { - private static final int COOLDOWN = 8000; - private static final int WARMUP = 1500; - private static final int RADIUS_NORMAL = 8; - private static final int RADIUS_SMASH = 24; - private static final int DAMAGE_NORMAL = 20; - private static final int DAMAGE_SMASH = 30; - private static final int SPAWN_REMOVAL_RADIUS = 14; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _warmup; + private int _radiusNormal; + private int _radiusSmash; + private int _damageNormal; + private int _damageSmash; + private int _spawnRemovalRadius; + private float _knockbackMagnitude; + private int _blockDestroyRadius; + private int _blockRegeneration; private Map _active = new HashMap<>(); + private Map _removedSpawns = new HashMap<>(); public PerkCreeperExplode() { - super("Explode", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Shovel use " + C.cGreen + "Explosive Leap" }); + super("Explode", new String[]{C.cYellow + "Right-Click" + C.cGray + " with Shovel use " + C.cGreen + "Explosive Leap"}); + } + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _warmup = getPerkInt("Warmup (ms)"); + _radiusNormal = getPerkInt("Radius Normal"); + _radiusSmash = getPerkInt("Radius Smash"); + _damageNormal = getPerkInt("Damage Normal"); + _damageSmash = getPerkInt("Damage Smash"); + _spawnRemovalRadius = (int) Math.pow(getPerkInt("Spawn Removal Radius"), 2); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + _blockDestroyRadius = getPerkInt("Block Destroy Radius"); + _blockRegeneration = getPerkTime("Block Regeneration Time"); } @EventHandler @@ -95,7 +97,7 @@ public class PerkCreeperExplode extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -138,14 +140,14 @@ public class PerkCreeperExplode extends SmashPerk IncreaseSize(player); - player.setExp(Math.min(0.999f, elapsed / (float) WARMUP)); + player.setExp(Math.min(0.999f, elapsed / (float) _warmup)); // Not Detonated - if (!UtilTime.elapsed(_active.get(key), WARMUP)) + if (!UtilTime.elapsed(_active.get(key), _warmup)) { continue; } - + player.setExp(0); chargeIterator.remove(); @@ -172,29 +174,23 @@ public class PerkCreeperExplode extends SmashPerk } // Blocks - Collection blocks = UtilBlock.getInRadius(player.getLocation(), 12).keySet(); - Iterator iter = blocks.iterator(); + Collection blocks = UtilBlock.getInRadius(player.getLocation(), _blockDestroyRadius).keySet(); - while (iter.hasNext()) - { - Block b = iter.next(); + blocks.removeIf(b -> b.getType() == Material.STATIONARY_LAVA || b.getType() == Material.LAVA || b.getType() == Material.BEDROCK); - if (b.getType() == Material.STATIONARY_LAVA || b.getType() == Material.LAVA || b.getType() == Material.BEDROCK) - { - iter.remove(); - } - } Manager.GetExplosion().BlockExplosion(blocks, player.getLocation(), false); // Remove Spawns - Iterator spawnIterator = Manager.GetGame().GetTeam(player).GetSpawns().iterator(); - while (spawnIterator.hasNext()) - { - Location spawn = spawnIterator.next(); + Iterator iterator = Manager.GetGame().GetTeam(player).GetSpawns().iterator(); - if (UtilMath.offset(player.getLocation(), spawn) < SPAWN_REMOVAL_RADIUS) + while (iterator.hasNext()) + { + Location spawn = iterator.next(); + + if (UtilMath.offsetSquared(player.getLocation(), spawn) < _spawnRemovalRadius) { - spawnIterator.remove(); + _removedSpawns.put(spawn, System.currentTimeMillis()); + iterator.remove(); } } @@ -209,8 +205,8 @@ public class PerkCreeperExplode extends SmashPerk } } - double maxRange = isSuperActive(player) ? RADIUS_SMASH : RADIUS_NORMAL; - double damage = isSuperActive(player) ? DAMAGE_SMASH : DAMAGE_NORMAL; + double maxRange = isSuperActive(player) ? _radiusSmash : _radiusNormal; + double damage = isSuperActive(player) ? _damageSmash : _damageNormal; // Damage for (LivingEntity ent : UtilEnt.getInRadius(player.getLocation(), maxRange).keySet()) @@ -245,7 +241,7 @@ public class PerkCreeperExplode extends SmashPerk } } } - + public void activate(Player player) { _active.put(player.getUniqueId(), System.currentTimeMillis()); @@ -316,7 +312,7 @@ public class PerkCreeperExplode extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @EventHandler @@ -338,4 +334,27 @@ public class PerkCreeperExplode extends SmashPerk DecreaseSize(player); } + + @EventHandler + public void addDestroyedSpawns(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOW) + { + return; + } + + GameTeam team = Manager.GetGame().GetTeamList().get(0); + Iterator iterator = _removedSpawns.keySet().iterator(); + + while (iterator.hasNext()) + { + Location spawn = iterator.next(); + + if (UtilTime.elapsed(_removedSpawns.get(spawn), _blockRegeneration)) + { + team.GetSpawns().add(spawn); + iterator.remove(); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java index 111271be2..dd027b8d3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java @@ -35,15 +35,23 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown { - private static final int COOLDOWN = 3000; - private static final float DAMAGE = 6.5F; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private float _damage; + private float _knockbackMagnitude; public PerkCreeperSulphurBomb() { super("Sulphur Bomb", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Sulphur Bomb" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void ShootWeb(PlayerInteractEvent event) { @@ -79,7 +87,7 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -112,7 +120,7 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); } @Override @@ -142,6 +150,6 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java index b20752818..2792d9577 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java @@ -11,7 +11,7 @@ public class SmashCreeper extends SmashUltimate public SmashCreeper() { - super("Atomic Blast", new String[] {}, Sound.CREEPER_HISS, 1600); + super("Atomic Blast", new String[] {}, Sound.CREEPER_HISS, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java index 0c9cf5759..58048fb34 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java @@ -158,8 +158,7 @@ public class GameCreationManager implements Listener Manager.GetDamage().DisableDamageChanges = false; Manager.GetCreature().SetDisableCustomDrops(false); Manager.GetDamage().SetEnabled(true); - Manager.GetExplosion().SetRegenerate(false); - Manager.GetExplosion().SetTNTSpread(true); + Manager.GetExplosion().resetConfiguration(); // Manager.GetAntiStack().SetEnabled(true); Manager.getCosmeticManager().setHideParticles(false); Manager.GetDamage().GetCombatManager().setUseWeaponName(AttackReason.CustomWeaponName); From 24b73d27e72c6f58966dc09feb8a3ab6616abab6 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 16:10:54 +0100 Subject: [PATCH 011/170] Fix the infinite Giga Slime --- .../game/arcade/game/games/smash/perks/slime/SmashSlime.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java index f4cfd2385..c88f97ffd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java @@ -37,6 +37,8 @@ public class SmashSlime extends SmashUltimate @Override public void setupValues() { + super.setupValues(); + _hitBox = getPerkInt("Hit Box"); _damage = getPerkInt("Damage"); } From 9e6ab9a69656bd58520bed90291c7ada7cffe1d0 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 17:07:45 +0100 Subject: [PATCH 012/170] Enderman converted to Google Sheets --- .../game/games/smash/kits/KitEnderman.java | 6 ++-- .../games/smash/perks/enderman/PerkBlink.java | 16 +++++++-- .../smash/perks/enderman/PerkBlockToss.java | 27 ++++++++++----- .../perks/enderman/PerkEndermanTeleport.java | 15 ++++++--- .../smash/perks/enderman/SmashEnderman.java | 33 ++++++++++++------- 5 files changed, 68 insertions(+), 29 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index 0b2307689..43137cfb9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -36,9 +36,9 @@ public class KitEnderman extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(7, 1.3, 0.25, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkBlink("Blink", 16, 6000), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkBlink("Blink"), new PerkBlockToss(), new PerkEndermanTeleport(), new SmashEnderman() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java index c7f8c30ff..486149217 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java @@ -24,12 +24,17 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBlink extends SmashPerk { - private static final float INCREMENTAITON = 0.2F; + private static final float INCREMENTATION = 0.2F; private String _name; private double _range; private int _recharge; + public PerkBlink(String name) + { + this(name, 0, 0); + } + public PerkBlink(String name, double range, int recharge) { super(name, new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + name }); @@ -39,6 +44,13 @@ public class PerkBlink extends SmashPerk _recharge = recharge; } + @Override + public void setupValues() + { + _range = getPerkDouble("Range"); + _recharge = getPerkTime("Cooldown"); + } + @EventHandler public void Blink(PlayerInteractEvent event) { @@ -79,7 +91,7 @@ public class PerkBlink extends SmashPerk return; } - LineParticle lineParticle = new LineParticle(player.getEyeLocation(), player.getLocation().getDirection(), INCREMENTAITON, _range, null, ParticleType.SMOKE, UtilServer.getPlayers()); + LineParticle lineParticle = new LineParticle(player.getEyeLocation(), player.getLocation().getDirection(), INCREMENTATION, _range, null, ParticleType.SMOKE, UtilServer.getPlayers()); while (!lineParticle.update()) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java index afa59acd8..56aa3a4f5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java @@ -42,10 +42,10 @@ import nautilus.game.arcade.kit.perks.event.PerkBlockThrowEvent; public class PerkBlockToss extends SmashPerk implements IThrown { - private static final int COOLDOWN = 2000; - private static final int CHARGE_TIME = 1200; - private static final int DAMAGE = 9; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _chargeTime; + private int _damage; + private float _knockbackMagnitude; private Map _hold = new HashMap<>(); private Set _charged = new HashSet<>(); @@ -56,6 +56,15 @@ public class PerkBlockToss extends SmashPerk implements IThrown super("Block Toss", new String[] { C.cYellow + "Hold Block" + C.cGray + " to " + C.cGreen + "Grab Block", C.cYellow + "Release Block" + C.cGray + " to " + C.cGreen + "Throw Block" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _chargeTime = getPerkInt("Charge Time (ms)"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Grab(PlayerInteractEvent event) { @@ -154,7 +163,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown // Charged Tick if (!_charged.contains(key)) { - if (System.currentTimeMillis() - _hold.get(key).Time > CHARGE_TIME) + if (System.currentTimeMillis() - _hold.get(key).Time > _chargeTime) { _charged.add(key); player.getWorld().playEffect(player.getLocation(), Effect.CLICK1, 0); @@ -167,7 +176,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown UUID key = cur.getUniqueId(); Recharge.Instance.recharge(cur, GetName()); - Recharge.Instance.use(cur, GetName(), COOLDOWN, false, true); + Recharge.Instance.use(cur, GetName(), _cooldown, false, true); BlockTossData data = _hold.remove(key); @@ -180,7 +189,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown long charge = System.currentTimeMillis() - data.Time; // Throw - double mult = Math.min(1.4, 1.4 * ((double) charge / CHARGE_TIME)); + double mult = Math.min(1.4, 1.4 * ((double) charge / _chargeTime)); // Action UtilAction.velocity(block, cur.getLocation().getDirection(), mult, false, 0.2, 0, 1, true); @@ -201,7 +210,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, data.getThrown().getVelocity().length() * DAMAGE, true, true, false, UtilEnt.getName(data + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, data.getThrown().getVelocity().length() * _damage, true, true, false, UtilEnt.getName(data .getThrower()), GetName()); // Block to Item @@ -260,6 +269,6 @@ public class PerkBlockToss extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java index 5fcc81787..c8a116dee 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java @@ -28,8 +28,8 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkEndermanTeleport extends SmashPerk { - private static final int COOLDOWN = 5000; - private static final float CHARGE_PER_TICK = 0.015F; + private int _cooldown = 5000; + private float _chargeTick = 0.015F; private Map _target = new HashMap<>(); private Map _charge = new HashMap<>(); @@ -39,6 +39,13 @@ public class PerkEndermanTeleport extends SmashPerk super("Teleport", new String[] { C.cYellow + "Hold Sneak" + C.cGray + " to " + C.cGreen + "Teleport" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _chargeTick = getPerkFloat("Charge Per Tick"); + } + @EventHandler public void update(UpdateEvent event) { @@ -86,14 +93,14 @@ public class PerkEndermanTeleport extends SmashPerk // Same Block - Increase Charge else if (block.equals(_target.get(key))) { - _charge.put(key, _charge.get(key) + CHARGE_PER_TICK); + _charge.put(key, _charge.get(key) + _chargeTick); UtilTextMiddle.display(null, UtilTextMiddle.progress(_charge.get(key)), 0, 10, 10, player); if (_charge.get(key) >= 1) { UtilTextMiddle.display(null, C.cGreen + "Teleported", 0, 10, 10, player); - Recharge.Instance.useForce(player, GetName(), COOLDOWN); + Recharge.Instance.useForce(player, GetName(), _cooldown); while (block.getRelative(BlockFace.UP).getType() != Material.AIR) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java index ec4d33f6b..8f99fed1b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java @@ -33,18 +33,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashEnderman extends SmashUltimate { - private static final int DURATION = 30000; - private static final int DRAGON_VELOCITY_MAGNITUDE = 40; - private static final int HIT_COOLDOWN = 1000; - private static final int DAMAGE_RADIUS = 6; - private static final int DAMAGE = 20; - private static final int KNOCKBACK_MAGNITUDE = 4; + private int _dragonVelocity; + private int _hitCooldown; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; private Map _dragons = new HashMap<>(); public SmashEnderman() { - super("Ender Dragon", new String[] {}, Sound.ENDERDRAGON_GROWL, DURATION); + super("Ender Dragon", new String[] {}, Sound.ENDERDRAGON_GROWL, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _dragonVelocity = getPerkInt("Dragon Velocity"); + _hitCooldown = getPerkTime("Hit Cooldown"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @Override @@ -105,7 +116,7 @@ public class SmashEnderman extends SmashUltimate } // Move - Location target = player.getLocation().add(player.getLocation().getDirection().multiply(DRAGON_VELOCITY_MAGNITUDE)); + Location target = player.getLocation().add(player.getLocation().getDirection().multiply(_dragonVelocity)); ((CraftEnderDragon) dragon).getHandle().setTargetBlock(target.getBlockX(), target.getBlockY(), target.getBlockZ()); } } @@ -179,10 +190,10 @@ public class SmashEnderman extends SmashUltimate continue; } - if (UtilMath.offset(dragon.getLocation().add(0, 4, 0), other.getLocation()) < DAMAGE_RADIUS && Recharge.Instance.use(other, "Hit By Dragon", HIT_COOLDOWN, false, false)) + if (UtilMath.offset(dragon.getLocation().add(0, 4, 0), other.getLocation()) < _damageRadius && Recharge.Instance.use(other, "Hit By Dragon", _hitCooldown, false, false)) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), GetName()); } } } @@ -196,7 +207,7 @@ public class SmashEnderman extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @EventHandler(priority = EventPriority.LOW) From c8d891ef3171f5a6f2fea1c97f82c7c65c95dc3f Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 18:54:29 +0100 Subject: [PATCH 013/170] Snowman converted to Google Sheets --- .../game/games/smash/kits/KitSnowman.java | 20 +++++----- .../smash/perks/snowman/PerkArcticAura.java | 15 ++++++-- .../smash/perks/snowman/PerkIcePath.java | 15 ++++++-- .../smash/perks/snowman/SmashSnowman.java | 38 ++++++++++--------- .../game/arcade/kit/perks/PerkBlizzard.java | 18 +++++++-- .../game/arcade/kit/perks/PerkDamageSnow.java | 16 +++++++- 6 files changed, 81 insertions(+), 41 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java index c8af47cc9..adfb1ce7b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java @@ -26,16 +26,6 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitSnowman extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.4, 0.3, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkDamageSnow(1, 0.4), - new PerkArcticAura(), - new PerkBlizzard(), - new PerkIcePath(), - new SmashSnowman() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.SNOW_BALL); private static final ItemStack[] PLAYER_ITEMS = { @@ -80,7 +70,15 @@ public class KitSnowman extends SmashKit public KitSnowman(ArcadeManager manager) { - super(manager, "Snowman", KitAvailability.Gem, 5000, PERKS, EntityType.SNOWMAN, IN_HAND, DisguiseSnowman.class); + super(manager, "Snowman", KitAvailability.Gem, 5000, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkDamageSnow(), + new PerkArcticAura(), + new PerkBlizzard(), + new PerkIcePath(), + new SmashSnowman() }, + EntityType.SNOWMAN, IN_HAND, DisguiseSnowman.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java index aa0ed0242..7fd888a68 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java @@ -15,14 +15,21 @@ import nautilus.game.arcade.kit.Perk; public class PerkArcticAura extends Perk { - private static final int DURATION = 2000; - private static final int RANGE = 5; + private int _duration; + private int _range; public PerkArcticAura() { super("Arctic Aura", new String[] { "You freeze things around you, slowing enemies." }); } + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _range = getPerkInt("Range"); + } + @EventHandler public void SnowAura(UpdateEvent event) { @@ -43,13 +50,13 @@ public class PerkArcticAura extends Perk continue; } - double range = RANGE * player.getExp(); + double range = _range * player.getExp(); Map blocks = UtilBlock.getInRadius(player.getLocation(), range); for (Block block : blocks.keySet()) { - Manager.GetBlockRestore().snow(block, (byte) 1, (byte) 1, (int) (DURATION * (1 + blocks.get(block))), 250, 0); + Manager.GetBlockRestore().snow(block, (byte) 1, (byte) 1, (int) (_duration * (1 + blocks.get(block))), 250, 0); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java index 3916424a9..e48443b28 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java @@ -28,8 +28,8 @@ import nautilus.game.arcade.kit.perks.data.IcePathData; public class PerkIcePath extends Perk { - private static final int COOLDOWN = 12000; - private static final int MELT_TIME = 6000; + private int _cooldown; + private int _meltTime; private Set _data = new HashSet<>(); @@ -38,6 +38,13 @@ public class PerkIcePath extends Perk super("Ice Path", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Ice Path" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _meltTime = getPerkTime("Melt Time"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -68,7 +75,7 @@ public class PerkIcePath extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -105,7 +112,7 @@ public class PerkIcePath extends Perk else { block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, 79); - Manager.GetBlockRestore().add(block, 79, (byte) 0, MELT_TIME); + Manager.GetBlockRestore().add(block, 79, (byte) 0, _meltTime); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java index d63314583..bcff8ef4b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java @@ -40,19 +40,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSnowman extends SmashUltimate { - private static final int DURATION = 20000; - private static final int TURRET_HEALTH = 40; - private static final int RATE = 250; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; private static final int COOLDOWN = 1000; + private int _duration; + private int _turretHealth; + private int _rate; + private float _knockbackMagnitude; + private Map _snowball = new HashMap<>(); private Map _turret = new HashMap<>(); public SmashSnowman() { - super("Snow Turret", new String[] {}, Sound.STEP_SNOW, DURATION); + super("Snow Turret", new String[] {}, Sound.STEP_SNOW, 0); + } + + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _turretHealth = getPerkInt("Turret Health"); + _rate = getPerkInt("Rate"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); } @Override @@ -72,8 +82,8 @@ public class SmashSnowman extends SmashUltimate UtilEnt.vegetate(ent); UtilEnt.ghost(ent, true, false); - ent.setMaxHealth(TURRET_HEALTH); - ent.setHealth(TURRET_HEALTH); + ent.setMaxHealth(_turretHealth); + ent.setHealth(_turretHealth); UtilAction.velocity(ent, player.getLocation().getDirection(), 1, false, 0, 0.2, 1, false); @@ -122,7 +132,7 @@ public class SmashSnowman extends SmashUltimate { Snowman snowman = turretIter.next(); - if(snowman.getTicksLived() >= (DURATION/50.0)) + if(snowman.getTicksLived() >= (_duration /50.0)) { UtilParticle.PlayParticle(ParticleType.SNOWBALL_POOF, snowman.getLocation().add(0, 1, 0), 0.4f, 0.4f, 0.4f, 0, 12, ViewDist.LONG, UtilServer.getPlayers()); snowman.remove(); @@ -131,7 +141,7 @@ public class SmashSnowman extends SmashUltimate } else { - double amount = 1 - snowman.getTicksLived() / (DURATION/50.0); + double amount = 1 - snowman.getTicksLived() / (_duration /50.0); snowman.setCustomName(UtilText.getProgress(C.cGreen, amount, C.cRed, false)); snowman.setCustomNameVisible(true); } @@ -205,13 +215,7 @@ public class SmashSnowman extends SmashUltimate UtilAction.velocity(damagee, proj.getVelocity().multiply(0.3).add(new Vector(0, 0.3, 0))); - // Damage Event - if (!(damagee instanceof LivingEntity)) - { - return; - } - - if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", RATE, false, false)) + if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", _rate, false, false)) { return; } @@ -242,7 +246,7 @@ public class SmashSnowman extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java index 68a30fba8..f96d40048 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.kit.perks; +import java.util.Map; import java.util.WeakHashMap; import org.bukkit.Sound; @@ -26,7 +27,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkBlizzard extends Perk { - private WeakHashMap _snowball = new WeakHashMap(); + + private float _energyTick; + private float _energyPerBall; + + private Map _snowball = new WeakHashMap<>(); public PerkBlizzard() { @@ -36,6 +41,13 @@ public class PerkBlizzard extends Perk }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Per Tick"); + _energyPerBall = getPerkFloat("Energy Per Ball"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -50,7 +62,7 @@ public class PerkBlizzard extends Perk if (player.isBlocking()) continue; - player.setExp((float) Math.min(0.999, player.getExp()+(1f/60f))); + player.setExp((float) Math.min(0.999, player.getExp()+ _energyTick)); } } @@ -72,7 +84,7 @@ public class PerkBlizzard extends Perk if (player.getExp() < 0.1) continue; - player.setExp((float) Math.max(0, player.getExp()-(1f/9f))); + player.setExp(Math.max(0, player.getExp() - _energyPerBall)); for (int i=0 ; i<4 ; i++) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java index 1c97ba2fd..5c8d642b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java @@ -12,7 +12,12 @@ public class PerkDamageSnow extends Perk { private int _damage; private double _knockback; - + + public PerkDamageSnow() + { + this(0, 0); + } + public PerkDamageSnow(int damage, double knockback) { super("Snow Attack", new String[] @@ -23,7 +28,14 @@ public class PerkDamageSnow extends Perk _damage = damage; _knockback = knockback; } - + + @Override + public void setupValues() + { + _damage = getPerkInt("Damage"); + _knockback = getPerkDouble("Knockback"); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { From 1d0f28689f544505c42004f9982e55d44c57e6d6 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Apr 2017 19:06:33 +0100 Subject: [PATCH 014/170] Make Perks not static, this fixings all kits having the same stats :fearful: --- .../game/games/smash/kits/KitCreeper.java | 17 +++++++------- .../game/games/smash/kits/KitEnderman.java | 9 +++++++- .../game/games/smash/kits/KitGolem.java | 20 ++++++++--------- .../game/games/smash/kits/KitSkeleton.java | 22 +++++++++---------- .../game/games/smash/kits/KitSlime.java | 16 ++++++-------- .../game/games/smash/kits/KitSpider.java | 16 ++++++-------- 6 files changed, 49 insertions(+), 51 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java index 6d56a56ad..7fbd8e6f3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java @@ -24,14 +24,6 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitCreeper extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkCreeperElectricity(), - new PerkCreeperSulphurBomb(), - new PerkCreeperExplode(), - new SmashCreeper() - }; private static final ItemStack IN_HAND = new ItemStack(Material.TNT); @@ -83,7 +75,14 @@ public class KitCreeper extends SmashKit public KitCreeper(ArcadeManager manager) { - super(manager, "Creeper", KitAvailability.Gem, 4000, PERKS, EntityType.CREEPER, IN_HAND, DisguiseCreeper.class); + super(manager, "Creeper", KitAvailability.Gem, 4000, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkCreeperElectricity(), + new PerkCreeperSulphurBomb(), + new PerkCreeperExplode(), + new SmashCreeper() + }, EntityType.CREEPER, IN_HAND, DisguiseCreeper.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index 43137cfb9..c3324ebd3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -86,7 +86,14 @@ public class KitEnderman extends SmashKit public KitEnderman(ArcadeManager manager) { - super(manager, "Enderman", KitAvailability.Gem, 3000, PERKS, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); + super(manager, "Enderman", KitAvailability.Gem, 3000, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkBlink("Blink"), + new PerkBlockToss(), + new PerkEndermanTeleport(), + new SmashEnderman() + }, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java index 649a3c072..930869cd2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java @@ -26,16 +26,6 @@ import nautilus.game.arcade.kit.perks.PerkSlow; public class KitGolem extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkSlow(0), - new PerkFissure(), - new PerkIronHook(), - new PerkSeismicSlam(), - new SmashGolem() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.IRON_BLOCK); private static final ItemStack[] PLAYER_ITEMS = { @@ -78,7 +68,15 @@ public class KitGolem extends SmashKit public KitGolem(ArcadeManager manager) { - super(manager, "Iron Golem", KitAvailability.Free, PERKS, EntityType.IRON_GOLEM, IN_HAND, DisguiseIronGolem.class); + super(manager, "Iron Golem", KitAvailability.Free, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkSlow(0), + new PerkFissure(), + new PerkIronHook(), + new PerkSeismicSlam(), + new SmashGolem() + }, EntityType.IRON_GOLEM, IN_HAND, DisguiseIronGolem.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java index 8237cf19a..0f37721d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java @@ -34,17 +34,6 @@ public class KitSkeleton extends SmashKit private static double ARROW_DAMAGE = 6; - private static final Perk[] PERKS = { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkFletcher(), - new PerkKnockbackArrow(), - new PerkBoneExplosion(), - new PerkRopedArrow("Roped Arrow"), - new PerkBarrage(), - new SmashSkeleton() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.BOW); private static final ItemStack[] PLAYER_ITEMS = { @@ -90,7 +79,16 @@ public class KitSkeleton extends SmashKit public KitSkeleton(ArcadeManager manager) { - super(manager, "Skeleton", KitAvailability.Free, PERKS, EntityType.SKELETON, IN_HAND, DisguiseSkeleton.class); + super(manager, "Skeleton", KitAvailability.Free, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), + new PerkBoneExplosion(), + new PerkRopedArrow("Roped Arrow"), + new PerkBarrage(), + new SmashSkeleton() + }, EntityType.SKELETON, IN_HAND, DisguiseSkeleton.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index d31d0028a..411b2881c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -24,14 +24,6 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitSlime extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkSlimeSlam(), - new PerkSlimeRocket(), - new SmashSlime() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.SLIME_BALL); private static final ItemStack[] PLAYER_ITEMS = { @@ -74,7 +66,13 @@ public class KitSlime extends SmashKit public KitSlime(ArcadeManager manager) { - super(manager, "Slime", KitAvailability.Free, PERKS, EntityType.SLIME, IN_HAND, DisguiseSlime.class); + super(manager, "Slime", KitAvailability.Free, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkSlimeSlam(), + new PerkSlimeRocket(), + new SmashSlime() + }, EntityType.SLIME, IN_HAND, DisguiseSlime.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java index 343ad990b..563938841 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java @@ -25,14 +25,6 @@ import nautilus.game.arcade.kit.Perk; public class KitSpider extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(), - new PerkSpiderLeap(), - new PerkNeedler(), - new PerkWebShot(), - new SmashSpider() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.WEB); private static final ItemStack[] PLAYER_ITEMS = { @@ -88,7 +80,13 @@ public class KitSpider extends SmashKit public KitSpider(ArcadeManager manager) { - super(manager, "Spider", KitAvailability.Free, PERKS, EntityType.SPIDER, IN_HAND, DisguiseSpider.class); + super(manager, "Spider", KitAvailability.Free, new Perk[] { + new PerkSmashStats(), + new PerkSpiderLeap(), + new PerkNeedler(), + new PerkWebShot(), + new SmashSpider() + }, EntityType.SPIDER, IN_HAND, DisguiseSpider.class); } @Override From 5bc2b9d34c2ec15b25663f51766337931f2f9386 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 24 Apr 2017 17:40:48 +0100 Subject: [PATCH 015/170] Revert "Make Perks not static, this fixings all kits having the same stats :fearful:" This reverts commit 1d0f28689f544505c42004f9982e55d44c57e6d6. --- .../game/games/smash/kits/KitCreeper.java | 17 +++++++------- .../game/games/smash/kits/KitEnderman.java | 9 +------- .../game/games/smash/kits/KitGolem.java | 20 +++++++++-------- .../game/games/smash/kits/KitSkeleton.java | 22 ++++++++++--------- .../game/games/smash/kits/KitSlime.java | 16 ++++++++------ .../game/games/smash/kits/KitSpider.java | 16 ++++++++------ 6 files changed, 51 insertions(+), 49 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java index 7fbd8e6f3..6d56a56ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java @@ -24,6 +24,14 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitCreeper extends SmashKit { + private static final Perk[] PERKS = { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkCreeperElectricity(), + new PerkCreeperSulphurBomb(), + new PerkCreeperExplode(), + new SmashCreeper() + }; private static final ItemStack IN_HAND = new ItemStack(Material.TNT); @@ -75,14 +83,7 @@ public class KitCreeper extends SmashKit public KitCreeper(ArcadeManager manager) { - super(manager, "Creeper", KitAvailability.Gem, 4000, new Perk[] { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkCreeperElectricity(), - new PerkCreeperSulphurBomb(), - new PerkCreeperExplode(), - new SmashCreeper() - }, EntityType.CREEPER, IN_HAND, DisguiseCreeper.class); + super(manager, "Creeper", KitAvailability.Gem, 4000, PERKS, EntityType.CREEPER, IN_HAND, DisguiseCreeper.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index c3324ebd3..43137cfb9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -86,14 +86,7 @@ public class KitEnderman extends SmashKit public KitEnderman(ArcadeManager manager) { - super(manager, "Enderman", KitAvailability.Gem, 3000, new Perk[] { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkBlink("Blink"), - new PerkBlockToss(), - new PerkEndermanTeleport(), - new SmashEnderman() - }, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); + super(manager, "Enderman", KitAvailability.Gem, 3000, PERKS, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java index 930869cd2..649a3c072 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java @@ -26,6 +26,16 @@ import nautilus.game.arcade.kit.perks.PerkSlow; public class KitGolem extends SmashKit { + private static final Perk[] PERKS = { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkSlow(0), + new PerkFissure(), + new PerkIronHook(), + new PerkSeismicSlam(), + new SmashGolem() + }; + private static final ItemStack IN_HAND = new ItemStack(Material.IRON_BLOCK); private static final ItemStack[] PLAYER_ITEMS = { @@ -68,15 +78,7 @@ public class KitGolem extends SmashKit public KitGolem(ArcadeManager manager) { - super(manager, "Iron Golem", KitAvailability.Free, new Perk[] { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkSlow(0), - new PerkFissure(), - new PerkIronHook(), - new PerkSeismicSlam(), - new SmashGolem() - }, EntityType.IRON_GOLEM, IN_HAND, DisguiseIronGolem.class); + super(manager, "Iron Golem", KitAvailability.Free, PERKS, EntityType.IRON_GOLEM, IN_HAND, DisguiseIronGolem.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java index 0f37721d0..8237cf19a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java @@ -34,6 +34,17 @@ public class KitSkeleton extends SmashKit private static double ARROW_DAMAGE = 6; + private static final Perk[] PERKS = { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), + new PerkBoneExplosion(), + new PerkRopedArrow("Roped Arrow"), + new PerkBarrage(), + new SmashSkeleton() + }; + private static final ItemStack IN_HAND = new ItemStack(Material.BOW); private static final ItemStack[] PLAYER_ITEMS = { @@ -79,16 +90,7 @@ public class KitSkeleton extends SmashKit public KitSkeleton(ArcadeManager manager) { - super(manager, "Skeleton", KitAvailability.Free, new Perk[] { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkFletcher(), - new PerkKnockbackArrow(), - new PerkBoneExplosion(), - new PerkRopedArrow("Roped Arrow"), - new PerkBarrage(), - new SmashSkeleton() - }, EntityType.SKELETON, IN_HAND, DisguiseSkeleton.class); + super(manager, "Skeleton", KitAvailability.Free, PERKS, EntityType.SKELETON, IN_HAND, DisguiseSkeleton.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index 411b2881c..d31d0028a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -24,6 +24,14 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitSlime extends SmashKit { + private static final Perk[] PERKS = { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkSlimeSlam(), + new PerkSlimeRocket(), + new SmashSlime() + }; + private static final ItemStack IN_HAND = new ItemStack(Material.SLIME_BALL); private static final ItemStack[] PLAYER_ITEMS = { @@ -66,13 +74,7 @@ public class KitSlime extends SmashKit public KitSlime(ArcadeManager manager) { - super(manager, "Slime", KitAvailability.Free, new Perk[] { - new PerkSmashStats(), - new PerkDoubleJump("Double Jump"), - new PerkSlimeSlam(), - new PerkSlimeRocket(), - new SmashSlime() - }, EntityType.SLIME, IN_HAND, DisguiseSlime.class); + super(manager, "Slime", KitAvailability.Free, PERKS, EntityType.SLIME, IN_HAND, DisguiseSlime.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java index 563938841..343ad990b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java @@ -25,6 +25,14 @@ import nautilus.game.arcade.kit.Perk; public class KitSpider extends SmashKit { + private static final Perk[] PERKS = { + new PerkSmashStats(), + new PerkSpiderLeap(), + new PerkNeedler(), + new PerkWebShot(), + new SmashSpider() + }; + private static final ItemStack IN_HAND = new ItemStack(Material.WEB); private static final ItemStack[] PLAYER_ITEMS = { @@ -80,13 +88,7 @@ public class KitSpider extends SmashKit public KitSpider(ArcadeManager manager) { - super(manager, "Spider", KitAvailability.Free, new Perk[] { - new PerkSmashStats(), - new PerkSpiderLeap(), - new PerkNeedler(), - new PerkWebShot(), - new SmashSpider() - }, EntityType.SPIDER, IN_HAND, DisguiseSpider.class); + super(manager, "Spider", KitAvailability.Free, PERKS, EntityType.SPIDER, IN_HAND, DisguiseSpider.class); } @Override From 27cff851893a04088c531dbd1beee3dfb6079ea5 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 24 Apr 2017 18:04:16 +0100 Subject: [PATCH 016/170] Fix Perk variables being overriden when multiple kits used the same perk --- .../games/smash/perks/PerkSmashStats.java | 8 ++--- .../src/nautilus/game/arcade/kit/Perk.java | 4 +-- .../managers/PerkSpreadsheetModule.java | 34 ++----------------- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java index a545ca357..07804dab9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java @@ -42,10 +42,10 @@ public class PerkSmashStats extends Perk @Override public void setupValues() { - _damage = getPerkDouble("Damage"); - _knockbackTaken = getPerkPercentage("Knockback Taken"); - _regen = getPerkDouble("Regeneration"); - _armor = getPerkDouble("Armor"); + _damage = getPerkDouble("Damage", _damage); + _knockbackTaken = getPerkPercentage("Knockback Taken", _knockbackTaken); + _regen = getPerkDouble("Regeneration", _regen); + _armor = getPerkDouble("Armor", _armor); setDesc( (C.cAqua + "Damage: " + C.cWhite + _damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int) (_knockbackTaken * 100) + "%"), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java index 0b26d69b6..a403f675a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java @@ -115,8 +115,8 @@ public abstract class Perk implements Listener private String getPerkObject(String id) { - String key = _spreadsheet.getKey(this, id); - + String key = _spreadsheet.getKey(Kit, this, id); + if (!_spreadsheet.getDataMap().containsKey(key)) { return null; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java index 7eec2ff42..63e90d8d6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java @@ -24,11 +24,6 @@ import java.util.Objects; public class PerkSpreadsheetModule implements Listener { - private static final String SLACK_CHANNEL_NAME = "#google-sheet-errors"; - private static final String SLACK_USERNAME = "Google Sheets"; - private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/google-sheets-image.png"; - private static boolean _reportedError; - private static final SheetObjectDeserialiser> DESERIALISER = values -> Pair.create(values[0], values.length == 1 ? "" : values[1]); private final Game _game; @@ -98,7 +93,7 @@ public class PerkSpreadsheetModule implements Listener if (currentPerk != null) { - String id = getKey(currentPerk, pair.getLeft()); + String id = getKey(kit, currentPerk, pair.getLeft()); _dataMap.put(id, pair.getRight()); } } @@ -144,9 +139,9 @@ public class PerkSpreadsheetModule implements Listener return null; } - public String getKey(Perk perk, String value) + public String getKey(Kit kit, Perk perk, String value) { - return perk.GetName() + "." + value; + return kit.GetName() + "." + perk.GetName() + "." + value; } public Map getDataMap() @@ -154,27 +149,4 @@ public class PerkSpreadsheetModule implements Listener return _dataMap; } - public void reportError(Exception exception, String sheetName, String dataKey) - { - // Only allow one error report per lifetime, as the game causes an infinite loop. - if (_reportedError) - { - return; - } - - _reportedError = true; - - String message = "A parsing error has occurred on spreadsheet *" + sheetName + "* with data key *" + dataKey + "*.\n Details: " + exception.getMessage(); - - System.out.println(message); - try - { - SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), message), true); - } - catch (MalformedURLException e) - { - e.printStackTrace(); - } - } - } From 99fa347cf16c226ce9455e3f055873091efdc60e Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 24 Apr 2017 20:21:19 +0100 Subject: [PATCH 017/170] Wolf converted to Google Sheets --- .../arcade/game/games/smash/kits/KitWolf.java | 4 +- .../game/games/smash/perks/wolf/PerkWolf.java | 44 ++++++++++++------- .../games/smash/perks/wolf/SmashWolf.java | 4 +- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java index 0de6382fa..50907a773 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java @@ -24,8 +24,8 @@ public class KitWolf extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.6, 0.25, 5), - new PerkDoubleJump("Wolf Jump", 1.0, 1.0, true), + new PerkSmashStats(), + new PerkDoubleJump("Wolf Jump"), new PerkWolf(), new SmashWolf() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java index a5968ac4e..a52cb5c02 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java @@ -41,13 +41,13 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWolf extends SmashPerk { - private static final int TACKLE_COOLDOWN_NORMAL = 8000; - private static final int TACKLE_COOLDOWN_SMASH = 1600; - private static final int WOLF_HEALTH = 30; - private static final float WOLF_HIT_BOX = 2.5F; - private static final int WOLF_MAX_TICKS = 70; - private static final int TACKLE_DAMAGE = 5; - private static final int STRIKE_DAMAGE = 7; + private int _cooldownNormal; + private int _cooldownSmash; + private int _wolfHealth; + private float _hitBox; + private int _maxTicks; + private int _tackleDamage; + private int _strikeDamage; private static final String CUB_TACKLE = "Cub Tackle"; private static final String WOLF_STRIKE = "Wolf Strike"; @@ -67,6 +67,18 @@ public class PerkWolf extends SmashPerk + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + WOLF_STRIKE, C.cGray + "Wolf Strike deals 300% Knockback to tackled opponents.", }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkInt("Cooldown Smash (ms)"); + _wolfHealth = getPerkInt("Wolf Health"); + _hitBox = getPerkFloat("Hit Box"); + _maxTicks = getPerkInt("Max Ticks"); + _tackleDamage = getPerkInt("Tackle Damage"); + _strikeDamage = getPerkInt("Strike Damage"); + } + @EventHandler public void tackleTrigger(PlayerInteractEvent event) { @@ -99,7 +111,7 @@ public class PerkWolf extends SmashPerk boolean smash = isSuperActive(player); - if (!Recharge.Instance.use(player, CUB_TACKLE, smash ? TACKLE_COOLDOWN_SMASH : TACKLE_COOLDOWN_NORMAL, !smash, !smash)) + if (!Recharge.Instance.use(player, CUB_TACKLE, smash ? _cooldownSmash : _cooldownNormal, !smash, !smash)) { return; } @@ -115,7 +127,7 @@ public class PerkWolf extends SmashPerk UtilEnt.vegetate(wolf); - wolf.setMaxHealth(WOLF_HEALTH); + wolf.setMaxHealth(_wolfHealth); wolf.setHealth(wolf.getMaxHealth()); UtilAction.velocity(wolf, player.getLocation().getDirection(), 1.8, false, 0, 0.2, 1.2, true); @@ -152,7 +164,7 @@ public class PerkWolf extends SmashPerk continue; } - if (UtilEnt.hitBox(wolf.getLocation(), other, WOLF_HIT_BOX, null)) + if (UtilEnt.hitBox(wolf.getLocation(), other, _hitBox, null)) { if (other.equals(tackleGetOwner(wolf))) { @@ -166,7 +178,7 @@ public class PerkWolf extends SmashPerk } } - if (!wolf.isValid() || (UtilEnt.isGrounded(wolf) && wolf.getTicksLived() > WOLF_MAX_TICKS)) + if (!wolf.isValid() || (UtilEnt.isGrounded(wolf) && wolf.getTicksLived() > _maxTicks)) { wolf.remove(); wolfIterator.remove(); @@ -195,7 +207,7 @@ public class PerkWolf extends SmashPerk UtilAction.zeroVelocity(damagee); // Damage - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, TACKLE_DAMAGE, false, true, false, damager.getName(), CUB_TACKLE); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _tackleDamage, false, true, false, damager.getName(), CUB_TACKLE); // Sound damagee.getWorld().playSound(damagee.getLocation(), Sound.WOLF_GROWL, 1.5f, 1.5f); @@ -220,14 +232,14 @@ public class PerkWolf extends SmashPerk Wolf wolf = wolfIterator.next(); LivingEntity ent = _tackle.get(wolf); - if (!wolf.isValid() || !ent.isValid() || wolf.getTicksLived() > WOLF_MAX_TICKS) + if (!wolf.isValid() || !ent.isValid() || wolf.getTicksLived() > _maxTicks) { wolf.remove(); wolfIterator.remove(); continue; } - if (UtilMath.offset(wolf, ent) < WOLF_HIT_BOX) + if (UtilMath.offset(wolf, ent) < _hitBox) { Manager.GetCondition().Factory().Slow(CUB_TACKLE, ent, wolf, 0.9, 1, false, false, false, false); UtilAction.velocity(ent, new Vector(0, -0.3, 0)); @@ -362,7 +374,7 @@ public class PerkWolf extends SmashPerk continue; } - if (UtilEnt.hitBox(player.getLocation().add(0, 1, 0), other, WOLF_HIT_BOX, null)) + if (UtilEnt.hitBox(player.getLocation().add(0, 1, 0), other, _hitBox, null)) { strikeHit(player, other); playerIterator.remove(); @@ -404,7 +416,7 @@ public class PerkWolf extends SmashPerk } } - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, STRIKE_DAMAGE, true, true, false, damager.getName(), WOLF_STRIKE); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _strikeDamage, true, true, false, damager.getName(), WOLF_STRIKE); // Sound damagee.getWorld().playSound(damagee.getLocation(), Sound.WOLF_BARK, 1.5f, 1f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java index eee6b9ca7..52d88a686 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java @@ -13,11 +13,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashWolf extends SmashUltimate { - private static final int DURATION = 30000; - public SmashWolf() { - super("Frenzy", new String[] {}, Sound.WOLF_HOWL, DURATION); + super("Frenzy", new String[] {}, Sound.WOLF_HOWL, 0); } @Override From f16ea648f98673f661a0308114c8b435a1286b41 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 24 Apr 2017 23:13:03 +0100 Subject: [PATCH 018/170] Blazr converted to Google Sheets --- .../game/games/smash/kits/KitBlaze.java | 6 +- .../games/smash/perks/blaze/PerkFirefly.java | 88 +++++++++++-------- .../games/smash/perks/blaze/PerkInferno.java | 32 ++++--- .../games/smash/perks/blaze/SmashBlaze.java | 6 +- .../arcade/kit/perks/PerkKnockbackFire.java | 15 +++- 5 files changed, 92 insertions(+), 55 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java index 37399886a..9c176940f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java @@ -29,9 +29,9 @@ import nautilus.game.arcade.kit.perks.PerkSpeed; public class KitBlaze extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 1, 1, false), - new PerkKnockbackFire(1.50), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkKnockbackFire(), new PerkSpeed(0), new PerkInferno(), new PerkFirefly(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java index 29cd6d704..f643d4598 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java @@ -34,29 +34,45 @@ import nautilus.game.arcade.kit.perks.data.FireflyData; public class PerkFirefly extends SmashPerk { - - private static final int COOLDOWN = 12000; - private static final int DURATION = 2750; - private static final int DAMAGE = 7; - - private static final int RADIUS_NORMAL = 4; - private static final float VELOCITY_NORMAL = 0.7F; - - private static final int RADIUS_SMASH = 7; - private static final float VELOCITY_SMASH = 0.79F; - - private static final int HIT_FREQUENCY = 2000; - private static final int WARMUP_TIME = 1500; - private static final int MIN_CANCEL_DAMAGE = 4; - private static final int KNOCKBACK_MAGNITUDE = 2; - private Set _data = new HashSet(); - + private int _cooldown; + private int _duration ; + private int _damage; + + private int _radiusNormal; + private float _velocityNormal; + + private int _radiusSmash; + private float _velocitySmash; + + private int _hitFrequency; + private int _warmupTime; + private int _minCancelDamage; + private int _knockbackMagnitude; + + private Set _data = new HashSet<>(); + private int _tick = 0; - + public PerkFirefly() { - super("Firefly", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Firefly" }); + super("Firefly", new String[]{C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Firefly"}); + } + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _duration = getPerkInt("Duration (ms)"); + _damage = getPerkInt("Damage"); + _radiusNormal = getPerkInt("Radius Normal"); + _velocityNormal = getPerkFloat("Velocity Normal"); + _radiusSmash = getPerkInt("Radius Smash"); + _velocitySmash = getPerkFloat("Velocity Smash"); + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _warmupTime = getPerkInt("Warmup Time (ms)"); + _minCancelDamage = getPerkInt("Cancel Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @EventHandler @@ -94,7 +110,7 @@ public class PerkFirefly extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -126,7 +142,7 @@ public class PerkFirefly extends SmashPerk Iterator dataIterator = _data.iterator(); //There are a lot of magic numbers here, they are all arbitrary sound and particle values. - + while (dataIterator.hasNext()) { FireflyData data = dataIterator.next(); @@ -134,15 +150,15 @@ public class PerkFirefly extends SmashPerk Player player = data.Player; boolean superActive = isSuperActive(data.Player); String skillName = superActive ? "Phoenix" : GetName(); - + if (UtilPlayer.isSpectator(player)) { dataIterator.remove(); continue; } - + // Warmup - if (!UtilTime.elapsed(data.Time, WARMUP_TIME) && !superActive) + if (!UtilTime.elapsed(data.Time, _warmupTime) && !superActive) { UtilAction.zeroVelocity(player); player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.2f, 0.6f); @@ -151,14 +167,14 @@ public class PerkFirefly extends SmashPerk // Sound and Effect UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, player.getLocation().add(0, 1, 0), 0.6f, 0.6f, 0.6f, 0, 10, ViewDist.LONG); - float progress = (float) (System.currentTimeMillis() - data.Time) / WARMUP_TIME; + float progress = (float) (System.currentTimeMillis() - data.Time) / _warmupTime; player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 0.5f, 1f + progress); } // Velocity - else if (!UtilTime.elapsed(data.Time, DURATION) || superActive) + else if (!UtilTime.elapsed(data.Time, _duration) || superActive) { - UtilAction.velocity(player, player.getLocation().getDirection().multiply(superActive ? VELOCITY_SMASH : VELOCITY_NORMAL).add(new Vector(0, 0.15, 0))); + UtilAction.velocity(player, player.getLocation().getDirection().multiply(superActive ? _velocitySmash : _velocityNormal).add(new Vector(0, 0.15, 0))); player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.6f, 1.2f); // Sound and Effect @@ -176,7 +192,7 @@ public class PerkFirefly extends SmashPerk player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.75f, 0.75f); } - for (Player other : UtilPlayer.getNearby(player.getLocation(), superActive ? RADIUS_SMASH : RADIUS_NORMAL)) + for (Player other : UtilPlayer.getNearby(player.getLocation(), superActive ? _radiusSmash : _radiusNormal)) { if (other.equals(player)) { @@ -192,10 +208,10 @@ public class PerkFirefly extends SmashPerk if (_tick % 12 == 0) { - if (Recharge.Instance.use(other, GetName() + " hit by " + player.getName(), HIT_FREQUENCY, false, false)) - { + if (Recharge.Instance.use(other, GetName() + " hit by " + player.getName(), _hitFrequency, false, false)) + { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), skillName); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), skillName); UtilPlayer.message(other, F.main("Game", F.elem(Manager.GetColor(player) + player.getName()) + " hit you with " + F.elem(skillName) + ".")); } @@ -212,11 +228,11 @@ public class PerkFirefly extends SmashPerk @EventHandler public void FireflyDamage(CustomDamageEvent event) { - if (event.GetDamage() < MIN_CANCEL_DAMAGE) + if (event.GetDamage() < _minCancelDamage) { return; } - + if (!(event.GetDamagerEntity(true) instanceof Player)) { return; @@ -232,7 +248,7 @@ public class PerkFirefly extends SmashPerk { continue; } - + if (!UtilTime.elapsed(data.Time, 1250) && !isSuperActive(data.Player)) { if (isTeamDamage(data.Player, event.GetDamagerPlayer(true))) @@ -256,7 +272,7 @@ public class PerkFirefly extends SmashPerk { return; } - - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java index 7eb44eca3..2099330c5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java @@ -30,13 +30,14 @@ public class PerkInferno extends SmashPerk { private static final float MAX_ENERGY = 0.999F; - private static final float ENERGY_PER_TICK = 0.025F; - private static final float ENERGY_PER_ITEM = 0.035F; + + private float _energyTick = 0.025F; + private float _energyItem = 0.035F; - private static final double ITEM_EXPIRE_TIME = 0.7; - private static final double ITEM_BURN_TIME = 0.5; - private static final double ITEM_DAMAGE = 0.25; - private static final float ITEM_VELOCITY_MAGNITUDE = 1.6F; + private double _itemExpireTime = 0.7; + private double _itemBurnTime = 0.5; + private double _itemDamage = 0.25; + private float _itemVelocityMagnitude = 1.6F; private Map _active = new HashMap<>(); @@ -45,6 +46,17 @@ public class PerkInferno extends SmashPerk super("Inferno", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Inferno" }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Tick"); + _energyItem = getPerkFloat("Energy Item"); + _itemExpireTime = getPerkDouble("Expire Time"); + _itemBurnTime = getPerkDouble("Burn Time"); + _itemDamage = getPerkDouble("Damage"); + _itemVelocityMagnitude = getPerkFloat("Velocity Magnitude"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -62,7 +74,7 @@ public class PerkInferno extends SmashPerk if (!player.isBlocking()) { - player.setExp(Math.min(MAX_ENERGY, player.getExp() + ENERGY_PER_TICK)); + player.setExp(Math.min(MAX_ENERGY, player.getExp() + _energyTick)); } } } @@ -130,7 +142,7 @@ public class PerkInferno extends SmashPerk continue; } - cur.setExp(cur.getExp() - ENERGY_PER_ITEM); + cur.setExp(cur.getExp() - _energyItem); if (cur.getExp() <= 0) { @@ -140,10 +152,10 @@ public class PerkInferno extends SmashPerk // Fire Item fire = cur.getWorld().dropItem(cur.getEyeLocation(), new ItemStack(Material.BLAZE_POWDER)); - Manager.GetFire().Add(fire, cur, ITEM_EXPIRE_TIME, 0, ITEM_BURN_TIME, ITEM_DAMAGE, GetName(), false); + Manager.GetFire().Add(fire, cur, _itemExpireTime, 0, _itemBurnTime, _itemDamage, GetName(), false); fire.teleport(cur.getEyeLocation()); - fire.setVelocity(cur.getLocation().getDirection().add(getRandomVector()).multiply(ITEM_VELOCITY_MAGNITUDE)); + fire.setVelocity(cur.getLocation().getDirection().add(getRandomVector()).multiply(_itemVelocityMagnitude)); // Effect cur.getWorld().playSound(cur.getLocation(), Sound.GHAST_FIREBALL, 0.1f, 1f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java index 6fba264a3..26e91f7b1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java @@ -10,13 +10,11 @@ import nautilus.game.arcade.kit.Perk; public class SmashBlaze extends SmashUltimate { - private static final int DURATION = 18000; - public SmashBlaze() { - super("Phoenix", new String[] {}, Sound.BLAZE_DEATH, DURATION); + super("Phoenix", new String[] {}, Sound.BLAZE_DEATH, 0); } - + @Override public void activate(Player player) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java index ab071b021..ee6bd4338 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java @@ -11,7 +11,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkKnockbackFire extends Perk { private double _power; - + + public PerkKnockbackFire() + { + this(0); + } + public PerkKnockbackFire(double power) { super("Flaming Knockback", new String[] @@ -21,7 +26,13 @@ public class PerkKnockbackFire extends Perk _power = power; } - + + @Override + public void setupValues() + { + _power = getPerkDouble("Power"); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { From 044a3754cf3a9632113189895d0c8e57a78c317e Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 24 Apr 2017 23:14:01 +0100 Subject: [PATCH 019/170] Fix incorrect key --- .../game/arcade/game/games/smash/perks/blaze/PerkFirefly.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java index f643d4598..811fbae19 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java @@ -71,7 +71,7 @@ public class PerkFirefly extends SmashPerk _velocitySmash = getPerkFloat("Velocity Smash"); _hitFrequency = getPerkInt("Hit Frequency (ms)"); _warmupTime = getPerkInt("Warmup Time (ms)"); - _minCancelDamage = getPerkInt("Cancel Damage"); + _minCancelDamage = getPerkInt("Min Cancel Damage"); _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } From af25aa0b0090a7b9d05f75c6984c1345a8742cca Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 25 Apr 2017 18:20:34 +0100 Subject: [PATCH 020/170] Witch converted to Google Sheets --- .../game/games/smash/kits/KitWitch.java | 4 +- .../games/smash/perks/witch/PerkBatWave.java | 40 +++++++++++------ .../smash/perks/witch/PerkWitchPotion.java | 32 ++++++++----- .../games/smash/perks/witch/SmashWitch.java | 45 ++++++++++++------- 4 files changed, 78 insertions(+), 43 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java index 34657771c..72a7f2c85 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java @@ -25,8 +25,8 @@ public class KitWitch extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.3, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWitchPotion(), new PerkBatWave(), new SmashWitch() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java index 6433024c5..b2a2c57e5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java @@ -44,14 +44,15 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBatWave extends SmashPerk { - - private static final int COOLDOWN = 8000; + private static final int LEASH_COOLDOWN = 500; - private static final int HIT_COOLDOWN = 200; - private static final int HIT_BOX = 2; - private static final int DAMAGE = 3; - private static final int DISABLE_DAMAGE = 20; - private static final float KNOCKBACK_MAGNITUDE = 1.75F; + + private int _cooldown; + private int _hitCooldown; + private int _hitBox; + private int _damage; + private int _disableDamage; + private float _knockbackMagnitude; private static final String LEASH = "Leash Bats"; private static final String HIT = "Hit By Bat"; @@ -69,6 +70,17 @@ public class PerkBatWave extends SmashPerk + C.cGreen + "Bat Leash" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _hitCooldown = getPerkInt("Hit Cooldown (ms)"); + _hitBox = getPerkInt("Hit Box"); + _damage = getPerkInt("Damage"); + _disableDamage = getPerkInt("Disable Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -106,7 +118,7 @@ public class PerkBatWave extends SmashPerk UUID key = player.getUniqueId(); - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, true)) { if (_active.containsKey(key)) { @@ -138,7 +150,7 @@ public class PerkBatWave extends SmashPerk else { // Inform - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); } } else @@ -219,10 +231,10 @@ public class PerkBatWave extends SmashPerk continue; } - if (UtilEnt.hitBox(bat.getLocation(), other, HIT_BOX, null)) + if (UtilEnt.hitBox(bat.getLocation(), other, _hitBox, null)) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, cur, null, DamageCause.CUSTOM, DAMAGE, true, true, false, cur.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, cur, null, DamageCause.CUSTOM, _damage, true, true, false, cur.getName(), GetName()); // Effect bat.getWorld().playSound(bat.getLocation(), Sound.BAT_HURT, 1f, 1f); @@ -231,7 +243,7 @@ public class PerkBatWave extends SmashPerk bat.remove(); // Recharge on hit - Recharge.Instance.useForce(other, HIT, HIT_COOLDOWN); + Recharge.Instance.useForce(other, HIT, _hitCooldown); } } } @@ -299,7 +311,7 @@ public class PerkBatWave extends SmashPerk { _damageTaken.put(key, (_damageTaken.get(key) + event.GetDamage())); - if (_damageTaken.get(key) >= DISABLE_DAMAGE) + if (_damageTaken.get(key) >= _disableDamage) { Clear(player); } @@ -311,6 +323,6 @@ public class PerkBatWave extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java index 02dd04394..2c18b75ec 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java @@ -40,11 +40,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWitchPotion extends SmashPerk implements IThrown { - private static final int COOLDOWN = 2000; - private static final int RANGE_NOMRAL = 3; - private static final int DAMAGE_DIRECT = 7; - private static final int DAMAGE_DISTANCE = 6; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _range; + private int _damageDirect; + private int _damageDistance; + private int _knockbackMagnitude; private List _proj = new ArrayList<>(); @@ -53,6 +53,16 @@ public class PerkWitchPotion extends SmashPerk implements IThrown super("Daze Potion", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Daze Potion" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _range = getPerkInt( "Range"); + _damageDirect = getPerkInt("Damage Direct"); + _damageDistance = getPerkInt("Damage Distance"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -88,7 +98,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -137,7 +147,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override @@ -153,18 +163,18 @@ public class PerkWitchPotion extends SmashPerk implements IThrown for (Player player : directHit) { - Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, DAMAGE_DIRECT, true, true, false, thrower.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDirect, true, true, false, thrower.getName(), GetName()); } players.removeAll(directHit); - Vector a = data.getThrown().getLocation().subtract(RANGE_NOMRAL, RANGE_NOMRAL, RANGE_NOMRAL).toVector(); - Vector b = data.getThrown().getLocation().add(RANGE_NOMRAL, RANGE_NOMRAL, RANGE_NOMRAL).toVector(); + Vector a = data.getThrown().getLocation().subtract(_range, _range, _range).toVector(); + Vector b = data.getThrown().getLocation().add(_range, _range, _range).toVector(); for (Player player : players) { if(!UtilEnt.isInsideBoundingBox(player, a, b)) continue; - Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, DAMAGE_DISTANCE, true, true, false, thrower.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDistance, true, true, false, thrower.getName(), GetName()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java index c8c048c3b..560a09453 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java @@ -43,20 +43,33 @@ import nautilus.game.arcade.kit.perks.data.SonicBoomData; public class SmashWitch extends SmashUltimate { - private static final int DURATION = 20000; - private static final int COOLDOWN = 1200; - private static final int MAX_TIME = 12000; - private static final int HIT_BOX = 4; - private static final int DAMAGE_RADIUS = 10; - private static final int DAMAGE = 12; - private static final int FLAP_COOLDOWN = 40; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _maxTime; + private int _hitBox; + private int _damageRadius; + private int _damage; + private int _flapCooldown; + private int _knockbackMagnitude; private List _sonic = new ArrayList<>(); public SmashWitch() { - super("Bat Form", new String[] {}, Sound.BAT_HURT, DURATION); + super("Bat Form", new String[] {}, Sound.BAT_HURT, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _cooldown = getPerkInt("Cooldown (ms)"); + _maxTime = getPerkTime("Max Time"); + _hitBox = getPerkInt("Hit Box"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _flapCooldown = getPerkInt("Flap Cooldown (ms)"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @Override @@ -148,7 +161,7 @@ public class SmashWitch extends SmashUltimate return; } - if (!Recharge.Instance.use(player, GetName() + " Screech", COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName() + " Screech", _cooldown, false, false)) { return; } @@ -174,7 +187,7 @@ public class SmashWitch extends SmashUltimate SonicBoomData data = sonicIter.next(); // Time Boom - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { sonicIter.remove(); explode(data); @@ -202,7 +215,7 @@ public class SmashWitch extends SmashUltimate continue; } - if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Location) < HIT_BOX) + if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Location) < _hitBox) { sonicIter.remove(); explode(data); @@ -226,7 +239,7 @@ public class SmashWitch extends SmashUltimate data.Location.getWorld().playSound(data.Location, Sound.EXPLODE, 1f, 1.5f); // Damage - Map targets = UtilEnt.getInRadius(data.Location, DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(data.Location, _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -235,7 +248,7 @@ public class SmashWitch extends SmashUltimate continue; } - Manager.GetDamage().NewDamageEvent(cur, data.Shooter, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 0.5, true, false, false, data.Shooter.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, data.Shooter, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 0.5, true, false, false, data.Shooter.getName(), GetName()); } } @@ -272,7 +285,7 @@ public class SmashWitch extends SmashUltimate player.getWorld().playSound(player.getLocation(), Sound.BAT_TAKEOFF, (float) (0.3 + player.getExp()), (float) (Math.random() / 2 + 0.5)); // Set Recharge - Recharge.Instance.use(player, GetName() + " Flap", FLAP_COOLDOWN, false, false); + Recharge.Instance.use(player, GetName() + " Flap", _flapCooldown, false, false); } @EventHandler @@ -316,6 +329,6 @@ public class SmashWitch extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } From 7f1b1d72b941ff37929de5f428bc3716a71f7a81 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 25 Apr 2017 19:33:00 +0100 Subject: [PATCH 021/170] Chicken converted to Google Sheets --- .../game/games/smash/kits/KitChicken.java | 4 +-- .../perks/chicken/PerkChickenRocket.java | 35 ++++++++++++------- .../games/smash/perks/chicken/PerkEggGun.java | 22 ++++++++---- .../games/smash/perks/chicken/PerkFlap.java | 27 ++++++++------ .../smash/perks/chicken/SmashChicken.java | 4 +-- 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java index 6e4f0b442..434bef8f3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java @@ -25,8 +25,8 @@ public class KitChicken extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(4.5, 2.0, 0.2, 2), - new PerkFlap(0.8, 0.8, false), + new PerkSmashStats(), + new PerkFlap(), new PerkEggGun(), new PerkChickenRocket(), new SmashChicken() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java index a671bd243..6acd00576 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java @@ -44,12 +44,12 @@ import nautilus.game.arcade.kit.perks.data.ChickenMissileData; public class PerkChickenRocket extends SmashPerk { - private static final int COOLDOWN = 7000; - private static final int MIN_TIME = 200; - private static final int MAX_TIME = 4000; - private static final int HIT_BOX_RADIUS = 2; - private static final int DAMAGE_RADIUS = 3; - private static final int DAMAGE = 8; + private int _cooldown; + private int _minTime; + private int _maxTime; + private int _hitBoxRadius; + private int _damageRadius; + private int _damage; private Set _data = new HashSet<>(); @@ -59,6 +59,17 @@ public class PerkChickenRocket extends SmashPerk + " instantly recharges if you hit a player." }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _minTime = getPerkInt("Min Time (ms)"); + _maxTime = getPerkTime("Max Time (ms)"); + _hitBoxRadius = getPerkInt("Hit Box Radius"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Missile(PlayerInteractEvent event) { @@ -94,7 +105,7 @@ public class PerkChickenRocket extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,14 +142,14 @@ public class PerkChickenRocket extends SmashPerk data.Chicken.setVelocity(data.Direction); data.Chicken.getWorld().playSound(data.Chicken.getLocation(), Sound.CHICKEN_HURT, 0.3f, 1.5f); - if (!UtilTime.elapsed(data.Time, MIN_TIME)) + if (!UtilTime.elapsed(data.Time, _minTime)) { continue; } boolean detonate = false; - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { detonate = true; } @@ -146,7 +157,7 @@ public class PerkChickenRocket extends SmashPerk { List team = TeamSuperSmash.getTeam(Manager, data.Player, true); // Hit Entity - for (Entity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), HIT_BOX_RADIUS).keySet()) + for (Entity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), _hitBoxRadius).keySet()) { if (ent instanceof Arrow) { @@ -192,7 +203,7 @@ public class PerkChickenRocket extends SmashPerk { List team = TeamSuperSmash.getTeam(Manager, data.Player, true); // Damage - for (LivingEntity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), DAMAGE_RADIUS).keySet()) + for (LivingEntity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), _damageRadius).keySet()) { if (ent.equals(data.Player)) { @@ -212,7 +223,7 @@ public class PerkChickenRocket extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(ent, data.Player, null, DamageCause.PROJECTILE, DAMAGE, false, true, false, data.Player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(ent, data.Player, null, DamageCause.PROJECTILE, _damage, false, true, false, data.Player.getName(), GetName()); UtilAction.velocity(ent, UtilAlg.getTrajectory2d(data.Chicken, ent), 1.6, true, 0.8, 0, 10, true); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java index df35fda05..6162c7276 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java @@ -33,9 +33,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkEggGun extends SmashPerk { - private static final int COOLDOWN = 2500; - private static final int DURATION = 750; - private static final int DAMAGE = 1; + private int _cooldown; + private int _duration; + private int _damage; private Map _active = new HashMap<>(); @@ -44,6 +44,14 @@ public class PerkEggGun extends SmashPerk super("Egg Blaster", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Egg Blaster" }); } + @Override + public void setupValues() + { + _cooldown = getPerkInt("Cooldown (ms)"); + _duration = getPerkInt("Duration (ms)"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -79,7 +87,7 @@ public class PerkEggGun extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -114,7 +122,7 @@ public class PerkEggGun extends SmashPerk continue; } - if (UtilTime.elapsed(_active.get(key), DURATION)) + if (UtilTime.elapsed(_active.get(key), _duration)) { _active.remove(key); continue; @@ -150,7 +158,7 @@ public class PerkEggGun extends SmashPerk return; } - if (event.GetDamage() >= DAMAGE) + if (event.GetDamage() >= _damage) { return; } @@ -160,7 +168,7 @@ public class PerkEggGun extends SmashPerk Egg egg = (Egg) event.GetProjectile(); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), (LivingEntity) egg.getShooter(), egg, DamageCause.PROJECTILE, DAMAGE, true, true, false, UtilEnt.getName((LivingEntity) egg + Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), (LivingEntity) egg.getShooter(), egg, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName((LivingEntity) egg .getShooter()), GetName()); UtilAction.zeroVelocity(event.GetDamageeEntity()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java index 6464c22d1..8dcf4877c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java @@ -21,19 +21,26 @@ public class PerkFlap extends SmashPerk { private static final float MAX_ENERGY = 0.999F; - private static final float ENERGY_PER_TICK = 0.03F; - private static final float ENERGY_PER_FLAP = 0.17F; - private static final int COOLDOWN = 80; - + + private int _cooldown; + private float _energyPerTick; + private float _energyPerFlap; private double _power; private boolean _control; - public PerkFlap(double power, double heightLimit, boolean control) + public PerkFlap() { super("Flap", new String[] { C.cYellow + "Tap Jump Twice" + C.cGray + " to " + C.cGreen + "Flap" }); + } - _power = power; - _control = control; + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown (ms)"); + _energyPerTick = getPerkFloat("Energy Per Tick"); + _energyPerFlap = getPerkFloat("Energy Per Flap"); + _power = getPerkDouble("Power"); + _control = getPerkBoolean("Control"); } @EventHandler @@ -78,12 +85,12 @@ public class PerkFlap extends SmashPerk player.getWorld().playSound(player.getLocation(), Sound.BAT_TAKEOFF, (float) (0.3 + player.getExp()), (float) (Math.random() / 2 + 1)); // Set Recharge - Recharge.Instance.use(player, GetName(), COOLDOWN, false, false); + Recharge.Instance.use(player, GetName(), _cooldown, false, false); // Energy if (!isSuperActive(player)) { - player.setExp(Math.max(0f, player.getExp() - ENERGY_PER_FLAP)); + player.setExp(Math.max(0f, player.getExp() - _energyPerFlap)); } } @@ -109,7 +116,7 @@ public class PerkFlap extends SmashPerk if (UtilEnt.isGrounded(player) || UtilBlock.solid(player.getLocation().subtract(0, 2, 0).getBlock())) { - player.setExp(Math.min(MAX_ENERGY, player.getExp() + ENERGY_PER_TICK)); + player.setExp(Math.min(MAX_ENERGY, player.getExp() + _energyPerTick)); player.setAllowFlight(true); } else if (Recharge.Instance.usable(player, GetName()) && player.getExp() > 0) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java index 605499efc..baad365ac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java @@ -9,11 +9,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashChicken extends SmashUltimate { - private static final int DURATION = 20000; - public SmashChicken() { - super("Aerial Gunner", new String[] {}, Sound.CHICKEN_IDLE, DURATION); + super("Aerial Gunner", new String[] {}, Sound.CHICKEN_IDLE, 0); } /** From d3cb99f43196d7bc08bcfaa81fda79f52ec48099 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 26 Apr 2017 19:11:48 +0100 Subject: [PATCH 022/170] Skeletal Horse converted to Google Sheets --- .../games/smash/kits/KitSkeletalHorse.java | 4 +- .../perks/skeletalhorse/PerkBoneRush.java | 38 ++++++++---- .../perks/skeletalhorse/PerkDeadlyBones.java | 59 ++++++++++--------- .../perks/skeletalhorse/PerkHorseKick.java | 25 +++++--- .../skeletalhorse/SmashSkeletalHorse.java | 4 +- 5 files changed, 75 insertions(+), 55 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java index 0872b37ce..e034fe899 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java @@ -32,8 +32,8 @@ public class KitSkeletalHorse extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.4, 0.3, 6.5), - new PerkDoubleJump("Double Jump", 1, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkHorseKick(), new PerkBoneRush(), new PerkDeadlyBones(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java index f1d281713..1f09e42d9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java @@ -39,13 +39,13 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBoneRush extends SmashPerk implements IThrown { - private static final int COOLDOWN = 10000; - private static final float DAMAGE_NORMAL = 0.7F; - private static final int DAMAGE_SMASH = 3; - private static final int KNOCKBACK_NORMAL = 10; - private static final int KNOCKBACK_SMASH = 6; - private static final int EXPIRE_TIME = 2000; - private static final float Y_LIMIT = 0.25F; + private int _cooldown; + private float _damageNormal; + private int _damageSmash; + private int _knockbackNormal; + private int _knockbackSmash; + private int _expireTime; + private float _yLimit; private Map _active = new HashMap<>(); @@ -54,6 +54,18 @@ public class PerkBoneRush extends SmashPerk implements IThrown super("Bone Rush", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Bone Rush", C.cGray + "Crouch to avoid movement with " + C.cGreen + "Bone Rush" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damageNormal = getPerkFloat("Damage Normal"); + _damageSmash = getPerkInt("Damage Smash"); + _knockbackNormal = getPerkInt("Knockback Normal"); + _knockbackSmash = getPerkInt("Knockback Smash"); + _expireTime = getPerkTime("Expire Time"); + _yLimit = getPerkFloat("Y Limit"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -89,7 +101,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -141,7 +153,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown // Velocity Vector dir = player.getLocation().getDirection(); - double limit = isSuperActive(player) ? Y_LIMIT + 0.1 : Y_LIMIT; + double limit = isSuperActive(player) ? _yLimit + 0.1 : _yLimit; if (dir.getY() > limit) { @@ -159,7 +171,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown { Item bone = player.getWorld().dropItem(player.getLocation().add(Math.random() * 5 - 2.5, Math.random() * 3, Math.random() * 5 - 2.5), new ItemStack(Material.BONE)); UtilAction.velocity(bone, dir, 0.6 + 0.3 * Math.random(), false, 0, 0.1 + Math.random() * 0.05, 0.3, false); - Manager.GetProjectile().AddThrow(bone, player, this, EXPIRE_TIME, true, true, true, true, 0.5f); + Manager.GetProjectile().AddThrow(bone, player, this, _expireTime, true, true, true, true, 0.5f); } } } @@ -174,12 +186,12 @@ public class PerkBoneRush extends SmashPerk implements IThrown if (event.GetReason().contains(GetName())) { - event.AddKnockback(GetName(), KNOCKBACK_NORMAL); + event.AddKnockback(GetName(), _knockbackNormal); } if (event.GetReason().contains("Bone Storm")) { - event.AddKnockback(GetName(), KNOCKBACK_SMASH); + event.AddKnockback(GetName(), _knockbackSmash); } } @@ -216,7 +228,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, isSuperActive(damager) ? DAMAGE_SMASH : DAMAGE_NORMAL, false, true, false, UtilEnt.getName(data.getThrower()), reason); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, isSuperActive(damager) ? _damageSmash : _damageNormal, false, true, false, UtilEnt.getName(data.getThrower()), reason); UtilAction.velocity(target, data.getThrown().getVelocity()); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java index ca13e82ac..0708471b7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java @@ -1,11 +1,14 @@ package nautilus.game.arcade.game.games.smash.perks.skeletalhorse; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Item; @@ -14,28 +17,16 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.*; public class PerkDeadlyBones extends SmashPerk { - private static final int RATE = 400; - private static final int TICKS = 50; - private static final int DAMAGE_RADIUS = 4; - private static final int DAMAGE = 4; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _rate; + private int _ticks ; + private int _damageRadius; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -44,6 +35,16 @@ public class PerkDeadlyBones extends SmashPerk super("Deadly Bones", new String[] { C.cGray + "Drop explosive bones when you take damage." }); } + @Override + public void setupValues() + { + _rate = getPerkInt("Rate (ms)"); + _ticks = getPerkInt("Ticks"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void damageActivate(CustomDamageEvent event) { @@ -64,7 +65,7 @@ public class PerkDeadlyBones extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), RATE, false, false)) + if (!Recharge.Instance.use(player, GetName(), _rate, false, false)) { return; } @@ -91,7 +92,7 @@ public class PerkDeadlyBones extends SmashPerk for (Item item : itemListCopy) { // Not Ready - if (item.isValid() && item.getTicksLived() < TICKS) + if (item.isValid() && item.getTicksLived() < _ticks) { continue; } @@ -109,7 +110,7 @@ public class PerkDeadlyBones extends SmashPerk } // Damage - Map targets = UtilEnt.getInRadius(item.getLocation(), DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(item.getLocation(), _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -118,7 +119,7 @@ public class PerkDeadlyBones extends SmashPerk continue; } - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 1, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 1, true, true, false, player.getName(), GetName()); } // Remove @@ -135,6 +136,6 @@ public class PerkDeadlyBones extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java index a343c4a12..6d4edaecb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java @@ -37,10 +37,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkHorseKick extends SmashPerk { - private static final int COOLDOWN = 6000; - private static final float DAMAGE = 6.5F; - private static final int KICK_TIME = 1000; - private static final int KNOCKBACK_MAGNITUDE = 4; + private int _cooldown; + private float _damage; + private int _kickTime; + private int _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -49,6 +49,15 @@ public class PerkHorseKick extends SmashPerk super("Bone Kick", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Bone Kick" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _kickTime = getPerkInt("Kick Time (ms)"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -84,7 +93,7 @@ public class PerkHorseKick extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -119,7 +128,7 @@ public class PerkHorseKick extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), GetName()); // Sound player.getWorld().playSound(player.getLocation(), Sound.SKELETON_HURT, 4f, 0.6f); @@ -158,7 +167,7 @@ public class PerkHorseKick extends SmashPerk continue; } - if (!player.isValid() || player.getHealth() <= 0 || UtilTime.elapsed(_active.get(key), KICK_TIME)) + if (!player.isValid() || player.getHealth() <= 0 || UtilTime.elapsed(_active.get(key), _kickTime)) { playerIterator.remove(); @@ -192,6 +201,6 @@ public class PerkHorseKick extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java index 058c4c3d8..a66b39c55 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java @@ -10,11 +10,9 @@ import nautilus.game.arcade.kit.Perk; public class SmashSkeletalHorse extends SmashUltimate { - private static final int DURATION = 20000; - public SmashSkeletalHorse() { - super("Bone Storm", new String[] {}, Sound.HORSE_SKELETON_DEATH, DURATION); + super("Bone Storm", new String[] {}, Sound.HORSE_SKELETON_DEATH, 0); } @Override From 59699f930e3bad8060db6ec5745d4da8304124b5 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 28 Apr 2017 16:26:02 +0100 Subject: [PATCH 023/170] Re-implemented triple jumps --- .../src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java index 415a2060b..164794a2e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java @@ -127,7 +127,7 @@ public class PerkDoubleJump extends Perk } } - Recharge.Instance.useForce(player, "Double Jump", 500); + //Recharge.Instance.useForce(player, "Double Jump", 500); } @EventHandler @@ -147,8 +147,8 @@ public class PerkDoubleJump extends Perk if (_recharge > 0 && !Recharge.Instance.usable(player, GetName())) continue; - if (!Recharge.Instance.usable(player, "Double Jump")) - continue; +// if (!Recharge.Instance.usable(player, "Double Jump")) +// continue; if (player.isOnGround() || (UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN)) && UtilBlock.solid(player.getLocation().getBlock()))) player.setAllowFlight(true); From 26d97bf7eb146dffdfa7591ba7bb2853e04813ac Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 28 Apr 2017 19:29:23 +0100 Subject: [PATCH 024/170] Up the water damage check rate --- .../game/arcade/managers/GameFlagManager.java | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java index b7a2119d0..e711f894c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java @@ -1084,41 +1084,40 @@ public class GameFlagManager implements Listener @EventHandler public void WorldWaterDamage(UpdateEvent event) { - if (event.getType() != UpdateType.FAST) - return; - - Game game = Manager.GetGame(); - if (game == null) return; - - if (!game.IsLive()) - return; - - if (game.WorldWaterDamage <= 0) + if (event.getType() != UpdateType.FASTER) { - if (!game.WorldData.GetCustomLocs("WATER_DAMAGE").isEmpty()) - { - game.WorldWaterDamage = 4; - } - else - { - return; - } + return; } - for (GameTeam team : game.GetTeamList()) - for (Player player : team.GetPlayers(true)) - if (player.getLocation().getBlock().getTypeId() == 8 || player.getLocation().getBlock().getRelative(BlockFace.UP).getTypeId() == 8 || - player.getLocation().getBlock().getTypeId() == 9 || player.getLocation().getBlock().getRelative(BlockFace.UP).getTypeId() == 9) - { - //Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.DROWNING, game.WorldWaterDamage, true, false, false, - "Water", "Water Damage"); + Game game = Manager.GetGame(); + if (game == null || !game.IsLive()) + { + return; + } - player.getWorld().playSound(player.getLocation(), - Sound.SPLASH, 0.8f, - 1f + (float) Math.random() / 2); - } + if (game.WorldWaterDamage <= 0 && !game.WorldData.GetCustomLocs("WATER_DAMAGE").isEmpty()) + { + game.WorldWaterDamage = 4; + } + + for (Player player : game.GetPlayers(true)) + { + if (!Recharge.Instance.use(player, "Water Damage", 500, false, false)) + { + continue; + } + + Block block = player.getLocation().getBlock(); + Material lower = block.getType(); + Material upper = block.getRelative(BlockFace.UP).getType(); + + if (lower == Material.WATER || lower == Material.STATIONARY_WATER || upper == Material.WATER || upper == Material.STATIONARY_WATER) + { + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.DROWNING, game.WorldWaterDamage, true, false, false, "Water", "Water Damage"); + player.getWorld().playSound(player.getLocation(), Sound.SPLASH, 0.8f, 1f + (float) Math.random() / 2); + } + } } @EventHandler(priority = EventPriority.LOWEST) From 6beeec20d672c2c30318750c15032a299baa2537 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 28 Apr 2017 19:30:00 +0100 Subject: [PATCH 025/170] Disable morphs when changing kits --- .../game/arcade/game/games/smash/SuperSmash.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index f4d146e8a..727f89b13 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -4,8 +4,12 @@ import com.google.common.collect.Sets; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.Rank; import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.hologram.Hologram; import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.mount.Mount; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -548,6 +552,13 @@ public abstract class SuperSmash extends Game } } + // Deactivate morph if active + Gadget gadget = Manager.getCosmeticManager().getGadgetManager().getActive(player, GadgetType.MORPH); + if (gadget != null) + { + gadget.disable(player); + } + _playerKit.put(player, kit); if (announce) From 8a54e1969529a8136506ed5064192a18502743c8 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 28 Apr 2017 19:30:19 +0100 Subject: [PATCH 026/170] Fix Fissure skipping snow blocks --- .../smash/perks/snowman/PerkArcticAura.java | 6 +++++ .../arcade/kit/perks/data/FissureData.java | 25 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java index 7fd888a68..766b6aa89 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java @@ -2,6 +2,7 @@ package nautilus.game.arcade.game.games.smash.perks.snowman; import java.util.Map; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -56,6 +57,11 @@ public class PerkArcticAura extends Perk for (Block block : blocks.keySet()) { + if (block.getType() == Material.SNOW_BLOCK) + { + continue; + } + Manager.GetBlockRestore().snow(block, (byte) 1, (byte) 1, (int) (_duration * (1 + blocks.get(block))), 250, 0); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java index 3830cdf9a..0d97a9437 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java @@ -3,8 +3,10 @@ package nautilus.game.arcade.kit.perks.data; import java.util.ArrayList; import java.util.HashSet; +import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; @@ -69,12 +71,12 @@ public class FissureData continue; //Move up 1, cant go 2 up - if (UtilBlock.solid(block.getRelative(BlockFace.UP))) + if (isSolid(block.getRelative(BlockFace.UP))) { _loc.add(0, 1, 0); block = _loc.getBlock(); - if (UtilBlock.solid(block.getRelative(BlockFace.UP))) + if (isSolid(block.getRelative(BlockFace.UP))) { return; } @@ -82,12 +84,12 @@ public class FissureData } //Move down 1, cant go 2 down - else if (!UtilBlock.solid(block)) + else if (!isSolid(block)) { _loc.add(0, -1, 0); block = _loc.getBlock(); - if (!UtilBlock.solid(block)) + if (!isSolid(block)) { return; } @@ -139,7 +141,15 @@ public class FissureData if (block.getTypeId() == 2) Host.Manager.GetBlockRestore().add(block, 3, block.getData(), 14000); if (block.getTypeId() == 98) Host.Manager.GetBlockRestore().add(block, 98, (byte) 2, 14000); - Host.Manager.GetBlockRestore().add(up, block.getTypeId(), block.getData(), 10000 - (1000 * _height)); + if (block.getType() == Material.SNOW) + { + Host.Manager.GetBlockRestore().add(block, Material.SNOW_BLOCK.getId(), (byte) 0, 10000 - (1000 * _height)); + Host.Manager.GetBlockRestore().add(up, Material.SNOW_BLOCK.getId(), (byte) 0, 10000 - (1000 * _height)); + } + else + { + Host.Manager.GetBlockRestore().add(up, block.getTypeId(), block.getData(), 10000 - (1000 * _height)); + } _height++; //Effect @@ -212,4 +222,9 @@ public class FissureData _loc = null; _startLoc = null; } + + private boolean isSolid(Block block) + { + return UtilBlock.solid(block) || block.getType() == Material.SNOW; + } } From acb5963dd437dfd8931587b200bec007a018811f Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 29 Apr 2017 23:25:13 +0100 Subject: [PATCH 027/170] Balance changes --- .../game/games/smash/kits/KitSlime.java | 2 +- .../perks/creeper/PerkCreeperExplode.java | 1 + .../smash/perks/enderman/PerkBlockToss.java | 6 ++- .../games/smash/perks/spider/PerkNeedler.java | 4 +- .../smash/perks/spider/PerkSpiderLeap.java | 2 +- .../smash/perks/squid/PerkFishFlurry.java | 45 ++++++------------- 6 files changed, 23 insertions(+), 37 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index d31d0028a..0a5c66d2c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -66,7 +66,7 @@ public class KitSlime extends SmashKit }; private static final ItemStack[] PLAYER_ARMOR = { - null, + new ItemStack(Material.CHAINMAIL_BOOTS), null, new ItemStack(Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_HELMET), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index c6a5c9649..8825ef89f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -312,6 +312,7 @@ public class PerkCreeperExplode extends SmashPerk return; } + event.AddMod(GetName(), event.GetDamage() * -0.25); event.AddKnockback(GetName(), _knockbackMagnitude); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java index 56aa3a4f5..3e48a23da 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java @@ -45,6 +45,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown private int _cooldown; private int _chargeTime; private int _damage; + private int _maxDamage; private float _knockbackMagnitude; private Map _hold = new HashMap<>(); @@ -59,9 +60,10 @@ public class PerkBlockToss extends SmashPerk implements IThrown @Override public void setupValues() { - _cooldown = getPerkTime("Cooldown"); + _cooldown = getPerkInt("Cooldown (ms)"); _chargeTime = getPerkInt("Charge Time (ms)"); _damage = getPerkInt("Damage"); + _maxDamage = getPerkInt("Max Damage"); _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); } @@ -210,7 +212,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, data.getThrown().getVelocity().length() * _damage, true, true, false, UtilEnt.getName(data + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, Math.min(_maxDamage, data.getThrown().getVelocity().length() * _damage), true, true, false, UtilEnt.getName(data .getThrower()), GetName()); // Block to Item diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java index e453fe471..40101f6ab 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java @@ -47,7 +47,7 @@ public class PerkNeedler extends SmashPerk @Override public void setupValues() { - _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownNormal = getPerkInt("Cooldown Normal (ms)"); _cooldownSmash = getPerkInt("Cooldown Smash (ms)"); _damage = getPerkDouble("Damage"); _maxTicks = getPerkInt("Max Ticks"); @@ -88,7 +88,7 @@ public class PerkNeedler extends SmashPerk return; } - _active.put(player.getUniqueId(), 8); + _active.put(player.getUniqueId(), 7); UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java index 984ba2f32..7db5d925c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java @@ -139,7 +139,7 @@ public class PerkSpiderLeap extends Perk UtilAction.velocity(player, 1.0, 0.2, 1.0, true); // Energy - player.setExp(Math.max(0, player.getExp() - _energyJump)); + //player.setExp(Math.max(0, player.getExp() - _energyJump)); // Sound player.getWorld().playSound(player.getLocation(), Sound.SPIDER_IDLE, 1f, 1.5f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java index 184f1b135..a6f230bda 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java @@ -1,11 +1,17 @@ package nautilus.game.arcade.game.games.smash.perks.squid; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -18,30 +24,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.Vector; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.projectile.IThrown; -import mineplex.core.projectile.ProjectileUser; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.*; public class PerkFishFlurry extends SmashPerk implements IThrown { @@ -157,7 +140,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown // particles for (Block block : data.Blocks) { - UtilParticle.PlayParticle(ParticleType.SPLASH, block.getLocation().add(0.5, 1, 0.5), 0.25f, 0, 0.25f, 0, 3, ViewDist.LONG, UtilServer.getPlayers()); + UtilParticle.PlayParticleToAll(ParticleType.SPLASH, block.getLocation().add(0.5, 1, 0.5), 0.25f, 0, 0.25f, 0, 1, ViewDist.LONG); } // sound From 0f5fcc767014977742dec2ddd6b9c289198f48a6 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 10:36:45 +0100 Subject: [PATCH 028/170] Remove entity bots --- .../game/games/smash/SuperSmashTraining.java | 4 +- .../{training => }/TrainingGameModule.java | 66 +-------- .../game/modules/training/TrainingBot.java | 138 ------------------ 3 files changed, 2 insertions(+), 206 deletions(-) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/{training => }/TrainingGameModule.java (84%) delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java index 6eeb2b6a8..064ce150a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -11,8 +11,7 @@ import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; -import nautilus.game.arcade.game.modules.training.TrainingBot; -import nautilus.game.arcade.game.modules.training.TrainingGameModule; +import nautilus.game.arcade.game.modules.TrainingGameModule; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -62,7 +61,6 @@ public class SuperSmashTraining extends SuperSmash new TrainingGameModule() .setSkillFunction(_safeFunction) .setDamageFunction(_safeFunction) - .addBot(TrainingBot.class) .register(this); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java similarity index 84% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java index c90fe0fce..3305ba089 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingGameModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java @@ -1,6 +1,5 @@ -package nautilus.game.arcade.game.modules.training; +package nautilus.game.arcade.game.modules; -import mineplex.core.command.CommandCenter; import mineplex.core.common.events.EntityVelocityChangeEvent; import mineplex.core.common.util.*; import mineplex.core.itemstack.ItemBuilder; @@ -11,7 +10,6 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.modules.Module; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.ProgressingKit; import nautilus.game.arcade.managers.LobbyEnt; @@ -47,14 +45,10 @@ public class TrainingGameModule extends Module private Function _teamFunction; private Function _skillFunction; private Function _damageFunction; - private final Set> _botClasses; - private final Set _bots; public TrainingGameModule() { _kits = new HashSet<>(); - _botClasses = new HashSet<>(); - _bots = new HashSet<>(); } @EventHandler @@ -84,37 +78,6 @@ public class TrainingGameModule extends Module UtilEnt.CreatureLook(entity.GetEnt(), average); } - Map> map = getGame().WorldData.GetAllCustomLocs(); - int j = 0; - - for (Map.Entry> entry : map.entrySet()) - { - String s = entry.getKey(); - - if (s.startsWith("BOT")) - { - String[] split = s.split(" "); - - if (split.length < 2) - { - continue; - } - - String clazzName = split[1]; - - for (Class clazz : _botClasses) - { - if (clazzName.equals(clazz.getSimpleName())) - { - for (Location location : entry.getValue()) - { - spawnBot(clazz, location, ++j); - } - } - } - } - } - getGame().CreatureAllowOverride = false; } @@ -126,11 +89,6 @@ public class TrainingGameModule extends Module lobbyEnt.GetEnt().remove(); } - for (TrainingBot bot : _bots) - { - bot.cleanup(); - } - _kits.clear(); } @@ -367,22 +325,6 @@ public class TrainingGameModule extends Module } } - private T spawnBot(Class clazz, Location location, int number) - { - try - { - T bot = clazz.getConstructor(TrainingGameModule.class, Location.class, int.class).newInstance(this, location, number); - _bots.add(bot); - return bot; - } - catch (Exception e) - { - e.printStackTrace(); - } - - return null; - } - public TrainingGameModule setTeamFunction(Function function) { _teamFunction = function; @@ -401,12 +343,6 @@ public class TrainingGameModule extends Module return this; } - public TrainingGameModule addBot(Class clazz) - { - _botClasses.add(clazz); - return this; - } - private LobbyEnt getFromEntity(Entity entity) { for (LobbyEnt lobbyEnt : _kits) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java deleted file mode 100644 index c311b5d35..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/training/TrainingBot.java +++ /dev/null @@ -1,138 +0,0 @@ -package nautilus.game.arcade.game.modules.training; - -import mineplex.core.common.skin.SkinData; -import mineplex.core.common.util.*; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.DeathMessageType; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; - -import java.text.DecimalFormat; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -public class TrainingBot implements Listener -{ - - private static final SkinData[] SKIN_DATAS = - { - SkinData.SNOWMAN, - SkinData.MOOSHROOM, - SkinData.WITCH - }; - private static final int DAMAGE_HOLOGRAMS_LIFE = 40; - private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.0"); - private static final long RESPAWN_TIME = TimeUnit.SECONDS.toMillis(5); - - private TrainingGameModule _module; - private Location _location; - private int _number; - - protected ArmorStand _stand; - private long _lastDeath; - - private final Set _damageHolograms; - - public TrainingBot(TrainingGameModule module, Location location, int number) - { - _module = module; - _location = location; - _number = number; - _lastDeath = System.currentTimeMillis(); - _damageHolograms = new HashSet<>(); - - UtilServer.RegisterEvents(this); - } - - public void cleanup() - { - UtilServer.Unregister(this); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void botDamage(CustomDamageEvent event) - { - if (_stand == null || !_stand.equals(event.GetDamageeEntity())) - { - return; - } - - spawnDamageHologram(event.GetDamage()); - } - - @EventHandler - public void botDeath(CombatDeathEvent event) - { - if (_stand == null || !_stand.equals(event.GetEvent().getEntity())) - { - return; - } - - event.SetBroadcastType(DeathMessageType.Detailed); - _stand.remove(); - } - - private void spawnDamageHologram(double damage) - { - String damageSting = DECIMAL_FORMAT.format(damage); - Location location = UtilAlg.getRandomLocation(_stand.getLocation().add(0, 1, 0), 1, 0, 1); - ArmorStand stand = location.getWorld().spawn(location, ArmorStand.class); - - stand.setVisible(false); - stand.setGravity(false); - stand.setCustomName(C.cRedB + "-" + damageSting); - stand.setCustomNameVisible(true); - - _damageHolograms.add(stand); - } - - @EventHandler - public void cleanupDamageHolograms(UpdateEvent event) - { - if (event.getType() != UpdateType.FASTEST) - { - return; - } - - Iterator iterator = _damageHolograms.iterator(); - - while (iterator.hasNext()) - { - ArmorStand stand = iterator.next(); - - if (stand.getTicksLived() > DAMAGE_HOLOGRAMS_LIFE) - { - stand.remove(); - iterator.remove(); - continue; - } - - stand.teleport(stand.getLocation().add(0, 0.25, 0)); - } - } - - @EventHandler - public void respawn(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC || !UtilTime.elapsed(_lastDeath, RESPAWN_TIME)) - { - return; - } - - _lastDeath = System.currentTimeMillis(); - _stand = _location.getWorld().spawn(_location, ArmorStand.class); - - DisguisePlayer disguise = new DisguisePlayer(_stand, C.cYellowB + "Bot #" + _number, SKIN_DATAS[UtilMath.r(SKIN_DATAS.length)]); - disguise.setSendSkinDataToSelf(false); - _module.getGame().getArcadeManager().GetDisguise().disguise(disguise); - } -} From 6d105a04993f859b36b6ea1135ee3773bb0fe359 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 10:37:11 +0100 Subject: [PATCH 029/170] All remaining kits converted to Google Sheets --- .../arcade/game/games/smash/kits/KitCow.java | 4 +- .../game/games/smash/kits/KitGuardian.java | 4 +- .../game/games/smash/kits/KitMagmaCube.java | 4 +- .../arcade/game/games/smash/kits/KitPig.java | 4 +- .../game/games/smash/kits/KitSheep.java | 6 +- .../game/games/smash/kits/KitSkySquid.java | 6 +- .../games/smash/kits/KitWitherSkeleton.java | 4 +- .../game/games/smash/kits/KitZombie.java | 10 +-- .../games/smash/perks/chicken/PerkFlap.java | 2 +- .../smash/perks/cow/PerkCowAngryHerd.java | 43 ++++++---- .../smash/perks/cow/PerkCowMilkSpiral.java | 23 ++++-- .../smash/perks/cow/PerkCowStampede.java | 11 ++- .../game/games/smash/perks/cow/SmashCow.java | 22 +++-- .../smash/perks/guardian/PerkTargetLazer.java | 48 +++++------ .../smash/perks/guardian/PerkThorns.java | 20 +++-- .../smash/perks/guardian/PerkWaterSplash.java | 82 +++++++++---------- .../perks/guardian/PerkWhirlpoolBlade.java | 30 ++++--- .../smash/perks/guardian/SmashGuardian.java | 25 ++++-- .../smash/perks/magmacube/PerkFlameDash.java | 27 ++++-- .../smash/perks/magmacube/PerkMagmaBlast.java | 36 +++++--- .../smash/perks/magmacube/PerkMagmaBoost.java | 30 ++++--- .../smash/perks/magmacube/SmashMagmacube.java | 18 +--- .../smash/perks/pig/PerkPigBaconBomb.java | 45 ++++++---- .../smash/perks/pig/PerkPigBaconBounce.java | 30 ++++--- .../games/smash/perks/pig/PerkPigZombie.java | 10 ++- .../game/games/smash/perks/pig/SmashPig.java | 6 +- .../games/smash/perks/sheep/SmashSheep.java | 20 +++-- .../smash/perks/squid/PerkFishFlurry.java | 30 ++++--- .../games/smash/perks/squid/PerkInkBlast.java | 26 +++--- .../smash/perks/squid/PerkSuperSquid.java | 15 +++- .../games/smash/perks/squid/SmashSquid.java | 37 ++++++--- .../perks/witherskeleton/PerkWitherImage.java | 23 ++++-- .../perks/witherskeleton/PerkWitherSkull.java | 23 ++++-- .../witherskeleton/SmashWitherSkeleton.java | 4 +- .../smash/perks/zombie/PerkOvercharge.java | 12 ++- .../smash/perks/zombie/PerkZombieBile.java | 25 ++++-- .../arcade/kit/perks/PerkDeathsGrasp.java | 17 ++-- .../arcade/kit/perks/PerkKnockbackArrow.java | 2 +- .../game/arcade/kit/perks/PerkLazer.java | 37 +++++---- .../game/arcade/kit/perks/PerkWoolBomb.java | 43 ++++++---- .../game/arcade/kit/perks/PerkWoolCloud.java | 35 +++++--- 41 files changed, 555 insertions(+), 344 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java index 33b49741d..7d9c1bf3f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java @@ -26,8 +26,8 @@ public class KitCow extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.1, 0.25, 6.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkCowStampede(), new PerkCowAngryHerd(), new PerkCowMilkSpiral(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java index 45129c462..6d81d90b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java @@ -26,8 +26,8 @@ public class KitGuardian extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(4, 1.25, 0.25, 4.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWhirlpoolBlade(), new PerkWaterSplash(), new PerkTargetLazer(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java index e252a2e64..a23130042 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java @@ -30,8 +30,8 @@ public class KitMagmaCube extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.75, 0.35, 5), - new PerkDoubleJump("Double Jump", 1.2, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkMagmaBoost(), new PerkMagmaBlast(), new PerkFlameDash(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java index c97306a50..fb92a55d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java @@ -33,8 +33,8 @@ public class KitPig extends SmashKit private static final float ENERGY_PER_TICK_SMASH = 0.02F; private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkPigBaconBounce(), new PerkPigBaconBomb(), new PerkPigZombie(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java index 00dd730ee..7d6c3403d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java @@ -27,9 +27,9 @@ public class KitSheep extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.7, 0.25, 5), - new PerkDoubleJump("Double Jump", 1, 1, false), - new PerkLazer(40, 7000), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkLazer(), new PerkWoolBomb(), new PerkWoolCloud(), new SmashSheep() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java index 7e0c0bf36..a831fa700 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java @@ -26,10 +26,10 @@ public class KitSkySquid extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSuperSquid(), - new PerkInkBlast(7, 2), + new PerkInkBlast(), new PerkFishFlurry(), new SmashSquid() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java index 8efef7fe6..5c9587963 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java @@ -27,8 +27,8 @@ public class KitWitherSkeleton extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.2, 0.3, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWitherSkull(), new PerkWitherImage(), new SmashWitherSkeleton() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java index 62ea7dc0a..5fd207064 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java @@ -32,11 +32,11 @@ public class KitZombie extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.25, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkFletcher(2, 2, false), - new PerkKnockbackArrow(1.5), - new PerkOvercharge(6, 250, true), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), + new PerkOvercharge(), new PerkZombieBile(), new PerkDeathsGrasp(), new SmashZombie() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java index 8dcf4877c..507104549 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java @@ -36,7 +36,7 @@ public class PerkFlap extends SmashPerk @Override public void setupValues() { - _cooldown = getPerkTime("Cooldown (ms)"); + _cooldown = getPerkInt("Cooldown (ms)"); _energyPerTick = getPerkFloat("Energy Per Tick"); _energyPerFlap = getPerkFloat("Energy Per Flap"); _power = getPerkDouble("Power"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java index 18ea1df4e..b653ee985 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java @@ -37,14 +37,14 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowAngryHerd extends SmashPerk { - private static final int COOLDOWN_NORMAL = 13000; - private static final int COOLDOWN_SMASH = 6000; - private static final int MAX_TIME = 2500; - private static final int STUCK_TIME = 300; - private static final int FORCE_MOVE = 350; - private static final float HIT_BOX_RADIUS = 2.2F; - private static final int HIT_FREQUENCY = 600; - private static final int DAMAGE = 5; + private int _cooldownNormal; + private int _cooldownSmash; + private int _maxTime; + private int _stuckTime; + private int _forceMove; + private float _hitBoxRadius; + private int _hitFrequency; + private int _damage; private List _active = new ArrayList<>(); @@ -53,6 +53,19 @@ public class PerkCowAngryHerd extends SmashPerk super("Angry Herd", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Angry Herd" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _maxTime = getPerkInt("Max Time (ms)"); + _stuckTime = getPerkInt("Stuck Time (ms)"); + _forceMove = getPerkInt("Force Move (ms)"); + _hitBoxRadius = getPerkFloat("Hit Box Radius"); + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void shoot(PlayerInteractEvent event) { @@ -83,7 +96,7 @@ public class PerkCowAngryHerd extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, true, true)) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, true, true)) { return; } @@ -129,7 +142,7 @@ public class PerkCowAngryHerd extends SmashPerk DataCowCharge data = activeIter.next(); // Expire - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { if (data.Cow.isValid()) { @@ -149,7 +162,7 @@ public class PerkCowAngryHerd extends SmashPerk } // Stuck Remove - if (UtilTime.elapsed(data.LastMoveTime, STUCK_TIME)) + if (UtilTime.elapsed(data.LastMoveTime, _stuckTime)) { if (data.Cow.isValid()) { @@ -172,7 +185,7 @@ public class PerkCowAngryHerd extends SmashPerk } // Move - if (UtilTime.elapsed(data.LastMoveTime, FORCE_MOVE) && UtilEnt.isGrounded(data.Cow)) + if (UtilTime.elapsed(data.LastMoveTime, _forceMove) && UtilEnt.isGrounded(data.Cow)) { data.Cow.setVelocity(data.Direction.clone().add(new Vector(0, 0.75, 0))); } @@ -199,12 +212,12 @@ public class PerkCowAngryHerd extends SmashPerk continue; } - if (UtilMath.offset(player, data.Cow) < HIT_BOX_RADIUS) + if (UtilMath.offset(player, data.Cow) < _hitBoxRadius) { - if (Recharge.Instance.use(player, "Hit by " + data.Player.getName(), HIT_FREQUENCY, false, false)) + if (Recharge.Instance.use(player, "Hit by " + data.Player.getName(), _hitFrequency, false, false)) { // Damage Event - Manager.GetDamage().NewDamageEvent(player, data.Player, null, data.Cow.getLocation(), DamageCause.CUSTOM, DAMAGE, true, true, false, UtilEnt.getName(data.Player), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Player, null, data.Cow.getLocation(), DamageCause.CUSTOM, _damage, true, true, false, UtilEnt.getName(data.Player), GetName()); UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, data.Cow.getLocation().add(0, 1, 0), 1f, 1f, 1f, 0, 12, ViewDist.LONG); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java index e909decf2..e1bd94baa 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java @@ -30,10 +30,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowMilkSpiral extends SmashPerk { - private static final int COOLDOWN_NORMAL = 11000; - private static final int COOLDOWN_SMASH = 6000; - private static final int HIT_BOX_RADIUS = 2; - private static final int DAMAGE = 6; + private int _cooldownNormal; + private int _cooldownSmash; + private int _hitBoxRadius; + private int _damage; private Set _active = new HashSet<>(); @@ -42,6 +42,15 @@ public class PerkCowMilkSpiral extends SmashPerk super("Milk Spiral", new String[] { C.cYellow + "Right Click" + C.cGray + " with Spade to " + C.cGreen + "Milk Spiral", C.cGray + "Crouch to cancel movement for Milk Spiral" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _hitBoxRadius = getPerkInt("Hit Box Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -72,7 +81,7 @@ public class PerkCowMilkSpiral extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, true, true)) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, true, true)) { return; } @@ -109,9 +118,9 @@ public class PerkCowMilkSpiral extends SmashPerk continue; } - if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Spiral) < HIT_BOX_RADIUS) + if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Spiral) < _hitBoxRadius) { - Manager.GetDamage().NewDamageEvent(player, data.Player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(isSuperActive(player) ? ParticleType.RED_DUST : ParticleType.FIREWORKS_SPARK, player.getLocation().add(0, 1, 0), 0.2f, 0.2f, 0.2f, 0.3f, 30, ViewDist.LONG, UtilServer.getPlayers()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java index 5b7a16647..b95f1d738 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java @@ -30,6 +30,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowStampede extends SmashPerk { + + private long _speedTime; + private Map _sprintTime = new HashMap<>(); private Map _sprintStr = new HashMap<>(); @@ -38,6 +41,12 @@ public class PerkCowStampede extends SmashPerk super("Stampede", new String[] { C.cGray + "Build up Speed Levels as you sprint.", C.cGray + "+1 damage for each Speed Level.", }); } + @Override + public void setupValues() + { + _speedTime = getPerkTime("Speed Time"); + } + @EventHandler public void update(UpdateEvent event) { @@ -77,7 +86,7 @@ public class PerkCowStampede extends SmashPerk } // Upgrade Speed - if (!UtilTime.elapsed(time, 3000)) + if (!UtilTime.elapsed(time, _speedTime)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java index d3aaa527d..70da2c10e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java @@ -14,13 +14,21 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashCow extends SmashUltimate { - private static final int DURATION = 30000; - private static final int DAMAGE_BUFF = 1; - private static final int HEALTH = 30; + private int _damageBuff; + private int _health; public SmashCow() { - super("Mooshroom Madness", new String[] {}, Sound.COW_IDLE, DURATION); + super("Mooshroom Madness", new String[] {}, Sound.COW_IDLE, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _damageBuff = getPerkInt("Damage Buff"); + _health = getPerkInt("Health"); } @Override @@ -33,8 +41,8 @@ public class SmashCow extends SmashUltimate kit.disguise(player, DisguiseMooshroom.class); // Health - player.setMaxHealth(HEALTH); - player.setHealth(HEALTH); + player.setMaxHealth(_health); + player.setHealth(_health); // Sound player.getWorld().playSound(player.getLocation(), Sound.COW_HURT, 5f, 0.25f); @@ -67,7 +75,7 @@ public class SmashCow extends SmashUltimate if (isUsingUltimate(player)) { - event.AddMod(player.getName(), GetName(), DAMAGE_BUFF, false); + event.AddMod(player.getName(), GetName(), _damageBuff, false); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java index b90cdfd24..3930d138f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java @@ -37,11 +37,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkTargetLazer extends SmashPerk { - private static final int COOLDOWN = 15000; - private static final int MAX_RANGE = 11; - private static final int MAX_TIME = 8000; - private static final int DAMAGE_INCREASE = 3; - private static final int KNOCKBACK_INCREASE = 1; + private int _cooldown; + private int _maxRange; + private int _maxTime; + private int _damageIncrease; + private int _knockbackIncrease; private Set _data = new HashSet<>(); @@ -49,7 +49,17 @@ public class PerkTargetLazer extends SmashPerk { super("Target Laser", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Pickaxe to use " + C.cGreen + "Target Laser" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _maxRange = getPerkInt("Max Range"); + _maxTime = getPerkTime("Max Time"); + _damageIncrease = getPerkInt("Damage Increase"); + _knockbackIncrease = getPerkInt("Knockback Increase"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -103,7 +113,7 @@ public class PerkTargetLazer extends SmashPerk double d = UtilMath.offset(player, other); - if (d > MAX_RANGE) + if (d > _maxRange) { continue; } @@ -121,7 +131,7 @@ public class PerkTargetLazer extends SmashPerk { if (data.getAttacker().equals(player)) { - if (data.getTimeElapsed() < MAX_TIME) + if (data.getTimeElapsed() < _maxTime) { return; } @@ -180,7 +190,7 @@ public class PerkTargetLazer extends SmashPerk UtilParticle.PlayParticle(ParticleType.MAGIC_CRIT, data.getTarget().getLocation().add(0, 0.5, 0.5), 1F, 0.5F, 1F, 0.1F, 10, ViewDist.LONG, data.getAttacker()); - if (UtilMath.offset(data.getTarget(), data.getAttacker()) > MAX_RANGE || data.getTimeElapsed() > MAX_TIME) + if (UtilMath.offset(data.getTarget(), data.getAttacker()) > _maxRange || data.getTimeElapsed() > _maxTime) { long time = data.getTimeElapsed() / 1000; double damage = 0.5 * time; @@ -192,7 +202,7 @@ public class PerkTargetLazer extends SmashPerk data.getAttacker().sendMessage(F.main("Game", "Your laser broke, dealing damage to " + F.name(data.getTarget().getName())) + "."); Manager.GetDamage().NewDamageEvent(data.getTarget(), data.getAttacker(), null, DamageCause.CUSTOM, damage, false, true, false, data.getAttacker().getName(), GetName()); - Recharge.Instance.use(data.getAttacker(), GetName(), COOLDOWN, true, true); + Recharge.Instance.use(data.getAttacker(), GetName(), _cooldown, true, true); iterator.remove(); } @@ -219,8 +229,8 @@ public class PerkTargetLazer extends SmashPerk if (data.getAttacker().equals(damager) && data.getTarget().equals(damagee)) { - event.AddMod(GetName(), DAMAGE_INCREASE); - event.AddKnockback(GetName(), KNOCKBACK_INCREASE); + event.AddMod(GetName(), _damageIncrease); + event.AddKnockback(GetName(), _knockbackIncrease); data.getAttacker().playEffect(damagee.getLocation().add(0, 0.5, 0), Effect.STEP_SOUND, Material.REDSTONE_BLOCK); } } @@ -230,18 +240,8 @@ public class PerkTargetLazer extends SmashPerk public void death(PlayerDeathEvent event) { Player player = event.getEntity(); - - Iterator iterator = _data.iterator(); - - while (iterator.hasNext()) - { - TargetLazerData data = iterator.next(); - - if (data.getTarget().equals(player) || data.getAttacker().equals(player)) - { - iterator.remove(); - } - } + + _data.removeIf(data -> data.getTarget().equals(player) || data.getAttacker().equals(player)); } private void setLazerTarget(Player disguised, Player target) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java index 4e1e99010..a590a3f83 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java @@ -13,15 +13,23 @@ import nautilus.game.arcade.kit.Perk; public class PerkThorns extends Perk { - private static final int MAX_HEALTH = 10; - private static final float DAMAGE_DECREASE = 0.66F; - private static final float KNOCKBACK_DECREASE = 0.66F; + private int _maxHealth; + private double _damageDecrease; + private double _knockbackDecrease; public PerkThorns() { super("Thorns", new String[] { C.cGray + "Takes 66% less damage and knockback from projectiles", C.cGray + "when under 10 health."}); } + @Override + public void setupValues() + { + _maxHealth = getPerkInt("Max Health"); + _damageDecrease = getPerkPercentage("Damage Decrease"); + _knockbackDecrease = getPerkPercentage("Knockback Decrease"); + } + @EventHandler(priority = EventPriority.HIGHEST) public void damage(CustomDamageEvent event) { @@ -38,10 +46,10 @@ public class PerkThorns extends Perk return; } - if (player.getHealth() < MAX_HEALTH) + if (player.getHealth() < _maxHealth) { - event.AddMult(GetName(), null, DAMAGE_DECREASE, false); - event.AddKnockback(GetName(), KNOCKBACK_DECREASE); + event.AddMult(GetName(), null, _damageDecrease, false); + event.AddKnockback(GetName(), _knockbackDecrease); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java index 653344a77..40abe0e46 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java @@ -1,13 +1,15 @@ package nautilus.game.arcade.game.games.smash.perks.guardian; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.TeamSuperSmash; +import nautilus.game.arcade.kit.Perk; import org.bukkit.Effect; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -17,36 +19,17 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.Vector; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; - -import nautilus.game.arcade.game.games.smash.TeamSuperSmash; -import nautilus.game.arcade.kit.Perk; +import java.util.*; public class PerkWaterSplash extends Perk { - private static final int COOLDOWN = 12000; - private static final int VELOCITY_Y = 1; - private static final int RADIUS = 5; - private static final int MIN_AIR_TIME = 750; - private static final int SECOND_BOOST_TIME = 800; - private static final int DAMAGE = 12; + private int _cooldown; + private float _velocityY; + private int _radius; + private int _minAirTime; + private int _secondBoostTime; + private int _damage; private Map _active = new HashMap<>(); private Set _usedSecondBoost = new HashSet<>(); @@ -55,7 +38,18 @@ public class PerkWaterSplash extends Perk { super("Water Splash", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Sword to use " + C.cGreen + "Water Splash", C.cYellow + "Hold Block" + C.cGray + " to " + C.cGreen + "Bounce higher with Water Splash" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocityY = getPerkFloat("Y Velocity"); + _radius = getPerkInt("Radius"); + _minAirTime = getPerkInt("Min Air Time (ms)"); + _secondBoostTime = getPerkInt("Second Boost Time (ms)"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -86,16 +80,16 @@ public class PerkWaterSplash extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } - UtilAction.velocity(player, new Vector(0, VELOCITY_Y, 0)); + UtilAction.velocity(player, new Vector(0, _velocityY, 0)); _active.put(player.getUniqueId(), System.currentTimeMillis()); List team = TeamSuperSmash.getTeam(Manager, player, true); - for (Player other : UtilPlayer.getNearby(player.getLocation(), RADIUS)) + for (Player other : UtilPlayer.getNearby(player.getLocation(), _radius)) { if (team.contains(other)) { @@ -144,14 +138,14 @@ public class PerkWaterSplash extends Perk UtilParticle.PlayParticleToAll(ParticleType.DRIP_WATER, player.getLocation(), 0.5F, 0.5F, 0.5F, 0.01F, 10, ViewDist.LONG); - if (UtilEnt.isGrounded(player) && UtilTime.elapsed(_active.get(uuid), MIN_AIR_TIME)) + if (UtilEnt.isGrounded(player) && UtilTime.elapsed(_active.get(uuid), _minAirTime)) { iterator.remove(); _usedSecondBoost.remove(uuid); UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, player.getEyeLocation(), 0, 0, 0, 0.5F, 50, ViewDist.LONG); - for (Block block : UtilBlock.getInRadius(player.getLocation(), RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(player.getLocation(), _radius).keySet()) { if (Math.random() > 0.5) { @@ -163,7 +157,7 @@ public class PerkWaterSplash extends Perk player.getWorld().playSound(player.getLocation(), Sound.SPLASH2, 2, 0); - Map nearby = UtilPlayer.getInRadius(player.getLocation(), RADIUS); + Map nearby = UtilPlayer.getInRadius(player.getLocation(), _radius); List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : nearby.keySet()) @@ -175,11 +169,11 @@ public class PerkWaterSplash extends Perk double power = nearby.get(other); - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * power, true, true, false, player.getName(), GetName()); - Manager.GetCondition().Factory().Falling(GetName(), other, player, DAMAGE, false, true); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * power, true, true, false, player.getName(), GetName()); + Manager.GetCondition().Factory().Falling(GetName(), other, player, _damage, false, true); } } - else if (UtilTime.elapsed(_active.get(uuid), SECOND_BOOST_TIME) && !_usedSecondBoost.contains(uuid) && player.isBlocking()) + else if (UtilTime.elapsed(_active.get(uuid), _secondBoostTime) && !_usedSecondBoost.contains(uuid) && player.isBlocking()) { _usedSecondBoost.add(uuid); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java index e738a721a..337655ec7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java @@ -37,11 +37,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkWhirlpoolBlade extends Perk implements IThrown { - private static final int COOLDOWN = 5000; - private static final int EXPIRE_TIME = 3000; - private static final float VELOCITY = 1.6F; - private static final float HIT_BOX = 0.5F; - private static final int DAMAGE = 5; + private int _cooldown; + private int _expireTime; + private float _velocity; + private float _hitBox; + private int _damage; private Set _items = new HashSet<>(); @@ -49,7 +49,17 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown { super("Whirlpool Axe", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Whirlpool Axe" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _expireTime = getPerkTime("Expire Time"); + _velocity = getPerkFloat("Velocity"); + _hitBox = getPerkFloat("Hit Box"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -80,7 +90,7 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -89,8 +99,8 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown Item item = player.getWorld().dropItem(player.getEyeLocation(), new ItemStack(Material.PRISMARINE_SHARD)); - item.setVelocity(player.getLocation().getDirection().multiply(VELOCITY)); - Manager.GetProjectile().AddThrow(item, player, this, EXPIRE_TIME, true, true, true, false, false, HIT_BOX); + item.setVelocity(player.getLocation().getDirection().multiply(_velocity)); + Manager.GetProjectile().AddThrow(item, player, this, _expireTime, true, true, true, false, false, _hitBox); _items.add(item); } @@ -131,7 +141,7 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown return; } - CustomDamageEvent event = Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, DAMAGE, false, true, true, data.getThrower().getName(), GetName()); + CustomDamageEvent event = Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damage, false, true, true, data.getThrower().getName(), GetName()); if(event.IsCancelled()) { return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java index 78e133ba2..952490cf2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java @@ -27,16 +27,25 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashGuardian extends SmashUltimate { - private static final int DURATION = 10000; private static final int GUARDIANS = 4; - private static final int RADIUS = 15; - private static final int DAMAGE = 40; + + private int _radius; + private int _damage; private Set _data = new HashSet<>(); public SmashGuardian() { - super("Rise of the Guardian", new String[] {}, Sound.AMBIENCE_THUNDER, DURATION); + super("Rise of the Guardian", new String[] {}, Sound.AMBIENCE_THUNDER, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _radius = getPerkInt("Radius"); + _damage = getPerkInt("Damage"); } @Override @@ -46,7 +55,7 @@ public class SmashGuardian extends SmashUltimate Manager.GetGame().CreatureAllowOverride = true; - _data.add(new SmashAnimationData(Manager, player, GUARDIANS, DURATION)); + _data.add(new SmashAnimationData(Manager, player, GUARDIANS, getLength())); Manager.GetGame().CreatureAllowOverride = false; } @@ -64,7 +73,7 @@ public class SmashGuardian extends SmashUltimate if (data.getPlayer().equals(player)) { - Map inRadius = UtilPlayer.getInRadius(data.getTarget().getLocation(), RADIUS); + Map inRadius = UtilPlayer.getInRadius(data.getTarget().getLocation(), _radius); List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : inRadius.keySet()) { @@ -73,11 +82,11 @@ public class SmashGuardian extends SmashUltimate continue; } - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * inRadius.get(other), true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * inRadius.get(other), true, true, false, player.getName(), GetName()); } data.getTarget().getWorld().strikeLightningEffect(data.getTarget().getLocation()); - UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, data.getTarget().getLocation().add(0, 2, 0), RADIUS, 1, RADIUS, 1F, 30, ViewDist.MAX); + UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, data.getTarget().getLocation().add(0, 2, 0), _radius, 1, _radius, 1F, 30, ViewDist.MAX); player.getWorld().playSound(data.getTarget().getLocation(), Sound.EXPLODE, 5, 0.5F); data.getElder().remove(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java index f8030aaeb..45fe2b378 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java @@ -35,10 +35,10 @@ import nautilus.game.arcade.kit.perks.data.FireflyData; public class PerkFlameDash extends Perk { - private static final int COOLDOWN = 8000; - private static final int TIME = 800; - private static final int DAMAGE_RADIUS = 3; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _time; + private int _damageRadius; + private int _knockbackMagnitude; private Set _data = new HashSet(); @@ -47,6 +47,15 @@ public class PerkFlameDash extends Perk super("Flame Dash", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Flame Dash" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _time = getPerkInt("Time (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -96,14 +105,14 @@ public class PerkFlameDash extends Perk } else { - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); } return; } Recharge.Instance.recharge(player, GetName()); - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); _data.add(new FireflyData(player)); @@ -130,7 +139,7 @@ public class PerkFlameDash extends Perk FireflyData data = dataIterator.next(); // Move - if (!UtilTime.elapsed(data.Time, TIME)) + if (!UtilTime.elapsed(data.Time, _time)) { Vector vel = data.Location.getDirection(); vel.setY(0); @@ -148,7 +157,7 @@ public class PerkFlameDash extends Perk // End else { - for (Player other : UtilPlayer.getNearby(data.Player.getLocation(), DAMAGE_RADIUS)) + for (Player other : UtilPlayer.getNearby(data.Player.getLocation(), _damageRadius)) { if (other.equals(data.Player)) { @@ -191,6 +200,6 @@ public class PerkFlameDash extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java index 036734ecd..108b0f715 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java @@ -43,13 +43,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkMagmaBlast extends Perk { - private static final int COOLDOWN = 6000; - private static final float FIREBALL_VELOCITY = 0.2F; - private static final int FIRE_TICKS = 40; - private static final int VELOCITY_RADIUS = 8; - private static final int FIRE_RADIUS = 2; - private static final int DAMAGE = 8; - + private int _cooldown = 6000; + private float _velocity = 0.2F; + private int _fireTicks = 40; + private int _velocityRadius = 8; + private int _fireRadius = 2; + private int _damage = 8; private Map _proj = new HashMap<>(); @@ -58,6 +57,17 @@ public class PerkMagmaBlast extends Perk super("Magma Blast", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Magma Blast" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocity = getPerkFloat("Velocity"); + _fireTicks = getPerkInt("Fire Ticks"); + _velocityRadius = getPerkInt("Velocity Radius"); + _fireRadius = getPerkInt("Fire Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Shoot(PlayerInteractEvent event) { @@ -88,7 +98,7 @@ public class PerkMagmaBlast extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -103,7 +113,7 @@ public class PerkMagmaBlast extends Perk ball.setBounce(false); ball.teleport(player.getEyeLocation().add(player.getLocation().getDirection().multiply(1))); - Vector dir = player.getLocation().getDirection().multiply(FIREBALL_VELOCITY); + Vector dir = player.getLocation().getDirection().multiply(_velocity); EntityLargeFireball eFireball = ((CraftLargeFireball) ball).getHandle(); eFireball.dirX = dir.getX(); @@ -168,7 +178,7 @@ public class PerkMagmaBlast extends Perk Player shooter = (Player) proj.getShooter(); // Velocity Players - Map hitMap = UtilPlayer.getInRadius(proj.getLocation(), VELOCITY_RADIUS); + Map hitMap = UtilPlayer.getInRadius(proj.getLocation(), _velocityRadius); List team = TeamSuperSmash.getTeam(Manager, shooter, false); for (Player cur : hitMap.keySet()) @@ -182,7 +192,7 @@ public class PerkMagmaBlast extends Perk double range = hitMap.get(cur); - Manager.GetDamage().NewDamageEvent(cur, shooter, proj, DamageCause.PROJECTILE, range * DAMAGE, false, true, false, shooter.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, shooter, proj, DamageCause.PROJECTILE, range * _damage, false, true, false, shooter.getName(), GetName()); // Velocity UtilAction.velocity(cur, UtilAlg.getTrajectory(proj.getLocation().add(0, -0.5, 0), cur.getEyeLocation()), 1 + 2 * range, false, 0, 0.2 + 0.4 * range, 1.2, true); @@ -222,9 +232,9 @@ public class PerkMagmaBlast extends Perk } } - if (UtilMath.offset(player, proj) < FIRE_RADIUS) + if (UtilMath.offset(player, proj) < _fireRadius) { - player.setFireTicks(FIRE_TICKS); + player.setFireTicks(_fireTicks); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java index 3b06175aa..9a00a8894 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java @@ -28,13 +28,21 @@ import nautilus.game.arcade.kit.Perk; public class PerkMagmaBoost extends Perk { - private static final int MAX_STACKS = 3; + private int _maxStacks; private Map _kills = new HashMap<>(); public PerkMagmaBoost() { - super("Fuel the Fire", new String[] { C.cGray + "Kills give +1 Damage, -15% Knockback Taken and +1 Size.", C.cGray + "Kill bonuses can stack " + MAX_STACKS + " times, and reset on death.", }); + super("Fuel the Fire", new String[0]); + } + + @Override + public void setupValues() + { + _maxStacks = getPerkInt("Max Stacks"); + + setDesc(C.cGray + "Kills give +1 Damage, -15% Knockback Taken and +1 Size.", C.cGray + "Kill bonuses can stack " + _maxStacks + " times, and reset on death."); } @EventHandler @@ -50,7 +58,7 @@ public class PerkMagmaBoost extends Perk public void kill(CombatDeathEvent event) { Player killed = (Player) event.GetEvent().getEntity(); - + _kills.remove(killed.getUniqueId()); if (event.GetLog().GetKiller() == null) @@ -80,14 +88,14 @@ public class PerkMagmaBoost extends Perk size += _kills.get(key); } - size = Math.min(MAX_STACKS, size); + size = Math.min(_maxStacks, size); _kills.put(key, size); slime.SetSize(size + 1); Manager.GetDisguise().updateDisguise(slime); - - killer.setExp(0.99F * (size / (float) MAX_STACKS)); + + killer.setExp(0.99F * (size / (float) _maxStacks)); } @EventHandler(priority = EventPriority.HIGHEST) @@ -104,7 +112,7 @@ public class PerkMagmaBoost extends Perk } Player damager = event.GetDamagerPlayer(false); - + if (damager == null) { return; @@ -116,12 +124,12 @@ public class PerkMagmaBoost extends Perk } UUID key = damager.getUniqueId(); - + if (!_kills.containsKey(key)) { return; } - + event.AddMod(damager.getName(), GetName(), _kills.get(key), false); } @@ -132,12 +140,12 @@ public class PerkMagmaBoost extends Perk { return; } - + if (event.GetCause() != DamageCause.ENTITY_ATTACK) { return; } - + Player damagee = event.GetDamageePlayer(); if (damagee == null) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java index 5f2a61ba2..12a35888b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java @@ -17,9 +17,7 @@ import nautilus.game.arcade.kit.perks.data.MeteorShowerData; public class SmashMagmacube extends SmashUltimate { - - private static final int DURATION = 12000; - + private List _meteors = new ArrayList<>(); public SmashMagmacube() @@ -30,7 +28,7 @@ public class SmashMagmacube extends SmashUltimate @Override public void activate(Player player) { - _meteors.add(new MeteorShowerData(player, UtilPlayer.getTarget(player, UtilBlock.blockPassSet, 128).getLocation(), DURATION)); + _meteors.add(new MeteorShowerData(player, UtilPlayer.getTarget(player, UtilBlock.blockPassSet, 128).getLocation(), getLength())); } @EventHandler @@ -40,17 +38,7 @@ public class SmashMagmacube extends SmashUltimate { return; } - - Iterator meteorIter = _meteors.iterator(); - while (meteorIter.hasNext()) - { - MeteorShowerData data = meteorIter.next(); - - if (data.update()) - { - meteorIter.remove(); - } - } + _meteors.removeIf(MeteorShowerData::update); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java index c14f70a82..d66e708c4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java @@ -40,14 +40,14 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigBaconBomb extends SmashPerk { - private static final float ENERGY_PER_PIG = 0.35F; - private static final float ENERGY_PER_PIG_DISGUISED_FACTOR = 0.7F; - private static final int COOLDOWN = 100; - private static final int PIG_MAX_TICKS = 80; - private static final float PIG_SPEED = 1.2F; - private static final int PIG_EXPLODE_RADIUS = 2; - private static final int PIG_EXPLODE_DAMAGE = 4; - private static final int PIG_EXPLODE_DAMAGE_RADIUS = 4; + private float _energyPig; + private float _energyPigDisguiseFactor; + private int _cooldown; + private int _maxTicks; + private float _pigSpeed; + private int _explodeRadius; + private int _explodeDamage; + private int _explodeDamageRadius; private Map> _pigs = new HashMap>(); @@ -56,6 +56,19 @@ public class PerkPigBaconBomb extends SmashPerk super("Baby Bacon Bomb", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Baby Bacon Bomb" }); } + @Override + public void setupValues() + { + _energyPig = getPerkFloat("Energy Per Pig"); + _energyPigDisguiseFactor = getPerkFloat("Energy Per Pig Disguise Factor"); + _cooldown = getPerkInt("Cooldown (ms)"); + _maxTicks = getPerkInt("Pig Max Ticks"); + _pigSpeed = getPerkFloat("Pig Speed"); + _explodeRadius = getPerkInt("Pig Explode Radius"); + _explodeDamage = getPerkInt("Pig Explode Damage"); + _explodeDamageRadius = getPerkInt("Pig Explode Damage Radius"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -86,13 +99,13 @@ public class PerkPigBaconBomb extends SmashPerk return; } - float energy = ENERGY_PER_PIG; + float energy = _energyPig; DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); if (disguise != null && disguise instanceof DisguisePigZombie) { - energy = energy * ENERGY_PER_PIG_DISGUISED_FACTOR; + energy = energy * _energyPigDisguiseFactor; } // Energy @@ -103,7 +116,7 @@ public class PerkPigBaconBomb extends SmashPerk } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, false)) { return; } @@ -163,7 +176,7 @@ public class PerkPigBaconBomb extends SmashPerk { Pig pig = pigIterator.next(); - if (!pig.isValid() || pig.getTicksLived() > PIG_MAX_TICKS) + if (!pig.isValid() || pig.getTicksLived() > _maxTicks) { PigExplode(pigIterator, pig, player); continue; @@ -176,9 +189,9 @@ public class PerkPigBaconBomb extends SmashPerk continue; } - UtilEnt.CreatureMoveFast(pig, target.getLocation(), PIG_SPEED); + UtilEnt.CreatureMoveFast(pig, target.getLocation(), _pigSpeed); - if (UtilMath.offset(target, pig) < PIG_EXPLODE_RADIUS) + if (UtilMath.offset(target, pig) < _explodeRadius) { PigExplode(pigIterator, pig, player); } @@ -196,7 +209,7 @@ public class PerkPigBaconBomb extends SmashPerk pig.getWorld().playSound(pig.getLocation(), Sound.PIG_DEATH, 1f, 2f); // Damage - Map targets = UtilEnt.getInRadius(pig.getLocation(), PIG_EXPLODE_DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(pig.getLocation(), _explodeDamageRadius); for (LivingEntity cur : targets.keySet()) { @@ -206,7 +219,7 @@ public class PerkPigBaconBomb extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, owner, null, DamageCause.CUSTOM, PIG_EXPLODE_DAMAGE, false, true, false, owner.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, owner, null, DamageCause.CUSTOM, _explodeDamage, false, true, false, owner.getName(), GetName()); } // Remove diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java index 87e993d45..3fb5bd136 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java @@ -40,17 +40,27 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigBaconBounce extends SmashPerk implements IThrown { - private static final float ENERGY_PER_BACON = 0.2F; - private static final float ENERGY_PER_BACON_DISGUISED_FACTOR = 0.7F; - private static final int COOLDOWN = 100; - private static final int HEALTH_PER_BACON = 1; - private static final int BACON_DAMAGE = 4; + private float _energyBacon; + private float _energyBaconDisgtuiseFactor; + private int _cooldown; + private int _healthBacon; + private int _damageBacon; public PerkPigBaconBounce() { super("Bouncy Bacon", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Bouncy Bacon", }); } + @Override + public void setupValues() + { + _energyBacon = getPerkFloat("Energy Per Bacon"); + _energyBaconDisgtuiseFactor = getPerkFloat("Energy Per Bacon Disguise Factor"); + _cooldown = getPerkInt("Cooldown (ms)"); + _healthBacon = getPerkInt("Health Per Bacon"); + _damageBacon = getPerkInt("Bacon Damage"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -81,13 +91,13 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown return; } - float energy = ENERGY_PER_BACON; + float energy = _energyBacon; DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); if (disguise != null && disguise instanceof DisguisePigZombie) { - energy = energy * ENERGY_PER_BACON_DISGUISED_FACTOR; + energy = energy * _energyBaconDisgtuiseFactor; } // Energy @@ -98,7 +108,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, false)) { return; } @@ -130,7 +140,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, BACON_DAMAGE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damageBacon, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); Item item = (Item) data.getThrown(); item.setItemStack(new ItemStack(Material.GRILLED_PORK)); @@ -189,7 +199,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown // Heal if (event.getItem().getItemStack().getType() == Material.GRILLED_PORK) { - UtilPlayer.health(event.getPlayer(), HEALTH_PER_BACON); + UtilPlayer.health(event.getPlayer(), _healthBacon); UtilParticle.PlayParticle(ParticleType.HEART, event.getPlayer().getLocation().add(0, 0.5, 0), 0.2f, 0.2f, 0.2f, 0, 4, ViewDist.LONG, UtilServer.getPlayers()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java index 306f0ed3b..d3dff4e75 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java @@ -24,7 +24,7 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigZombie extends SmashPerk { - private static final int MIN_HEALTH = 6; + private int _minHealth; public Set _active = new HashSet<>(); @@ -33,6 +33,12 @@ public class PerkPigZombie extends SmashPerk super("Nether Pig", new String[] { C.cGray + "Become Nether Pig when HP is below 6.", C.cGray + "Return to Pig when HP is 10 or higher." }); } + @Override + public void setupValues() + { + _minHealth = getPerkInt("Min Health"); + } + @EventHandler public void Check(UpdateEvent event) { @@ -86,7 +92,7 @@ public class PerkPigZombie extends SmashPerk // Not Active else { - if (player.getHealth() <= 0 || (!isSuperActive(player) && player.getHealth() > MIN_HEALTH)) + if (player.getHealth() <= 0 || (!isSuperActive(player) && player.getHealth() > _minHealth)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java index e8300adde..7bbbc05f6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java @@ -8,11 +8,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashPig extends SmashUltimate { - private static final int DURATION = 40000; - public SmashPig() { - super("Pig Stink", new String[] {}, Sound.PIG_IDLE, DURATION); + super("Pig Stink", new String[] {}, Sound.PIG_IDLE, 0); } @Override @@ -24,7 +22,7 @@ public class SmashPig extends SmashUltimate { if (!player.equals(other)) { - Manager.GetCondition().Factory().Confuse(GetName() + " " + player.getName(), other, player, DURATION / 1000, 0, false, false, false); + Manager.GetCondition().Factory().Confuse(GetName() + " " + player.getName(), other, player, getLength() / 1000, 0, false, false, false); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java index 61e49baba..520123ea9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java @@ -26,9 +26,9 @@ import nautilus.game.arcade.kit.perks.data.HomingSheepData; public class SmashSheep extends SmashUltimate { - private static final int DAMAGE_RADIUS = 10; - private static final int DAMAGE = 20; - private static final int KNOCKBACK_MAGNITUDE = 3; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; private List _sheep = new ArrayList<>(); @@ -37,6 +37,14 @@ public class SmashSheep extends SmashUltimate super("Homing Sheeples", new String[] {}, Sound.SHEEP_IDLE, 0); } + @Override + public void setupValues() + { + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @Override public void activate(Player player) { @@ -91,7 +99,7 @@ public class SmashSheep extends SmashUltimate double scale = 0.4 + 0.6 * Math.min(1, data.Sheep.getTicksLived() / 60d); // Players - Map players = UtilPlayer.getInRadius(data.Sheep.getLocation(), DAMAGE_RADIUS); + Map players = UtilPlayer.getInRadius(data.Sheep.getLocation(), _damageRadius); for (Player player : players.keySet()) { @@ -101,7 +109,7 @@ public class SmashSheep extends SmashUltimate } // Damage Event - Manager.GetDamage().NewDamageEvent(player, data.Shooter, null, DamageCause.CUSTOM, DAMAGE * scale, true, true, false, data.Shooter.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Shooter, null, DamageCause.CUSTOM, _damage * scale, true, true, false, data.Shooter.getName(), GetName()); } UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, data.Sheep.getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); @@ -118,6 +126,6 @@ public class SmashSheep extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java index a6f230bda..276650c3e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java @@ -29,11 +29,11 @@ import java.util.*; public class PerkFishFlurry extends SmashPerk implements IThrown { - private static final int COOLDOWN = 24000; - private static final float DAMAGE = 2.6F; - private static final int START_TIME = 2000; - private static final int END_TIME = 6000; - private static final float KNOCKBACK_MAGNITUDE = 1.5F; + private int _cooldown; + private float _damage; + private int _startTime; + private int _endTime; + private float _knockbackMagnitude; private List _active = new ArrayList<>(); @@ -42,6 +42,16 @@ public class PerkFishFlurry extends SmashPerk implements IThrown super("Fish Flurry", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Fish Flurry" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _startTime = getPerkTime("Start Time"); + _endTime = getPerkTime("End Time"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void shoot(PlayerInteractEvent event) { @@ -111,7 +121,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown if (!blocks.isEmpty()) { - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -150,12 +160,12 @@ public class PerkFishFlurry extends SmashPerk implements IThrown block.getWorld().playSound(block.getLocation(), Math.random() > 0.5 ? Sound.SPLASH : Sound.SPLASH2, 0.5f, 1f); } - if (!UtilTime.elapsed(data.StartTime, START_TIME)) + if (!UtilTime.elapsed(data.StartTime, _startTime)) { continue; } - if (!UtilTime.elapsed(data.StartTime, END_TIME)) + if (!UtilTime.elapsed(data.StartTime, _endTime)) { Item fish = block.getWorld().dropItem(block.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.RAW_FISH, (byte) UtilMath.r(4), 1, "Fish" + Math.random())); @@ -178,7 +188,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown if (target != null) { // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); UtilParticle.PlayParticle(ParticleType.EXPLODE, target.getLocation().add(0, 1, 0), 1f, 1f, 1f, 0, 12, ViewDist.LONG, UtilServer.getPlayers()); } @@ -206,7 +216,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); event.setKnockbackOrigin(event.GetDamageeEntity().getLocation().add(Math.random() - 0.5, -0.1, Math.random() - 0.5)); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java index 80f6d91a5..4613a99e0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java @@ -36,19 +36,25 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkInkBlast extends SmashPerk implements IThrown { - private static final int COOLDOWN = 6000; - private static final float PROJECTILE_VELOCITY = 0.15F; - private static final int KNOCKBACK_MAGNITUDE = 3; - + private int _cooldown; + private float _projectileVelocity; + private int _knockbackMagnitude; private int _bullets; private double _damagePerBullet; - public PerkInkBlast(int bullets, double damagePerBullet) + public PerkInkBlast() { super("Ink Shotgun", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Ink Shotgun" }); + } - _bullets = bullets; - _damagePerBullet = damagePerBullet; + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _projectileVelocity = getPerkFloat("Projectile Velocity"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _bullets = getPerkInt("Bullets"); + _damagePerBullet = getPerkInt("Damage Per Bullet"); } @EventHandler @@ -86,7 +92,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -102,7 +108,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown Vector random = new Vector(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5); random.normalize(); - random.multiply(PROJECTILE_VELOCITY); + random.multiply(_projectileVelocity); if (i == 0) { @@ -164,6 +170,6 @@ public class PerkInkBlast extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java index dc203d554..13dff7e65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java @@ -31,8 +31,8 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkSuperSquid extends SmashPerk { - private static final int COOLDOWN = 8000; - private static final int VELOCITY_TIME = 1100; + private int _cooldown; + private int _velocityTime; private Map _active = new HashMap<>(); @@ -41,6 +41,13 @@ public class PerkSuperSquid extends SmashPerk super("Super Squid", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Super Squid", }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocityTime = getPerkInt("Velocity Time (ms)"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -76,7 +83,7 @@ public class PerkSuperSquid extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -112,7 +119,7 @@ public class PerkSuperSquid extends SmashPerk continue; } - if (UtilTime.elapsed(_active.get(cur.getUniqueId()), VELOCITY_TIME)) + if (UtilTime.elapsed(_active.get(cur.getUniqueId()), _velocityTime)) { _active.remove(cur.getUniqueId()); continue; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java index 118449e13..f7cc4b4e5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java @@ -38,18 +38,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSquid extends SmashUltimate { - private static final int DURATION = 24000; - private static final int RATE = 1600; - private static final int MAX_RANGE = 100; - private static final int DAMAGE = 16; - private static final int DAMAGE_RADIUS = 8; - private static final int KNOCKBACK_MAGNITUDE = 3; + private int _rate; + private int _maxRange; + private int _damage; + private int _damageRadius; + private int _knockbackMagnitude; public SmashSquid() { - super("Storm Squid", new String[] {}, Sound.SPLASH2, DURATION); + super("Storm Squid", new String[] {}, Sound.SPLASH2, 0); } - + + @Override + public void setupValues() + { + super.setupValues(); + + _rate = getPerkInt("Rate (ms)"); + _maxRange = getPerkInt("Max Range"); + _damage = getPerkInt("Damage"); + _damageRadius = getPerkInt("Damage Radius"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @Override public void activate(Player player) { @@ -98,7 +109,7 @@ public class SmashSquid extends SmashUltimate return; } - Block block = UtilPlayer.getTarget(player, UtilBlock.blockAirFoliageSet, MAX_RANGE); + Block block = UtilPlayer.getTarget(player, UtilBlock.blockAirFoliageSet, _maxRange); if (block == null) { @@ -107,7 +118,7 @@ public class SmashSquid extends SmashUltimate final Location loc = block.getLocation().add(0.5, 0.5, 0.5); - if (!Recharge.Instance.use(player, GetName() + " Strike", RATE, false, false)) + if (!Recharge.Instance.use(player, GetName() + " Strike", _rate, false, false)) { return; } @@ -124,7 +135,7 @@ public class SmashSquid extends SmashUltimate // Warning player.getWorld().spigot().strikeLightningEffect(loc, false); - Map targets = UtilEnt.getInRadius(loc, DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(loc, _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -134,7 +145,7 @@ public class SmashSquid extends SmashUltimate } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur), false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur), false, true, false, player.getName(), GetName()); // Velocity UtilAction.velocity(cur, UtilAlg.getTrajectory(loc, cur.getLocation()), 3 * targets.get(cur), false, 0, 1 * targets.get(cur), 2, true); @@ -245,6 +256,6 @@ public class SmashSquid extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java index ba5a90767..fd39215b8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.Map; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -36,9 +37,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWitherImage extends SmashPerk { - private static final int COOLDOWN = 12000; - private static final int SWAP_COOLDOWN = 2000; - private static final int TARGET_RADIUS = 15; + private int _cooldown; + private int _swapCooldown; + private int _targetRadius; private Map _skeletons = new HashMap<>(); @@ -48,6 +49,14 @@ public class PerkWitherImage extends SmashPerk + "Wither Swap" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _swapCooldown = getPerkTime("Swap Cooldown"); + _targetRadius = getPerkInt("Target Radius"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -85,7 +94,7 @@ public class PerkWitherImage extends SmashPerk if (!_skeletons.containsKey(player.getUniqueId())) { - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -101,7 +110,7 @@ public class PerkWitherImage extends SmashPerk skel.setMaxHealth(20); skel.setHealth(skel.getMaxHealth()); - for (Player other : UtilPlayer.getNearby(skel.getLocation(), TARGET_RADIUS)) + for (Player other : UtilPlayer.getNearby(skel.getLocation(), _targetRadius)) { if (player.equals(other) || UtilPlayer.isSpectator(other) || isTeamDamage(player, other)) { @@ -127,7 +136,7 @@ public class PerkWitherImage extends SmashPerk _skeletons.put(player.getUniqueId(), skel); - Recharge.Instance.use(player, "Wither Swap", SWAP_COOLDOWN / 4, false, false); + Recharge.Instance.use(player, "Wither Swap", _swapCooldown / 4, false, false); // Sound player.getWorld().playSound(player.getLocation(), Sound.WITHER_SPAWN, 1f, 1f); @@ -137,7 +146,7 @@ public class PerkWitherImage extends SmashPerk } else { - if (!Recharge.Instance.use(player, "Wither Swap", SWAP_COOLDOWN, true, false)) + if (!Recharge.Instance.use(player, "Wither Swap", _swapCooldown, true, false)) { return; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java index 8f6845044..bd2c99b0e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java @@ -40,10 +40,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWitherSkull extends SmashPerk { - private static final int COOLDOWN_NORMAL = 6000; - private static final int COOLDOWN_SMASH = 1000; - private static final int DAMAGE = 12; - private static final float KNOCKBACK_MAGNITUDE = 1.5F; + private int _cooldownNormal; + private int _cooldownSmash; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); private Set _ignoreControl = new HashSet<>(); @@ -53,6 +53,15 @@ public class PerkWitherSkull extends SmashPerk super("Wither Skull", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Wither Skull" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler(priority = EventPriority.LOW) // Happen BEFORE super is // triggered public void activate(PlayerInteractEvent event) @@ -88,7 +97,7 @@ public class PerkWitherSkull extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), smash ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !smash, !smash)) + if (!Recharge.Instance.use(player, GetName(), smash ? _cooldownSmash : _cooldownNormal, !smash, !smash)) { return; } @@ -211,7 +220,7 @@ public class PerkWitherSkull extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(player, (LivingEntity) skull.getShooter(), null, DamageCause.CUSTOM, DAMAGE * players.get(player) * scale, true, true, false, UtilEnt.getName( + Manager.GetDamage().NewDamageEvent(player, (LivingEntity) skull.getShooter(), null, DamageCause.CUSTOM, _damage * players.get(player) * scale, true, true, false, UtilEnt.getName( (LivingEntity) skull.getShooter()), GetName()); } } @@ -224,6 +233,6 @@ public class PerkWitherSkull extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java index 717328a64..59d232b8b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java @@ -28,11 +28,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashWitherSkeleton extends SmashUltimate { - private static final int DURAITON = 18000; - public SmashWitherSkeleton() { - super("Wither Form", new String[] {}, Sound.WITHER_SPAWN, DURAITON); + super("Wither Form", new String[] {}, Sound.WITHER_SPAWN, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java index 92edcd250..e73c127fe 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java @@ -40,13 +40,17 @@ public class PerkOvercharge extends SmashPerk private int _tick; private boolean _useExp; - public PerkOvercharge(int max, int tick, boolean useExpBar) + public PerkOvercharge() { super("Corrupted Arrow", new String[] { C.cYellow + "Charge" + C.cGray + " your Bow to use " + C.cGreen + "Corrupted Arrow" }); + } - _useExp = useExpBar; - _max = max; - _tick = tick; + @Override + public void setupValues() + { + _max = getPerkInt("Max"); + _tick = getPerkInt("Tick"); + _useExp = getPerkBoolean("Use Exp"); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java index cea58d3c1..7fb954e14 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java @@ -39,10 +39,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkZombieBile extends SmashPerk implements IThrown { - private static final int COOLDOWN = 10000; - private static final int ITEMS = 3; - private static final int DAMAGE = 3; - private static final int KNOCKBACK_MAGNITUDE = 1; + private int _cooldown; + private int _items; + private int _damage; + private int _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -51,6 +51,15 @@ public class PerkZombieBile extends SmashPerk implements IThrown super("Spew Bile", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Spew Bile" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _items = getPerkInt("Items"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -81,7 +90,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,7 +140,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown } // Projectiles - for (int i = 0; i < ITEMS; i++) + for (int i = 0; i < _items; i++) { Vector rand = new Vector((Math.random() - 0.5) * 0.525, (Math.random() - 0.5) * 0.525, (Math.random() - 0.5) * 0.525); @@ -164,7 +173,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, DAMAGE, true, false, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damage, true, false, false, UtilEnt.getName(data.getThrower()), GetName()); data.getThrown().remove(); } @@ -189,6 +198,6 @@ public class PerkZombieBile extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java index 3bcbf1db5..27768a13a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java @@ -41,10 +41,10 @@ import nautilus.game.arcade.kit.Perk; public class PerkDeathsGrasp extends Perk { private Map _live = new HashMap<>(); - private HashMap _weakness = new HashMap(); + private HashMap _weakness = new HashMap<>(); - private static final long LEAP_DURATION = 1000; - private static final long WEAKNESS_DURATION = 1000; + private long _leapDuration; + private long _weaknessDuration; public PerkDeathsGrasp() { @@ -55,6 +55,13 @@ public class PerkDeathsGrasp extends Perk }); } + @Override + public void setupValues() + { + _leapDuration = getPerkInt("Leap Duration (ms)"); + _weaknessDuration = getPerkInt("Weakness Duration (ms)"); + } + @EventHandler public void leap(PlayerInteractEvent event) { @@ -110,7 +117,7 @@ public class PerkDeathsGrasp extends Perk return; } - if (UtilEnt.isGrounded(player) && UtilTime.elapsed(e.getValue(), LEAP_DURATION)) + if (UtilEnt.isGrounded(player) && UtilTime.elapsed(e.getValue(), _leapDuration)) { it.remove(); return; @@ -142,7 +149,7 @@ public class PerkDeathsGrasp extends Perk continue; } - if (!UtilTime.elapsed(_weakness.get(ent), WEAKNESS_DURATION)) + if (!UtilTime.elapsed(_weakness.get(ent), _weaknessDuration)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java index 403560712..b873bbab7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java @@ -51,6 +51,6 @@ public class PerkKnockbackArrow extends Perk if (!Manager.IsAlive(damager)) return; - event.AddKnockback("Knockback Arrow", _power); + event.AddKnockback(GetName(), _power); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java index 3d416b319..cb967b8ce 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java @@ -42,24 +42,33 @@ public class PerkLazer extends Perk { private static final float MAX_CHARGE = 0.99F; - private static final float CHARGE_PER_TICK = 0.035F; private static final float INCREMENTATION = 0.2F; - private static final float HIT_BOX_RADIUS = 2.5F; - private static final int DAMAGE_RADIUS = 3; - private static final int DAMAGE = 7; - private static final int KNOCKBACK_MAGNITUDE = 3; - private double _range; private long _recharge; + private float _chargePerTick; + private float _hitBoxRadius; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; + private double _range; private Set _active = new HashSet<>(); - public PerkLazer(double range, long recharge) + public PerkLazer() { super("Static Laser", new String[] { C.cYellow + "Hold Block" + C.cGray + " with Sword to use " + C.cGreen + "Static Laser" }); + } - _range = range; - _recharge = recharge; + @Override + public void setupValues() + { + _recharge = getPerkTime("Cooldown"); + _chargePerTick = getPerkFloat("Charge Per Tick"); + _hitBoxRadius = getPerkFloat("Hit Box Radius"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _range = getPerkInt("Range"); } @EventHandler @@ -122,7 +131,7 @@ public class PerkLazer extends Perk if (player.isBlocking()) { - player.setExp(Math.min(MAX_CHARGE, player.getExp() + CHARGE_PER_TICK)); + player.setExp(Math.min(MAX_CHARGE, player.getExp() + _chargePerTick)); player.getWorld().playSound(player.getLocation(), Sound.FIZZ, 0.25f + player.getExp(), 0.75f + player.getExp()); @@ -175,7 +184,7 @@ public class PerkLazer extends Perk particleLoop: while (!lineParticle.update()) { - for (Player other : UtilPlayer.getNearby(lineParticle.getLastLocation(), HIT_BOX_RADIUS)) + for (Player other : UtilPlayer.getNearby(lineParticle.getLastLocation(), _hitBoxRadius)) { if (player.equals(other)) { @@ -193,7 +202,7 @@ public class PerkLazer extends Perk // Firework UtilFirework.playFirework(target, Type.BURST, Color.YELLOW, false, false); - for (LivingEntity other : UtilEnt.getInRadius(target, DAMAGE_RADIUS).keySet()) + for (LivingEntity other : UtilEnt.getInRadius(target, _damageRadius).keySet()) { if (other.equals(player)) { @@ -201,7 +210,7 @@ public class PerkLazer extends Perk } // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, player.getExp() * DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, player.getExp() * _damage, true, true, false, player.getName(), GetName()); } // Inform @@ -224,7 +233,7 @@ public class PerkLazer extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } public void setWoolColor(Player player, DyeColor color) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java index 2a2ec4083..4ed043acb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java @@ -52,13 +52,13 @@ import nautilus.game.arcade.kit.perks.data.WoolBombData; public class PerkWoolBomb extends Perk implements IThrown { - - private static final long RATE = 800; - private static final long COOLDOWN = 8000; - private static final int DAMAGE_RADIUS = 9; - private static final int DAMAGE_EXPLODE = 14; - private static final int DAMAGE_COLLIDE = 4; - private static final int KNOCKBACK_MAGNITUDE = 2; + + private long _cooldown; + private long _rate; + private int _damageRadius; + private int _damageExplode; + private int _damageCollide; + private int _knockbackMagnitude; private Map _thrown = new HashMap<>(); private Map _active = new HashMap<>(); @@ -68,6 +68,17 @@ public class PerkWoolBomb extends Perk implements IThrown super("Wool Mine", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Wool Mine" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _rate = getPerkInt("Rate (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _damageExplode = getPerkInt("Damage Explode"); + _damageCollide = getPerkInt("Damage Collide"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void skill(PlayerInteractEvent event) { @@ -148,7 +159,7 @@ public class PerkWoolBomb extends Perk implements IThrown player.getWorld().playSound(player.getLocation(), Sound.SHEEP_IDLE, 2f, 1.5f); // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Disguise DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); @@ -211,7 +222,7 @@ public class PerkWoolBomb extends Perk implements IThrown thrown.remove(); // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Inform if (inform) @@ -233,7 +244,7 @@ public class PerkWoolBomb extends Perk implements IThrown return false; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return false; } @@ -246,7 +257,7 @@ public class PerkWoolBomb extends Perk implements IThrown data.Block.getWorld().playSound(data.Block.getLocation(), Sound.EXPLODE, 3f, 0.8f); // Damage - Map targets = UtilEnt.getInRadius(data.Block.getLocation().add(0.5, 0.5, 0.5), DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(data.Block.getLocation().add(0.5, 0.5, 0.5), _damageRadius); List team = TeamSuperSmash.getTeam(Manager, player, false); for (LivingEntity cur : targets.keySet()) @@ -260,7 +271,7 @@ public class PerkWoolBomb extends Perk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE_EXPLODE * targets.get(cur) + 0.5, false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damageExplode * targets.get(cur) + 0.5, false, true, false, player.getName(), GetName()); // Condition Manager.GetCondition().Factory().Falling(GetName(), cur, player, 10, false, true); @@ -277,7 +288,7 @@ public class PerkWoolBomb extends Perk implements IThrown } // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Inform if (inform) @@ -327,7 +338,7 @@ public class PerkWoolBomb extends Perk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE_COLLIDE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damageCollide, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); } @Override @@ -367,7 +378,7 @@ public class PerkWoolBomb extends Perk implements IThrown WoolBombData data = _active.get(key); - if (UtilTime.elapsed(data.Time, COOLDOWN)) + if (UtilTime.elapsed(data.Time, _cooldown)) { detonate.add(player); continue; @@ -400,6 +411,6 @@ public class PerkWoolBomb extends Perk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java index 77a9a7740..167606014 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java @@ -39,12 +39,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkWoolCloud extends Perk { - private static final long COOLDOWN = 10000; - private static final long MIN_VELOCITY_TIME = 200; - private static final long MAX_VELOCITY_TIME = 1200; - private static final int DAMAGE_RADIUS = 2; - private static final int DAMAGE = 8; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private long _cooldown; + private long _minVelocityTime; + private long _maxVelocityTime; + private int _damageRadius; + private int _damage; + private float _knockbackMangitude; private Map _active = new HashMap<>(); @@ -53,6 +53,17 @@ public class PerkWoolCloud extends Perk super("Wooly Rocket", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Wooly Rocket" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _minVelocityTime = getPerkInt("Min Velocity Time (ms)"); + _maxVelocityTime = getPerkInt("Max Velocity Time (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMangitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -84,7 +95,7 @@ public class PerkWoolCloud extends Perk } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,7 +142,7 @@ public class PerkWoolCloud extends Perk UtilParticle.PlayParticle(ParticleType.FLAME, player.getLocation(), 0.2f, 0.2f, 0.2f, 0, 4, ViewDist.LONGER, UtilServer.getPlayers()); - if (!UtilTime.elapsed(_active.get(key), MIN_VELOCITY_TIME)) + if (!UtilTime.elapsed(_active.get(key), _minVelocityTime)) { continue; } @@ -143,17 +154,17 @@ public class PerkWoolCloud extends Perk continue; } - if (UtilMath.offset(player, other) < DAMAGE_RADIUS) + if (UtilMath.offset(player, other) < _damageRadius) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(ParticleType.EXPLODE, other.getLocation(), 0f, 0f, 0f, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); UtilParticle.PlayParticle(ParticleType.LAVA, player.getLocation(), 0.2f, 0.2f, 0.2f, 0, 10, ViewDist.MAX, UtilServer.getPlayers()); } } - if (UtilEnt.isGrounded(player) || UtilTime.elapsed(_active.get(key), MAX_VELOCITY_TIME)) + if (UtilEnt.isGrounded(player) || UtilTime.elapsed(_active.get(key), _maxVelocityTime)) { playerIterator.remove(); setWoolColor(player, DyeColor.WHITE); @@ -184,6 +195,6 @@ public class PerkWoolCloud extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMangitude); } } From 0f925dd65515438712bb7aff85829454ca85f434 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 11:10:06 +0100 Subject: [PATCH 030/170] Ink Blaster changes --- .../arcade/game/games/smash/perks/squid/PerkInkBlast.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java index 4613a99e0..8b15e9455 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java @@ -37,6 +37,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown { private int _cooldown; + private float _spread; private float _projectileVelocity; private int _knockbackMagnitude; private int _bullets; @@ -51,6 +52,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown public void setupValues() { _cooldown = getPerkTime("Cooldown"); + _spread = getPerkFloat("Spread"); _projectileVelocity = getPerkFloat("Projectile Velocity"); _knockbackMagnitude = getPerkInt("Knockback Magnitude"); _bullets = getPerkInt("Bullets"); @@ -106,7 +108,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(Material.INK_SACK, (byte) 0, 1, "Ink" + Math .random())); - Vector random = new Vector(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5); + Vector random = new Vector((Math.random() - 0.5) * _spread, (Math.random() - 0.5) * _spread, (Math.random() - 0.5) * _spread); random.normalize(); random.multiply(_projectileVelocity); From 1cc9888e58a6c0ec250e4b52216dd2916b9cc662 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 11:10:19 +0100 Subject: [PATCH 031/170] Creeper Explode damage reduction --- .../perks/creeper/PerkCreeperExplode.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index 8825ef89f..d43b21e62 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -34,6 +34,7 @@ public class PerkCreeperExplode extends SmashPerk private int _radiusSmash; private int _damageNormal; private int _damageSmash; + private double _damageReduction; private int _spawnRemovalRadius; private float _knockbackMagnitude; private int _blockDestroyRadius; @@ -56,6 +57,7 @@ public class PerkCreeperExplode extends SmashPerk _radiusSmash = getPerkInt("Radius Smash"); _damageNormal = getPerkInt("Damage Normal"); _damageSmash = getPerkInt("Damage Smash"); + _damageReduction = getPerkPercentage("Damage Reduction"); _spawnRemovalRadius = (int) Math.pow(getPerkInt("Spawn Removal Radius"), 2); _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); _blockDestroyRadius = getPerkInt("Block Destroy Radius"); @@ -336,6 +338,22 @@ public class PerkCreeperExplode extends SmashPerk DecreaseSize(player); } + @EventHandler + public void damageReduction(CustomDamageEvent event) + { + Player player = event.GetDamageePlayer(); + + if (player == null) + { + return; + } + + if (_active.containsKey(player.getUniqueId())) + { + event.AddMod("Damage Reduction", -event.GetDamage() * _damageReduction); + } + } + @EventHandler public void addDestroyedSpawns(UpdateEvent event) { From 9c9200605ac842477266aa3419cdc65a6d2b96a9 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 11:10:29 +0100 Subject: [PATCH 032/170] Creeper Sulphur Bomb changes --- .../perks/creeper/PerkCreeperSulphurBomb.java | 161 ++++++++++++------ 1 file changed, 112 insertions(+), 49 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java index dd027b8d3..f8f782cac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java @@ -1,5 +1,17 @@ package nautilus.game.arcade.game.games.smash.perks.creeper; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -9,35 +21,94 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.projectile.IThrown; -import mineplex.core.projectile.ProjectileUser; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; -public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown +public class PerkCreeperSulphurBomb extends SmashPerk { - + + private static ItemStack POWDER = new ItemStack(Material.SULPHUR); + private int _cooldown; private float _damage; private float _knockbackMagnitude; + private float _damagePowder; + + private final IThrown _sulphurThrown = new IThrown() + { + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + Explode(data); + + if (target == null) + { + return; + } + + // Damage Event + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + } + + @Override + public void Idle(ProjectileUser data) + { + Explode(data); + } + + @Override + public void Expire(ProjectileUser data) + { + Explode(data); + } + + private void Explode(ProjectileUser data) + { + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); + data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 1.5f); + data.getThrown().remove(); + } + }; + private final IThrown _powderThrown = new IThrown() + { + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + Explode(data); + + if (target == null) + { + return; + } + + // Damage Event + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damagePowder, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); + } + + @Override + public void Idle(ProjectileUser data) + { + Explode(data); + } + + @Override + public void Expire(ProjectileUser data) + { + Explode(data); + } + + private void Explode(ProjectileUser data) + { + UtilParticle.PlayParticleToAll(ParticleType.EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.LONG); + data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 2f); + data.getThrown().remove(); + } + }; + + private Map _sulphur = new HashMap<>(); public PerkCreeperSulphurBomb() { @@ -50,6 +121,7 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown _cooldown = getPerkTime("Cooldown"); _damage = getPerkFloat("Damage"); _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + _damagePowder = getPerkFloat("Damage Powder"); } @EventHandler @@ -98,9 +170,10 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.COAL, (byte) 0)); - UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); + _sulphur.put(player.getUniqueId(), ent); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, 0.6f); + UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); + Manager.GetProjectile().AddThrow(ent, player, _sulphurThrown, -1, true, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, 0.6f); // Inform UtilPlayer.message(player, F.main("Game", "You used " + F.skill(GetName()) + ".")); @@ -109,37 +182,27 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown player.getWorld().playSound(player.getLocation(), Sound.CREEPER_DEATH, 2f, 1.5f); } - @Override - public void Collide(LivingEntity target, Block block, ProjectileUser data) + @EventHandler + public void dropPowder(UpdateEvent event) { - Explode(data); - - if (target == null) + if (event.getType() != UpdateType.FASTER) { return; } - - // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); - } - @Override - public void Idle(ProjectileUser data) - { - Explode(data); - } + for (Map.Entry entry : _sulphur.entrySet()) + { + Player player = UtilPlayer.searchExact(entry.getKey()); - @Override - public void Expire(ProjectileUser data) - { - Explode(data); - } + if (player == null) + { + continue; + } - public void Explode(ProjectileUser data) - { - UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); - data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 1.5f); - data.getThrown().remove(); + Item item = entry.getValue(); + Item powder = item.getWorld().dropItem(item.getLocation(), POWDER); + Manager.GetProjectile().AddThrow(powder, player, _powderThrown, -1, true, true, true, true, 1F); + } } @EventHandler From 20c05518f3531166ea2b52d7815e176177e5184e Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 12:07:35 +0100 Subject: [PATCH 033/170] Wolf changes --- .../arcade/game/games/smash/kits/KitWolf.java | 2 +- .../game/games/smash/perks/wolf/PerkWolf.java | 15 ++------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java index 50907a773..7e758f379 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java @@ -68,7 +68,7 @@ public class KitWolf extends SmashKit private static final ItemStack[] PLAYER_ARMOR = { null, new ItemStack(Material.CHAINMAIL_LEGGINGS), - new ItemStack(Material.IRON_CHESTPLATE), + new ItemStack(Material.CHAINMAIL_CHESTPLATE), null }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java index a52cb5c02..dfc79d277 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java @@ -488,7 +488,7 @@ public class PerkWolf extends SmashPerk if (count > 0) { - event.AddMod(damager.getName(), "Ravage", Math.min(2, count), false); + event.AddMod(damager.getName(), "Ravage", Math.min(3, count), false); // Sound damager.getWorld().playSound(damager.getLocation(), Sound.WOLF_BARK, (float) (0.5 + count * 0.25), (float) (1 + count * 0.25)); @@ -521,17 +521,7 @@ public class PerkWolf extends SmashPerk continue; } - Iterator timeIterator = _repeat.get(uuid).iterator(); - - while (timeIterator.hasNext()) - { - long time = timeIterator.next(); - - if (UtilTime.elapsed(time, 3000)) - { - timeIterator.remove(); - } - } + _repeat.get(uuid).removeIf(time -> UtilTime.elapsed(time, 3000)); // Exp player.setExp(Math.min(0.999f, _repeat.get(uuid).size() / 9f)); @@ -539,7 +529,6 @@ public class PerkWolf extends SmashPerk if(_repeat.get(uuid).isEmpty()) { playerIterator.remove(); - continue; } } } From 69ed0c7c24b92a6e7f1d4e06ed6bb9443420ab98 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 12:07:47 +0100 Subject: [PATCH 034/170] Magma Cube changes --- .../game/games/smash/kits/KitMagmaCube.java | 26 ++++++++++++------- .../games/smash/perks/PerkSmashStats.java | 25 +++++++----------- .../smash/perks/magmacube/PerkMagmaBlast.java | 21 ++++++++------- .../smash/perks/magmacube/PerkMagmaBoost.java | 24 ++++++++++++++++- .../src/nautilus/game/arcade/kit/Perk.java | 2 +- .../arcade/kit/perks/data/FireflyData.java | 6 +---- 6 files changed, 64 insertions(+), 40 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java index a23130042..745f725a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java @@ -63,6 +63,14 @@ public class KitMagmaCube extends SmashKit ChatColor.RESET + "", ChatColor.RESET + "Right-Click again to end Flame Dash early.", }), + ItemStackFactory.Instance.CreateStack(Material.BLAZE_POWDER, (byte) 0, 1, + C.cYellow + C.Bold + "Passive" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Fuel the Fire", + new String[] + { + ChatColor.RESET + "Each kill increases your size, damage", + ChatColor.RESET + "armor and decreases your knockback taken.", + ChatColor.RESET + "Resets on death.", + }), ItemStackFactory.Instance.CreateStack(Material.NETHER_STAR, (byte) 0, 1, C.cYellow + C.Bold + "Smash Crystal" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Meteor Shower", new String[] @@ -89,21 +97,21 @@ public class KitMagmaCube extends SmashKit public void GiveItems(Player player) { disguise(player); - + DisguiseMagmaCube disguise = (DisguiseMagmaCube) Manager.GetDisguise().getActiveDisguise(player); - + disguise.SetSize(1); - + UtilInv.Clear(player); player.getInventory().addItem(PLAYER_ITEMS[0], PLAYER_ITEMS[1]); if (Manager.GetGame().GetState() == GameState.Recruit) - player.getInventory().addItem(PLAYER_ITEMS[2]); + player.getInventory().addItem(PLAYER_ITEMS[2], PLAYER_ITEMS[3]); - player.getInventory().setArmorContents(PLAYER_ARMOR);; + player.getInventory().setArmorContents(PLAYER_ARMOR); } - + @EventHandler public void fireResistance(UpdateEvent event) { @@ -111,19 +119,19 @@ public class KitMagmaCube extends SmashKit { return; } - + if (Manager.GetGame() == null) { return; } - + for (Player player : Manager.GetGame().GetPlayers(true)) { if (!HasKit(player)) { continue; } - + player.setFireTicks(0); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java index 07804dab9..534ab5f3b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java @@ -24,21 +24,6 @@ public class PerkSmashStats extends Perk super("Smash Stats"); } - public PerkSmashStats(double damage, double knockbackTaken, double regen, double armor) - { - super("Smash Stats", new String[]{}); - - _damage = damage; - _knockbackTaken = knockbackTaken; - _regen = regen; - _armor = armor; - - setDesc( - (C.cAqua + "Damage: " + C.cWhite + _damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int) (_knockbackTaken * 100) + "%"), - (C.cAqua + "Armor: " + C.cWhite + _armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + _regen + " per Second") - ); - } - @Override public void setupValues() { @@ -113,4 +98,14 @@ public class PerkSmashStats extends Perk UtilPlayer.health(player, _regen); } } + + public double getArmour() + { + return _armor; + } + + public void setArmor(double armor) + { + _armor = armor; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java index 108b0f715..0be61eca6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java @@ -43,12 +43,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkMagmaBlast extends Perk { - private int _cooldown = 6000; - private float _velocity = 0.2F; - private int _fireTicks = 40; - private int _velocityRadius = 8; - private int _fireRadius = 2; - private int _damage = 8; + private int _cooldown; + private float _velocity; + private int _fireTicks; + private int _velocityRadius; + private int _fireRadius; + private int _damage; private Map _proj = new HashMap<>(); @@ -185,13 +185,16 @@ public class PerkMagmaBlast extends Perk { if(team.contains(cur)) { - { - continue; - } + continue; } double range = hitMap.get(cur); + if (range > 0.8) + { + range = 1; + } + Manager.GetDamage().NewDamageEvent(cur, shooter, proj, DamageCause.PROJECTILE, range * _damage, false, true, false, shooter.getName(), GetName()); // Velocity diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java index 9a00a8894..7b2030ba0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +import nautilus.game.arcade.game.games.smash.perks.PerkSmashStats; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -59,7 +60,18 @@ public class PerkMagmaBoost extends Perk { Player killed = (Player) event.GetEvent().getEntity(); - _kills.remove(killed.getUniqueId()); + if (_kills.remove(killed.getUniqueId()) != null) + { + for (Perk perk : Kit.GetPerks()) + { + if (perk instanceof PerkSmashStats) + { + PerkSmashStats perkSmashStats = (PerkSmashStats) perk; + perkSmashStats.setArmor(Double.valueOf(_spreadsheet.getDataMap().get(_spreadsheet.getKey(Kit, perkSmashStats, "Armor")))); + break; + } + } + } if (event.GetLog().GetKiller() == null) { @@ -95,6 +107,16 @@ public class PerkMagmaBoost extends Perk slime.SetSize(size + 1); Manager.GetDisguise().updateDisguise(slime); + for (Perk perk : Kit.GetPerks()) + { + if (perk instanceof PerkSmashStats) + { + PerkSmashStats perkSmashStats = (PerkSmashStats) perk; + perkSmashStats.setArmor(perkSmashStats.getArmour() + 0.5); + break; + } + } + killer.setExp(0.99F * (size / (float) _maxStacks)); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java index a403f675a..a727a304a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java @@ -16,7 +16,7 @@ public abstract class Perk implements Listener private boolean _display; private int _upgradeLevel; - private PerkSpreadsheetModule _spreadsheet; + protected PerkSpreadsheetModule _spreadsheet; public Perk(String name) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java index c04f9b167..ad8772b88 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java @@ -1,10 +1,6 @@ package nautilus.game.arcade.kit.perks.data; -import java.util.HashSet; - -import org.bukkit.entity.Entity; - -public class FireflyData +public class FireflyData { public org.bukkit.entity.Player Player; public org.bukkit.Location Location; From 3c852f091d516713f987355ddf39669033e56411 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:13:40 +0100 Subject: [PATCH 035/170] Witch changes --- .../game/arcade/game/games/smash/perks/witch/PerkBatWave.java | 4 ++-- .../arcade/game/games/smash/perks/witch/PerkWitchPotion.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java index b2a2c57e5..298f58edf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java @@ -293,7 +293,7 @@ public class PerkBatWave extends SmashPerk bat.remove(); } - _bats.remove(player); + _bats.remove(player.getUniqueId()); } } @@ -311,7 +311,7 @@ public class PerkBatWave extends SmashPerk { _damageTaken.put(key, (_damageTaken.get(key) + event.GetDamage())); - if (_damageTaken.get(key) >= _disableDamage) + if (event.GetCause() == DamageCause.ENTITY_ATTACK || _damageTaken.get(key) >= _disableDamage) { Clear(player); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java index 2c18b75ec..217f01b77 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java @@ -164,6 +164,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown for (Player player : directHit) { Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDirect, true, true, false, thrower.getName(), GetName()); + Manager.GetCondition().Factory().Slow(GetName(), target, thrower, 2, 1, true, true, false, false); } players.removeAll(directHit); @@ -175,6 +176,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown if(!UtilEnt.isInsideBoundingBox(player, a, b)) continue; Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDistance, true, true, false, thrower.getName(), GetName()); + Manager.GetCondition().Factory().Slow(GetName(), target, thrower, 2, 0, true, true, false, false); } } From 607893a872bddafc51099fbc07fa934ab761e883 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:47:52 +0100 Subject: [PATCH 036/170] Cow changes --- .../arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java index e1bd94baa..c373de9fb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java @@ -113,7 +113,7 @@ public class PerkCowMilkSpiral extends SmashPerk for (Player player : Manager.GetGame().GetPlayers(true)) { - if (player.equals(data.Player)) + if (player.equals(data.Player) || !Recharge.Instance.use(player, GetName() + " Rate", 3000, false, false)) { continue; } From cc3ac9800bf1024b233a00336903b92a339c4697 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:48:01 +0100 Subject: [PATCH 037/170] Skeletal horse changes --- .../game/games/smash/perks/skeletalhorse/PerkHorseKick.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java index 6d4edaecb..130eec05e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java @@ -40,7 +40,7 @@ public class PerkHorseKick extends SmashPerk private int _cooldown; private float _damage; private int _kickTime; - private int _knockbackMagnitude; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -55,7 +55,7 @@ public class PerkHorseKick extends SmashPerk _cooldown = getPerkTime("Cooldown"); _damage = getPerkFloat("Damage"); _kickTime = getPerkInt("Kick Time (ms)"); - _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); } @EventHandler From 110d8946d53f8200a348aeae042d2afadfb6feca Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:48:09 +0100 Subject: [PATCH 038/170] Zombie changes --- .../game/arcade/kit/perks/PerkDeathsGrasp.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java index 27768a13a..c57a8ceba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java @@ -42,9 +42,11 @@ public class PerkDeathsGrasp extends Perk { private Map _live = new HashMap<>(); private HashMap _weakness = new HashMap<>(); - - private long _leapDuration; - private long _weaknessDuration; + + private int _cooldown; + private int _damage; + private int _leapDuration; + private int _weaknessDuration; public PerkDeathsGrasp() { @@ -58,6 +60,8 @@ public class PerkDeathsGrasp extends Perk @Override public void setupValues() { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkInt("Damage"); _leapDuration = getPerkInt("Leap Duration (ms)"); _weaknessDuration = getPerkInt("Weakness Duration (ms)"); } @@ -82,7 +86,7 @@ public class PerkDeathsGrasp extends Perk if (!Kit.HasKit(player)) return; - if (!Recharge.Instance.use(player, GetName(), 12000, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) return; UtilAction.velocity(player, player.getLocation().getDirection(), 1.4, false, 0, 0.2, 1.2, true); @@ -104,7 +108,6 @@ public class PerkDeathsGrasp extends Perk { return; } - //Leap End & Collide for(Iterator> it = _live.entrySet().iterator(); it.hasNext();) @@ -162,7 +165,7 @@ public class PerkDeathsGrasp extends Perk { //Damage Event Manager.GetDamage().NewDamageEvent(damagee, damager, null, - DamageCause.CUSTOM, 6, false, true, false, + DamageCause.CUSTOM, _damage, false, true, false, damager.getName(), GetName()); UtilAction.velocity(damagee, UtilAlg.getTrajectory2d(damagee, damager), 1.6, false, 0, 1.2, 1.8, true); From 76835654e8e18df2667949032f98b7a49735c20e Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:48:32 +0100 Subject: [PATCH 039/170] Chicken, unless cast --- .../game/games/smash/perks/chicken/PerkChickenRocket.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java index 6acd00576..5669de319 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java @@ -161,7 +161,7 @@ public class PerkChickenRocket extends SmashPerk { if (ent instanceof Arrow) { - if (((Arrow) ent).isOnGround()) + if (ent.isOnGround()) { continue; } @@ -237,7 +237,6 @@ public class PerkChickenRocket extends SmashPerk data.Chicken.remove(); dataIterator.remove(); - continue; } } } From 5138e6ad54079e59177114067bcc9be69f0184dd Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:48:41 +0100 Subject: [PATCH 040/170] Blaze changes --- .../src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java index 9c176940f..b248334df 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java @@ -70,6 +70,7 @@ public class KitBlaze extends SmashKit new ItemStack(Material.CHAINMAIL_BOOTS), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_CHESTPLATE), + new ItemStack(Material.CHAINMAIL_HELMET) }; From ff93ca9705554e161ee90b5fa54c86ec7c82a075 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 13:48:49 +0100 Subject: [PATCH 041/170] Pig changes --- .../arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java | 2 +- .../game/games/smash/perks/pig/PerkPigBaconBounce.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java index d66e708c4..2160c60a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java @@ -125,7 +125,7 @@ public class PerkPigBaconBomb extends SmashPerk player.setExp(Math.max(0f, player.getExp() - energy)); // Velocity - UtilAction.velocity(player, player.getLocation().getDirection(), 0.8, true, 0.9, 0, 1, true); + UtilAction.velocity(player, player.getLocation().getDirection(), 0.8, true, 1.2, 0, 1, true); // Sound player.getWorld().playSound(player.getLocation(), Sound.PIG_IDLE, 2f, 0.75f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java index 3fb5bd136..ff0a0b82f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java @@ -42,6 +42,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown private float _energyBacon; private float _energyBaconDisgtuiseFactor; + private float _energyBaconBack; private int _cooldown; private int _healthBacon; private int _damageBacon; @@ -56,6 +57,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown { _energyBacon = getPerkFloat("Energy Per Bacon"); _energyBaconDisgtuiseFactor = getPerkFloat("Energy Per Bacon Disguise Factor"); + _energyBaconBack = getPerkFloat("Energy Per Bacon Back"); _cooldown = getPerkInt("Cooldown (ms)"); _healthBacon = getPerkInt("Health Per Bacon"); _damageBacon = getPerkInt("Bacon Damage"); @@ -119,7 +121,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown // Launch Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.PORK, (byte) 0, 1, "Bacon" + System.currentTimeMillis())); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.4f); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1f); ent.setPickupDelay(9999); // Sound @@ -191,7 +193,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown event.getItem().remove(); // Restore Energy - event.getPlayer().setExp(Math.min(0.999f, event.getPlayer().getExp() + 0.05f)); + event.getPlayer().setExp(Math.min(0.999f, event.getPlayer().getExp() + _energyBaconBack)); // Sound event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.EAT, 2f, 1f); From 0f1cea013c7c0e70f3dfed1b5bce0952011bce78 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 14:05:18 +0100 Subject: [PATCH 042/170] Guardian changes --- .../core/common/util/particles/effects/LineParticle.java | 2 +- .../game/games/smash/perks/guardian/PerkWaterSplash.java | 4 +++- .../game/games/smash/perks/guardian/SmashAnimationData.java | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java index 5eb91a337..5eccc50b9 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java @@ -56,7 +56,7 @@ public class LineParticle if (_direction == null) { - direction = UtilAlg.getTrajectory(start, end).normalize(); + _direction = UtilAlg.getTrajectory(start, end).normalize(); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java index 40abe0e46..c233cebf0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java @@ -29,6 +29,7 @@ public class PerkWaterSplash extends Perk private int _radius; private int _minAirTime; private int _secondBoostTime; + private float _secondBoostVelocity; private int _damage; private Map _active = new HashMap<>(); @@ -47,6 +48,7 @@ public class PerkWaterSplash extends Perk _radius = getPerkInt("Radius"); _minAirTime = getPerkInt("Min Air Time (ms)"); _secondBoostTime = getPerkInt("Second Boost Time (ms)"); + _secondBoostVelocity = getPerkFloat("Second Boost Velocity"); _damage = getPerkInt("Damage"); } @@ -177,7 +179,7 @@ public class PerkWaterSplash extends Perk { _usedSecondBoost.add(uuid); - Vector direction = player.getLocation().getDirection().setY(0.2); + Vector direction = player.getLocation().getDirection().multiply(_secondBoostVelocity); UtilAction.velocity(player, direction); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java index e891ca5cf..1e5a8d420 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java @@ -98,7 +98,7 @@ public class SmashAnimationData { _ticks++; - if (_ticks % 10 == 0) + if (_ticks % 5 == 0) { _blockRadius++; @@ -133,13 +133,13 @@ public class SmashAnimationData } LineParticle lineParticle = new LineParticle(player.getEyeLocation(), _target.getEyeLocation(), vector, 0.2, offset, null, ParticleType.WITCH_MAGIC, UtilServer.getPlayers()); - + while (!lineParticle.update()) { } player.getWorld().playSound(player.getLocation(), Sound.ZOMBIE_REMEDY, 1, 0.75F); - UtilAction.velocity(player, vector.setY(player.getLocation().getY() - 3 > _target.getLocation().getY() ? 0 : 0.5).multiply(0.5)); + UtilAction.velocity(player, vector.setY(player.getLocation().getY() - 3 > _target.getLocation().getY() ? 0 : 0.5).multiply(0.7)); _manager.GetDamage().NewDamageEvent(player, _player, null, DamageCause.CUSTOM, VELOCITY_DAMAGE, false, true, false, _player.getName(), "Mini Guardian"); } } From b89e3c4abc05d0be0c5240802691bf545c2b3a58 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 14:10:08 +0100 Subject: [PATCH 043/170] Sheep code cleanup --- .../src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java index 4ed043acb..073500018 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java @@ -262,12 +262,9 @@ public class PerkWoolBomb extends Perk implements IThrown List team = TeamSuperSmash.getTeam(Manager, player, false); for (LivingEntity cur : targets.keySet()) { - if(cur instanceof Player) + if (cur instanceof Player && team.contains(cur)) { - if(team.contains(cur)) - { - continue; - } + continue; } // Damage Event From 41b7e4bf380aa94f396d5386c322cb6d84ee6a79 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 1 May 2017 14:26:41 +0100 Subject: [PATCH 044/170] Fix Zombie's Deaths Grasp hitting spectating players --- .../game/games/smash/kits/KitEnderman.java | 86 ++++++++----------- .../perks/creeper/PerkCreeperExplode.java | 3 +- .../arcade/kit/perks/PerkDeathsGrasp.java | 2 +- 3 files changed, 37 insertions(+), 54 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index 43137cfb9..ab333d936 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -1,23 +1,11 @@ package nautilus.game.arcade.game.games.smash.kits; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.inventory.ItemStack; - import mineplex.core.common.util.C; import mineplex.core.common.util.UtilInv; +import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.smash.perks.PerkSmashStats; @@ -31,6 +19,13 @@ import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.perks.PerkDoubleJump; import nautilus.game.arcade.kit.perks.event.PerkBlockGrabEvent; import nautilus.game.arcade.kit.perks.event.PerkBlockThrowEvent; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemStack; public class KitEnderman extends SmashKit { @@ -82,8 +77,6 @@ public class KitEnderman extends SmashKit }; - public HashMap _disguises = new HashMap(); - public KitEnderman(ArcadeManager manager) { super(manager, "Enderman", KitAvailability.Gem, 3000, PERKS, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); @@ -93,9 +86,7 @@ public class KitEnderman extends SmashKit public void GiveItems(Player player) { disguise(player); - - _disguises.put(player, (DisguiseEnderman) Manager.GetDisguise().getActiveDisguise(player)); - + UtilInv.Clear(player); player.getInventory().addItem(PLAYER_ITEMS[0], PLAYER_ITEMS[1]); @@ -111,54 +102,45 @@ public class KitEnderman extends SmashKit @EventHandler public void BlockGrab(PerkBlockGrabEvent event) { - SetBlock(_disguises.get(event.GetPlayer()), event.GetId(), event.GetData()); + setBlock(event.GetPlayer(), event.GetId(), event.GetData()); } @EventHandler public void BlockThrow(PerkBlockThrowEvent event) { - SetBlock(_disguises.get(event.GetPlayer()), 0, (byte) 0); + setBlock(event.GetPlayer(), 0, (byte) 0); } @EventHandler public void Death(PlayerDeathEvent event) { - SetBlock(_disguises.get(event.getEntity()), 0, (byte) 0); - } - - public void SetBlock(DisguiseEnderman disguise, int id, byte data) - { - if (disguise == null) - { - return; - } - - disguise.SetCarriedId(id); - disguise.SetCarriedData(data); - - Manager.GetDisguise().updateDisguise(disguise); + setBlock(event.getEntity(), 0, (byte) 0); } @EventHandler - public void cleanDisguises(UpdateEvent event) + public void damage(CustomDamageEvent event) { - if (event.getType() != UpdateType.FAST) - { - return; - } - - for (Iterator> iterator = _disguises.entrySet().iterator(); iterator.hasNext();) - { - Entry current = iterator.next(); + Player player = event.GetDamageePlayer(); + DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); - if (!Manager.GetDisguise().isDisguised(current.getKey())) - { - iterator.remove(); - } - else if (Manager.GetDisguise().getActiveDisguise(current.getKey()) != current.getValue()) - { - iterator.remove(); - } + if (player != null && disguise != null && disguise instanceof DisguiseEnderman) + { + // Endermen drop their held block when damaged. This means the client renders it this way, so we need to resend the correct data on the next tick. + Manager.runSyncLater(() -> Manager.GetDisguise().updateDisguise(disguise), 1); + } + } + + public void setBlock(Player player, int id, byte data) + { + DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); + + if (player != null && disguise != null && disguise instanceof DisguiseEnderman) + { + DisguiseEnderman disguiseEnderman = (DisguiseEnderman) disguise; + disguiseEnderman.SetCarriedId(id); + disguiseEnderman.SetCarriedData(data); + + Manager.GetDisguise().updateDisguise(disguiseEnderman); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index d43b21e62..34f3764a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -138,7 +138,8 @@ public class PerkCreeperExplode extends SmashPerk UtilAction.zeroVelocity(player); // Sound - player.getWorld().playSound(player.getLocation(), Sound.CREEPER_HISS, (float) (0.5 + elapsed), (float) (0.5 + elapsed)); + float volume = (float) 0.5F + elapsed / 1000F; + player.getWorld().playSound(player.getLocation(), Sound.CREEPER_HISS, volume, volume); IncreaseSize(player); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java index c57a8ceba..5b2cfef50 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java @@ -129,7 +129,7 @@ public class PerkDeathsGrasp extends Perk List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : Manager.GetGame().GetPlayers(true)) { - if(team.contains(other)) + if(UtilPlayer.isSpectator(player) || team.contains(other)) { continue; } From 034837030d63bc3e6a97eab2e6cf88788155e30b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 2 May 2017 21:01:17 +0100 Subject: [PATCH 045/170] Initial commit --- .../src/mineplex/core/game/GameDisplay.java | 2 ++ .../src/nautilus/game/arcade/GameType.java | 5 ++++- .../games/alieninvasion/AlienInvasion.java | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index cc5ba27d4..80e9d4e83 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -99,6 +99,8 @@ public enum GameDisplay StrikeGames("Strike Games", Material.DIAMOND_LEGGINGS, (byte) 0, GameCategory.SURVIVAL, 66, false), + AlienInvasion("Alien Invaison", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false), + Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999, false), Brawl("Brawl", Material.DIAMOND, (byte) 0, GameCategory.EVENT, 998, false); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 66bef53c0..a864e202d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -1,5 +1,6 @@ package nautilus.game.arcade; +import nautilus.game.arcade.game.games.alieninvasion.AlienInvasion; import org.bukkit.Material; import mineplex.core.common.MinecraftVersion; @@ -223,7 +224,9 @@ public enum GameType BouncyBalls(BouncyBalls.class, GameDisplay.BouncyBalls), Valentines(Valentines.class, GameDisplay.Valentines), - + + AlienInvasion(AlienInvasion.class, GameDisplay.AlienInvasion), + Event(EventGame.class, GameDisplay.Event, new GameType[]{ GameType.BaconBrawl, GameType.Barbarians, GameType.Bridge, GameType.Build, GameType.Build, GameType.Cards, GameType.CastleSiege, GameType.ChampionsDominate, GameType.ChampionsTDM, GameType.Christmas, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java new file mode 100644 index 000000000..8e4004fcf --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -0,0 +1,22 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.kit.Kit; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class AlienInvasion extends SoloGame +{ + + private static final String[] DESCRIPTION = { + "Something something", + "Add this soon" + }; + + public AlienInvasion(ArcadeManager manager) + { + super(manager, GameType.AlienInvasion, new Kit[]{}, DESCRIPTION, ); + } +} From bd52e63dc3292ca0f33265a7835959bcde5c1ab2 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 3 May 2017 20:48:19 +0100 Subject: [PATCH 046/170] More alien stuff --- .../util/particles/effects/LineParticle.java | 2 +- .../src/mineplex/core/game/GameDisplay.java | 2 +- .../games/alieninvasion/AlienInvasion.java | 262 +++++++++++++++++- .../arcade/game/games/alieninvasion/Beam.java | 59 ++++ .../game/games/alieninvasion/BeamSource.java | 43 +++ .../games/alieninvasion/kit/KitPlayer.java | 35 +++ 6 files changed, 398 insertions(+), 5 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java index 5eb91a337..5eccc50b9 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java @@ -56,7 +56,7 @@ public class LineParticle if (_direction == null) { - direction = UtilAlg.getTrajectory(start, end).normalize(); + _direction = UtilAlg.getTrajectory(start, end).normalize(); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index 80e9d4e83..79629943b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -99,7 +99,7 @@ public enum GameDisplay StrikeGames("Strike Games", Material.DIAMOND_LEGGINGS, (byte) 0, GameCategory.SURVIVAL, 66, false), - AlienInvasion("Alien Invaison", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false), + AlienInvasion("Alien Invasion", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false), Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999, false), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 8e4004fcf..d901b8282 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -1,11 +1,30 @@ package nautilus.game.arcade.game.games.alieninvasion; +import mineplex.core.common.Pair; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTime; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; +import nautilus.game.arcade.game.games.dragonescape.DragonScore; import nautilus.game.arcade.kit.Kit; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class AlienInvasion extends SoloGame { @@ -15,8 +34,245 @@ public class AlienInvasion extends SoloGame "Add this soon" }; + private final List _sources = new ArrayList<>(5); + private final List _targets = new ArrayList<>(); + private final ArrayList _path = new ArrayList<>(); + + private int _lastBeamId; + private long _lastBeam; + + private final List _score = new ArrayList<>(16); + public AlienInvasion(ArcadeManager manager) { - super(manager, GameType.AlienInvasion, new Kit[]{}, DESCRIPTION, ); + super(manager, GameType.AlienInvasion, new Kit[]{new KitPlayer(manager)}, DESCRIPTION); + + WorldTimeSet = 18000; + DamagePvP = false; + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !IsLive()) + { + return; + } + + Scoreboard.writeNewLine(); + + AtomicInteger index = new AtomicInteger(0); + List scores = new ArrayList<>(_score); + Collections.reverse(scores); + + Scoreboard.writeGroup(scores.subList(0, Math.min(16, scores.size())), score -> + { + ChatColor col = IsAlive(score.Player) ? ChatColor.GREEN : ChatColor.RED; + return Pair.create(col + score.Player.getName(), index.incrementAndGet()); + }, true); + + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + // Setup all Beam Sources + List sources = WorldData.GetDataLocs("LIME"); + + for (Location location : sources) + { + _sources.add(new BeamSource(location)); + } + + Location start = WorldData.GetDataLocs("RED").get(0); + Location last = start; + List targets = WorldData.GetDataLocs("BLACK"); + ArrayList path = new ArrayList<>(); + path.addAll(targets); + path.addAll(WorldData.GetDataLocs("BROWN")); + + while (!path.isEmpty()) + { + Location closestPath = UtilAlg.findClosest(last, path); + + if (targets.contains(closestPath)) + { + _targets.add(closestPath); + } + + _path.add(closestPath); + path.remove(closestPath); + last = closestPath; + } + + int id = 0; + + for (Location pathPoint : _path) + { + BeamSource source = getClosestSource(pathPoint); + + source.addBeam(Manager, id++, pathPoint); + } + } + + private BeamSource getClosestSource(Location location) + { + BeamSource best = null; + double bestDist = Double.MAX_VALUE; + + for (BeamSource source : _sources) + { + double dist = UtilMath.offsetSquared(source.getSource(), location); + + if (best == null || dist < bestDist) + { + best = source; + bestDist = dist; + } + } + + return best; + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + { + return; + } + + for (Player player : GetPlayers(true)) + { + _score.add(new DragonScore(player, 0)); + } + + _lastBeam = System.currentTimeMillis(); + } + + @EventHandler + public void updateBeam(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !IsLive()) + { + return; + } + + Beam beam = getSuitableBeam(); + + if (beam == null) + { + return; + } + + _lastBeam = System.currentTimeMillis(); + _lastBeamId++; + + Manager.runSyncTimer(new BukkitRunnable() + { + @Override + public void run() + { + if (beam.update()) + { + for (DragonScore score : _score) + { + if (score.Score <= _lastBeamId) + { + Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Phaser"); + } + } + + cancel(); + } + } + }, 0, 2); + } + + private Beam getSuitableBeam() + { + if (!UtilTime.elapsed(_lastBeam, 5000)) + { + return null; + } + + for (BeamSource beamSource : _sources) + { + Beam beam = beamSource.getFromId(_lastBeamId); + + if (beam != null) + { + return beam; + } + } + + return null; + } + + @EventHandler + public void updatePlayerTracker(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTEST || !IsLive()) + { + return; + } + + for (Player player : GetPlayers(true)) + { + DragonScore score = getScore(player); + double currentScore = score.Score; + int newScore = 0; + Location location = UtilAlg.findClosest(player.getLocation(), _path); + + if (UtilMath.offsetSquared(player.getLocation(), location) > 100) + { + break; + } + + for (int i = 0; i < _path.size(); i++) + { + Location a = _path.get(i); + + if (location.equals(a)) + { + newScore = i; + } + } + + if (newScore > currentScore) + { + Bukkit.broadcastMessage(player.getName() + "=" + newScore); + score.Score = newScore; + } + } + } + + @Override + public void EndCheck() + { + for (DragonScore score : _score) + { + if (score.Score == _path.size() - 1) + { + SetState(GameState.End); + } + } + } + + private DragonScore getScore(Player player) + { + for (DragonScore score : _score) + { + if (score.Player.equals(player)) + { + return score; + } + } + + return null; } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java new file mode 100644 index 000000000..ecd80a603 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java @@ -0,0 +1,59 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.particles.effects.LineParticle; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; + +public class Beam extends LineParticle +{ + + private static final int EXPLOSION_RADIUS = 15; + private static final int BEAM_BLOCK_TIME = 1500; + + private final ArcadeManager _manager; + private final Location _target; + private final int _id; + + public Beam(ArcadeManager manager, int id, BeamSource source, Location target) + { + super(source.getSource(), target, null, 1, Integer.MAX_VALUE, null, ParticleType.FIREWORKS_SPARK, UtilServer.getPlayers()); + + _manager = manager; + _id = id; + _target = target; + } + + @Override + public boolean update() + { + super.update(); + Location last = getLastLocation(); + boolean hit = UtilMath.offset(last, _target) < 5; + + if (hit) + { + _manager.GetExplosion().BlockExplosion(UtilBlock.getInRadius(last, EXPLOSION_RADIUS).keySet(), last, false); + UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, last, 4, 1, 4, 0.5F, 10, ViewDist.LONG); + } + else + { + last.getWorld().playSound(last, Sound.ZOMBIE_REMEDY, 2f, 0.75f); + _manager.GetBlockRestore().add(last.getBlock(), Material.SEA_LANTERN.getId(), (byte) 0, BEAM_BLOCK_TIME); + } + + return hit; + } + + public int getId() + { + return _id; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java new file mode 100644 index 000000000..9d796b99d --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java @@ -0,0 +1,43 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.List; + +public class BeamSource +{ + + private final Location _source; + private final List _beams; + + BeamSource(Location source) + { + _source = source; + _beams = new ArrayList<>(5); + } + + public void addBeam(ArcadeManager manager, int id, Location target) + { + _beams.add(new Beam(manager, id, this, target)); + } + + public Location getSource() + { + return _source; + } + + public Beam getFromId(int id) + { + for (Beam beam : _beams) + { + if (beam.getId() == id) + { + return beam; + } + } + + return null; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java new file mode 100644 index 000000000..ab35bd072 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java @@ -0,0 +1,35 @@ +package nautilus.game.arcade.game.games.alieninvasion.kit; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class KitPlayer extends Kit +{ + + private static final String[] DESCRIPTION = { + "" + }; + + private static final Perk[] PERKS = { + + }; + + private static final ItemStack IN_HAND = new ItemStack(Material.ENDER_STONE); + + public KitPlayer(ArcadeManager manager) + { + super(manager, "Player", KitAvailability.Free, DESCRIPTION, PERKS, EntityType.SKELETON, IN_HAND); + } + + @Override + public void GiveItems(Player player) + { + + } +} From 808885ea0436d01d3bf2166d9742bb93d7ffb80b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 May 2017 17:15:55 +0100 Subject: [PATCH 047/170] Add leaper kit --- .../arcade/game/games/alieninvasion/kit/KitPlayer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java index ab35bd072..9a7ac2ac5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java @@ -1,9 +1,11 @@ package nautilus.game.arcade.game.games.alieninvasion.kit; +import mineplex.core.itemstack.ItemStackFactory; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkLeap; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -17,7 +19,11 @@ public class KitPlayer extends Kit }; private static final Perk[] PERKS = { + new PerkLeap("Leap", 1, 1, 8000, 4), + }; + private static final ItemStack[] PLAYER_ITEMS = { + new ItemStack(Material.IRON_AXE) }; private static final ItemStack IN_HAND = new ItemStack(Material.ENDER_STONE); @@ -30,6 +36,7 @@ public class KitPlayer extends Kit @Override public void GiveItems(Player player) { - + player.getInventory().addItem(PLAYER_ITEMS); + player.setExp(0.999F); } } From 8032133f4d6eae6c992477c97ee4481ce7e0cca5 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 May 2017 17:16:16 +0100 Subject: [PATCH 048/170] Sort the scores --- .../games/alieninvasion/AlienInvasion.java | 97 ++++++++++++++++--- 1 file changed, 84 insertions(+), 13 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index d901b8282..84eea19ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -3,9 +3,11 @@ package nautilus.game.arcade.game.games.alieninvasion; import mineplex.core.common.Pair; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -16,14 +18,19 @@ import nautilus.game.arcade.kit.Kit; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; public class AlienInvasion extends SoloGame @@ -33,6 +40,19 @@ public class AlienInvasion extends SoloGame "Something something", "Add this soon" }; + private static final Comparator SCORE_SORTER = (o1, o2) -> + { + if (o1.Score > o2.Score) + { + return 1; + } + else if (o1.Score < o2.Score) + { + return -1; + } + + return 0; + }; private final List _sources = new ArrayList<>(5); private final List _targets = new ArrayList<>(); @@ -40,6 +60,7 @@ public class AlienInvasion extends SoloGame private int _lastBeamId; private long _lastBeam; + private long _nextBeam; private final List _score = new ArrayList<>(16); @@ -55,21 +76,19 @@ public class AlienInvasion extends SoloGame @EventHandler public void ScoreboardUpdate(UpdateEvent event) { - if (event.getType() != UpdateType.FAST || !IsLive()) + if (event.getType() != UpdateType.FAST || !InProgress()) { return; } Scoreboard.writeNewLine(); - AtomicInteger index = new AtomicInteger(0); - List scores = new ArrayList<>(_score); - Collections.reverse(scores); + sortScores(); - Scoreboard.writeGroup(scores.subList(0, Math.min(16, scores.size())), score -> + Scoreboard.writeGroup(_score.subList(0, Math.min(14, _score.size())), score -> { ChatColor col = IsAlive(score.Player) ? ChatColor.GREEN : ChatColor.RED; - return Pair.create(col + score.Player.getName(), index.incrementAndGet()); + return Pair.create(col + score.Player.getName(), (int) score.Score); }, true); Scoreboard.writeNewLine(); @@ -111,11 +130,11 @@ public class AlienInvasion extends SoloGame int id = 0; - for (Location pathPoint : _path) + for (Location target : _targets) { - BeamSource source = getClosestSource(pathPoint); + BeamSource source = getClosestSource(target); - source.addBeam(Manager, id++, pathPoint); + source.addBeam(Manager, id++, target); } } @@ -139,9 +158,9 @@ public class AlienInvasion extends SoloGame } @EventHandler - public void live(GameStateChangeEvent event) + public void prepare(GameStateChangeEvent event) { - if (event.GetState() != GameState.Live) + if (event.GetState() != GameState.Prepare) { return; } @@ -150,8 +169,31 @@ public class AlienInvasion extends SoloGame { _score.add(new DragonScore(player, 0)); } + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + { + return; + } _lastBeam = System.currentTimeMillis(); + _nextBeam = 5000; + + ItemStack sword = new ItemStack(Material.STONE_SWORD); + ItemStack helmet = new ItemStack(Material.GLASS); + + CreatureAllowOverride = true; + for (Location location : WorldData.GetDataLocs("BLUE")) + { + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(location); + + skeleton.getEquipment().setHelmet(helmet); + skeleton.getEquipment().setItemInHand(sword); + } + CreatureAllowOverride = false; } @EventHandler @@ -170,6 +212,7 @@ public class AlienInvasion extends SoloGame } _lastBeam = System.currentTimeMillis(); + _nextBeam -= 50; _lastBeamId++; Manager.runSyncTimer(new BukkitRunnable() @@ -179,6 +222,11 @@ public class AlienInvasion extends SoloGame { if (beam.update()) { + for (Entry entry : UtilPlayer.getInRadius(beam.getLastLocation(), 20).entrySet()) + { + Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, "Alien Invasion", "Phaser"); + } + for (DragonScore score : _score) { if (score.Score <= _lastBeamId) @@ -195,7 +243,7 @@ public class AlienInvasion extends SoloGame private Beam getSuitableBeam() { - if (!UtilTime.elapsed(_lastBeam, 5000)) + if (!UtilTime.elapsed(_lastBeam, _nextBeam)) { return null; } @@ -254,15 +302,38 @@ public class AlienInvasion extends SoloGame @Override public void EndCheck() { + if (!IsLive()) + { + return; + } + + List alive = GetPlayers(true); + for (DragonScore score : _score) { - if (score.Score == _path.size() - 1) + if (score.Score == _path.size() - 1 || alive.isEmpty()) { + sortScores(); + List players = new ArrayList<>(_score.size()); + + for (DragonScore score1 : _score) + { + players.add(score1.Player); + } + + Collections.reverse(players); + AnnounceEnd(players); SetState(GameState.End); + return; } } } + private void sortScores() + { + _score.sort(SCORE_SORTER); + } + private DragonScore getScore(Player player) { for (DragonScore score : _score) From 2e3d19bd3a70b0224f7a4b3f4cbbcb2949305046 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 May 2017 21:49:44 +0100 Subject: [PATCH 049/170] Bug fixes --- .../game/arcade/game/games/smash/kits/KitEnderman.java | 6 ++++++ .../games/smash/perks/creeper/PerkCreeperSulphurBomb.java | 1 + .../arcade/game/games/smash/perks/squid/PerkInkBlast.java | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index ab333d936..cb1e1d08d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -121,6 +121,12 @@ public class KitEnderman extends SmashKit public void damage(CustomDamageEvent event) { Player player = event.GetDamageePlayer(); + + if (player == null) + { + return; + } + DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); if (player != null && disguise != null && disguise instanceof DisguiseEnderman) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java index f8f782cac..df921ff65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java @@ -105,6 +105,7 @@ public class PerkCreeperSulphurBomb extends SmashPerk UtilParticle.PlayParticleToAll(ParticleType.EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.LONG); data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 2f); data.getThrown().remove(); + _sulphur.remove(data.getThrower().getUniqueId()); } }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java index 8b15e9455..b2e1a00fc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java @@ -56,7 +56,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown _projectileVelocity = getPerkFloat("Projectile Velocity"); _knockbackMagnitude = getPerkInt("Knockback Magnitude"); _bullets = getPerkInt("Bullets"); - _damagePerBullet = getPerkInt("Damage Per Bullet"); + _damagePerBullet = getPerkDouble("Damage Per Bullet"); } @EventHandler From f9f2e362c4a8262c3984eaf703d7ea47424bc861 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:28:49 -0400 Subject: [PATCH 050/170] Make ItemBuilder properly clone all options and implement a builder to create enchanted books --- .../core/itemstack/EnchantedBookBuilder.java | 63 +++++++++++++++++++ .../mineplex/core/itemstack/ItemBuilder.java | 15 ++++- 2 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java new file mode 100644 index 000000000..f4228e06d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java @@ -0,0 +1,63 @@ +package mineplex.core.itemstack; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta;; + +public class EnchantedBookBuilder +{ + private Map _enchantments; + private int _amount; + + public EnchantedBookBuilder(int amount) + { + _enchantments = new HashMap<>(); + _amount = amount; + } + + public Map getEnchantments() + { + return _enchantments; + } + + public Integer getLevel(Enchantment enchantment) + { + return _enchantments.getOrDefault(enchantment, 0); + } + + public EnchantedBookBuilder setLevel(Enchantment enchantment, Integer level) + { + if (level <= 0) + { + _enchantments.remove(enchantment); + } + else + { + _enchantments.put(enchantment, level); + } + + return this; + } + + public EnchantedBookBuilder removeEnchantment(Enchantment enchantment) + { + _enchantments.remove(enchantment); + + return this; + } + + public ItemStack build() + { + ItemStack item = new ItemStack(Material.ENCHANTED_BOOK, _amount); + EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemMeta(); + + _enchantments.entrySet().forEach(entry -> meta.addStoredEnchant(entry.getKey(), entry.getValue(), true)); + item.setItemMeta(meta); + + return item; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java index 14af0f28d..b0a1f825d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java @@ -8,8 +8,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import mineplex.core.common.util.UtilInput; -import mineplex.core.common.util.UtilInv; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -26,6 +24,7 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.SkullMeta; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilInv; public class ItemBuilder { @@ -311,6 +310,18 @@ public class ItemBuilder // newBuilder.potion = potion; newBuilder.setDurability(_durability); + newBuilder.setData(_data); + + newBuilder.setAmount(_amount); + + newBuilder.setUnbreakable(_unbreakable); + + newBuilder.setGlow(_glow); + + newBuilder.setItemFlags(_itemFlags); + + newBuilder.setPlayerHead(_playerHeadName); + return newBuilder; } From 6ffd10133eee793a4e417a1b291b6d29475138af Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:29:38 -0400 Subject: [PATCH 051/170] Implement a new crown currency --- .../core/donation/DonationManager.java | 151 +++++++++++++++++- .../core/donation/command/CrownCommand.java | 91 +++++++++++ .../core/donation/crown/CrownRepository.java | 117 ++++++++++++++ 3 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java index 9b1934c9c..8ef17f337 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java @@ -1,9 +1,12 @@ package mineplex.core.donation; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import org.bukkit.entity.Player; @@ -15,10 +18,14 @@ import mineplex.core.MiniClientPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; +import mineplex.core.account.ILoginProcessor; +import mineplex.core.account.event.ClientUnloadEvent; import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.donation.command.CrownCommand; import mineplex.core.donation.command.GemCommand; import mineplex.core.donation.command.ShardCommand; +import mineplex.core.donation.crown.CrownRepository; import mineplex.core.donation.gold.GoldRepository; import mineplex.core.donation.repository.DonationRepository; import mineplex.core.donation.repository.token.DonorTokenWrapper; @@ -40,7 +47,10 @@ public class DonationManager extends MiniClientPlugin private static final Gson GSON = new Gson(); private final Map> _attemptUntilSuccess = new HashMap<>(); - + + private final Map _crownBalance = new ConcurrentHashMap<>(); + private final CrownRepository _crownRepository; + private final CoreClientManager _clientManager = require(CoreClientManager.class); private final DonationRepository _repository; @@ -52,6 +62,36 @@ public class DonationManager extends MiniClientPlugin _repository = new DonationRepository(); _goldRepository = new GoldRepository(); + + _crownRepository = new CrownRepository(); + _clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() + { + @Override + public String getName() + { + return "crown-balance-loader"; + } + + @Override + public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException + { + boolean hasRow = resultSet.next(); + if (hasRow) + { + _crownBalance.put(uuid, resultSet.getInt(1)); + } + else + { + _crownBalance.put(uuid, 0); + } + } + + @Override + public String getQuery(int accountId, String uuid, String name) + { + return "SELECT crownCount FROM accountCrowns WHERE accountId=" + accountId + ";"; + } + }); UtilScheduler.runEvery(UpdateType.FAST, this::processCoinAttemptQueue); } @@ -61,6 +101,7 @@ public class DonationManager extends MiniClientPlugin { addCommand(new GemCommand(this)); addCommand(new ShardCommand(this)); + addCommand(new CrownCommand(this)); } @EventHandler @@ -75,6 +116,88 @@ public class DonationManager extends MiniClientPlugin { return _goldRepository; } + + public int getCrowns(Player player) + { + return getCrowns(player.getUniqueId()); + } + + public int getCrowns(UUID uuid) + { + return _crownBalance.computeIfAbsent(uuid, key -> 0); + } + + /** + * Adds an unknown sales package to the specified {@link Player} + * + * @param callback The callback which will be called on the main thread. Possible responses are: + * {@link TransactionResponse#InsufficientFunds}, when the player does not have enough of the currency + * {@link TransactionResponse#Success}, when everything worked fine + * {@link TransactionResponse#Failed}, when an known exception occured + * {@link TransactionResponse#AlreadyOwns}, when the player already owns the package + */ + public void purchaseUnknownSalesPackageCrown(Player player, String packageName, int cost, boolean oneTimePurchase, Consumer callback) + { + purchaseUnknownSalesPackageCrown(_clientManager.Get(player), packageName, cost, oneTimePurchase, callback); + } + + /** + * Adds an unknown sales package to the specified {@link CoreClient} + * + * @param callback The callback which will be called on the main thread. Possible responses are: + * {@link TransactionResponse#InsufficientFunds}, when the player does not have enough of the currency + * {@link TransactionResponse#Success}, when everything worked fine + * {@link TransactionResponse#Failed}, when an known exception occured + * {@link TransactionResponse#AlreadyOwns}, when the player already owns the package + */ + public void purchaseUnknownSalesPackageCrown(CoreClient client, String packageName, int cost, boolean oneTimePurchase, Consumer callback) + { + Donor donor = Get(client.getUniqueId()); + + if (donor != null) + { + if (oneTimePurchase && donor.ownsUnknownSalesPackage(packageName)) + { + if (callback != null) + { + callback.accept(TransactionResponse.AlreadyOwns); + } + + return; + } + } + + _crownRepository.consumeCrowns(result -> + { + if (result == TransactionResponse.Success) + { + if (_crownBalance.containsKey(client.getUniqueId())) + { + _crownBalance.put(client.getUniqueId(), _crownBalance.get(client.getUniqueId()) - cost); + } + _repository.purchaseUnknownSalesPackage(client.getName(), packageName, GlobalCurrency.GEM, 0, response -> + { + if (response == TransactionResponse.Success) + { + if (donor != null) + { + donor.addOwnedUnknownSalesPackage(packageName); + donor.addBalance(GlobalCurrency.GEM, 0); + } + } + + if (callback != null) + { + callback.accept(response); + } + }); + } + else if (callback != null) + { + callback.accept(result); + } + }, client.getAccountId(), cost); + } /** * Adds an unknown sales package to the specified {@link Player} @@ -187,6 +310,26 @@ public class DonationManager extends MiniClientPlugin callback.accept(response); }); } + + public void rewardCrowns(int crowns, Player player) + { + rewardCrowns(crowns, player, null); + } + + public void rewardCrowns(int crowns, Player player, Consumer completed) + { + _crownRepository.rewardCrowns(success -> + { + if (success) + { + _crownBalance.merge(player.getUniqueId(), crowns, Integer::sum); + } + if (completed != null) + { + completed.accept(success); + } + }, _clientManager.Get(player).getAccountId(), crowns); + } /** * Rewards the specified {@link Player} with {@code amount} of {@code currency} because of {@code reason} @@ -405,4 +548,10 @@ public class DonationManager extends MiniClientPlugin { return _clientManager; } + + @EventHandler + public void unloadCrownBalance(ClientUnloadEvent event) + { + _crownBalance.remove(event.getUniqueId()); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java new file mode 100644 index 000000000..72800e748 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java @@ -0,0 +1,91 @@ +package mineplex.core.donation.command; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.donation.DonationManager; + +public class CrownCommand extends CommandBase +{ + public CrownCommand(DonationManager plugin) + { + super(plugin, Rank.ADMIN, "crown"); + } + + @Override + public void Execute(final Player caller, String[] args) + { + if (args.length < 2) + { + UtilPlayer.message(caller, F.main("Crown", "Missing Args: " + F.elem("/crown "))); + return; + } + + String targetName = args[0]; + + int amount; + + try + { + amount = Integer.parseInt(args[1]); + } + catch (NumberFormatException ex) + { + UtilPlayer.message(caller, F.main("Crown", "Invalid crown Amount")); + return; + } + + if (targetName.equalsIgnoreCase("@a")) + { + rewardAllCrowns(caller, amount); + } + else + { + Player target = UtilPlayer.searchExact(targetName); + if (target != null) + { + rewardCrowns(caller, target, amount); + } + else + { + UtilPlayer.message(caller, F.main("Crown", "Could not find player " + F.name(targetName))); + } + } + } + + private void rewardAllCrowns(Player caller, int crowns) + { + if (crowns > 1000) + { + UtilPlayer.message(caller, F.main("Crown", "You can only give everybody 1000 crowns at a time.")); + return; + } + + for (Player player : UtilServer.getPlayers()) + { + Plugin.rewardCrowns(crowns, player); + } + + UtilPlayer.message(caller, F.main("Crown", "Gave everyone " + F.elem(crowns + " crowns"))); + } + + private void rewardCrowns(Player caller, Player target, int crowns) + { + Plugin.rewardCrowns(crowns, target, completed -> + { + if (completed) + { + UtilPlayer.message(caller, F.main("Crown", "You gave " + F.elem(crowns + " crowns") + " to " + F.name(target.getName()) + ".")); + UtilPlayer.message(target, F.main("Crown", F.name(caller.getName()) + " gave you " + F.elem(crowns + " crowns") + ".")); + } + else + { + UtilPlayer.message(caller, F.main("Crown", "There was an error giving " + F.elem(crowns + " crowns") + " to " + F.name(target.getName()) + ".")); + } + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java new file mode 100644 index 000000000..1a449f565 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java @@ -0,0 +1,117 @@ +package mineplex.core.donation.crown; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import org.bukkit.Bukkit; + +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.UtilServer; +import mineplex.core.server.util.TransactionResponse; +import mineplex.serverdata.database.DBPool; + +public class CrownRepository +{ + private static final String CREATE_TABLE = "CREATE TABLE accountCrowns (accountId INT(11) NOT NULL, crownCount INT NOT NULL, PRIMARY KEY (accountId), FOREIGN KEY (accountId) REFERENCES accounts(id));"; + private static final String REWARD_ACCOUNT_CROWNS = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (?, ?) ON DUPLICATE KEY UPDATE crownCount=crownCount+VALUES(crownCount);"; + private static final String CONSUME_ACCOUNT_CROWNS = "UPDATE accountCrowns SET crownCount=(crownCount - ?) WHERE accountId=? AND crownCount >= ?;"; + private static final String SET_ACCOUNT_CROWNS = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (?, ?) ON DUPLICATE KEY UPDATE crownCount=VALUES(crownCount);"; + + public CrownRepository() {} + + public void rewardCrowns(final Callback callback, final int accountId, final int crowns) + { + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + PreparedStatement statement = connection.prepareStatement(REWARD_ACCOUNT_CROWNS); + statement.setInt(1, accountId); + statement.setInt(2, crowns); + statement.executeUpdate(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(true)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(false)); + } + } + }); + } + + public void consumeCrowns(final Callback callback, final int accountId, final int crowns) + { + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + String baseStmt = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (" + accountId + ", 0) ON DUPLICATE KEY UPDATE crownCount=crownCount;"; + PreparedStatement statement = connection.prepareStatement(baseStmt + CONSUME_ACCOUNT_CROWNS); + statement.setInt(1, crowns); + statement.setInt(2, accountId); + statement.setInt(3, crowns); + statement.execute(); + + statement.getMoreResults(); + + final TransactionResponse response = statement.getUpdateCount() > 0 ? TransactionResponse.Success : TransactionResponse.InsufficientFunds; + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(response)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(TransactionResponse.Failed)); + } + } + }); + } + + public void setGold(final Callback callback, final int accountId, final int crowns) + { + if (crowns < 0) + { + throw new IllegalArgumentException("Crowns cannot be negative"); + } + + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + PreparedStatement statement = connection.prepareStatement(SET_ACCOUNT_CROWNS); + statement.setInt(1, accountId); + statement.setInt(2, crowns); + statement.executeUpdate(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(true)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(false)); + } + } + }); + } +} \ No newline at end of file From 39f997faf1d5accb3917633aa8540ba0a28e2705 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:30:39 -0400 Subject: [PATCH 052/170] Give ProgressiveKits the ability to not use xp or use crowns instead of gems for leveling --- .../src/mineplex/core/progression/ProgressiveKit.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java index 395bd428d..05c48e0b7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java @@ -285,4 +285,14 @@ public interface ProgressiveKit ViewDist.NORMAL, displayTo); } } + + default boolean usesXp() + { + return true; + } + + default boolean crownsEnabled() + { + return false; + } } \ No newline at end of file From 6684e812d151e6466e9a2f0f75f851f8abbd5853 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:33:48 -0400 Subject: [PATCH 053/170] Implement xp-less and crown kit upgrading and slightly modify kit progression gui --- .../progression/data/KitUpgradeProcessor.java | 60 ++++++++++++------- .../gui/buttons/KitUpgradeDetailsButton.java | 34 ++++++++--- .../gui/buttons/KitUpgradeMenuButton.java | 24 ++++++-- .../progression/gui/guis/KitDisplayMenu.java | 9 ++- .../gui/guis/KitInformationTrackerMenu.java | 26 +++++--- .../core/progression/math/Calculations.java | 54 +++++++++++++++-- 6 files changed, 156 insertions(+), 51 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java index e8cff97ee..e090dae6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java @@ -1,6 +1,6 @@ package mineplex.core.progression.data; -import mineplex.core.server.util.TransactionResponse; +import java.util.function.Consumer; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -11,6 +11,7 @@ import mineplex.core.common.util.F; import mineplex.core.progression.KitProgressionManager; import mineplex.core.progression.ProgressiveKit; import mineplex.core.progression.math.Calculations; +import mineplex.core.server.util.TransactionResponse; import mineplex.core.shop.confirmation.ConfirmationCallback; import mineplex.core.shop.confirmation.ConfirmationProcessor; @@ -39,27 +40,40 @@ public class KitUpgradeProcessor implements ConfirmationProcessor { String packageName = _kit.getInternalName() + "." + _upgradeLevel; int cost = Calculations.getGemsCost(_upgradeLevel); + if (!_kit.usesXp()) + { + cost = Calculations.getGemsCostXpLess(_upgradeLevel); + } + + Consumer handler = response -> + { + if (response == TransactionResponse.Success) + { + _kit.upgrade(_upgradeLevel, _player.getUniqueId()); + + _player.playSound(_player.getLocation(), Sound.CAT_MEOW, 5.0f, 1.0f); + _player.sendMessage(F.main("Kit Progression", "Purchased upgrades for " + _kit.getDisplayName() + " level " + _upgradeLevel)); + + callback.resolve("Success! You now own this upgrade!"); + } + else if (response == TransactionResponse.InsufficientFunds) + { + callback.reject("Insufficient funds!"); + } + else + { + callback.reject("There was an error processing your transaction. Try again later"); + } + }; + // Use UnknownPackages for this right now as it handles overspending gems properly - _manager.getDonationManager().purchaseUnknownSalesPackage(_player, packageName, GlobalCurrency.GEM, cost, false, - data -> - { - if (data == TransactionResponse.Success) - { - _kit.upgrade(_upgradeLevel, _player.getUniqueId()); - - _player.playSound(_player.getLocation(), Sound.CAT_MEOW, 5.0f, 1.0f); - _player.sendMessage(F.main("Kit Progression", "Purchased upgrades for " + _kit.getDisplayName() + " level " + _upgradeLevel)); - - callback.resolve("Success! You now own this upgrade!"); - } - else if (data == TransactionResponse.InsufficientFunds) - { - callback.reject("Insufficient funds!"); - } - else - { - callback.reject("There was an error processing your transaction. Try again later"); - } - }); + if (_kit.crownsEnabled()) + { + _manager.getDonationManager().purchaseUnknownSalesPackageCrown(_player, packageName, cost, false, handler); + } + else + { + _manager.getDonationManager().purchaseUnknownSalesPackage(_player, packageName, GlobalCurrency.GEM, cost, false, handler); + } } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java index 911a8087d..11a12c356 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java @@ -1,14 +1,18 @@ package mineplex.core.progression.gui.buttons; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + import com.google.common.collect.Lists; + import mineplex.core.common.util.C; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.menu.IconButton; +import mineplex.core.progression.ProgressiveKit; import mineplex.core.progression.math.Calculations; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -import java.util.List; /** * Representing this kits Abilities in a GUI @@ -18,11 +22,13 @@ public class KitUpgradeDetailsButton extends IconButton private ItemStack _item; - public KitUpgradeDetailsButton(int level, List details) + public KitUpgradeDetailsButton(ProgressiveKit kit, Player player, int level, List details) { super(null); - - ItemBuilder builder = new ItemBuilder(Material.SLIME_BALL); + + int current = kit.getUpgradeLevel(player.getUniqueId()); + + ItemBuilder builder = new ItemBuilder(Material.STAINED_CLAY).setData((current >= level) ? (short)5 : (short)14); builder.setTitle(C.cYellow + "Level " + level + " upgrades"); @@ -34,7 +40,19 @@ public class KitUpgradeDetailsButton extends IconButton } lore.add(""); - lore.add(C.cGray + "Unlocks at kit level " + C.cGreen + Calculations.getLevelRequiredFor(level)); + if (kit.usesXp()) + { + lore.add(C.cGray + "Unlocks at kit level " + C.cGreen + Calculations.getLevelRequiredFor(level)); + } + else + { + String currency = C.cGreen + "%cost% Gems"; + if (kit.crownsEnabled()) + { + currency = C.cGold + "%cost% Crowns"; + } + lore.add(C.cGray + "Unlocks with " + currency.replace("%cost%", Calculations.getGemsCostXpLess(level) + "")); + } builder.setLore(lore.toArray(new String[lore.size()])); _item = builder.build(); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java index 0bd36086c..263f69476 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java @@ -1,5 +1,6 @@ package mineplex.core.progression.gui.buttons; +import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.util.C; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.progression.KitProgressionManager; @@ -47,14 +48,20 @@ public class KitUpgradeMenuButton extends KitButton //The difference between the players current level, and the next upgrade level int diff = nextUpgradeLevelPlayer - level; + int balance = plugin.getDonationManager().Get(player).getBalance(GlobalCurrency.GEM); + if (kit.crownsEnabled()) + { + balance = plugin.getDonationManager().getCrowns(player); + } + //This ONLY flashes if their next upgrade level isn't their same one. - _flash = Calculations.isUpgradeLevelEligible(level) && (nextUpgradeLevel > upgradeLevel); + _flash = (kit.usesXp() ? (Calculations.isUpgradeLevelEligible(level) && (nextUpgradeLevel > upgradeLevel)) : (Calculations.isUpgradeLevelEligibleXpLess(balance) && upgradeLevel < Calculations.getNextUpgradeLevelXpLess(upgradeLevel))); ChatColor color = Calculations.getColor(level, nextUpgradeLevelPlayer); - if(kit.showUpgrades()) + if (kit.showUpgrades()) { - ItemBuilder builder = lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel, color, diff); + ItemBuilder builder = kit.usesXp() ? lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel, color, diff) : lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel); builder.setTitle(C.cYellow + "Upgrade Level " + upgradeLevel); _item = builder.build(); } @@ -138,4 +145,13 @@ public class KitUpgradeMenuButton extends KitButton ChatColor.WHITE + "Click to view Upgrade and XP tracking"); return builder; } -} + + private ItemBuilder lore(ItemBuilder builder, int upgradeLevel) + { + builder.setLore(" ", + ChatColor.WHITE + "Upgrade Level: " + ChatColor.GREEN + upgradeLevel + " out of 5", + "", + ChatColor.WHITE + "Click to view Upgrades"); + return builder; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java index 2a9d73b67..e32104822 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java @@ -63,8 +63,11 @@ public class KitDisplayMenu extends KitMenu */ private void setUpNextMenuButtons(Button[] buttons, Player player) { - buttons[48] = new KitXPButton(getKit(), player, getPlugin()); - buttons[50] = new KitUpgradeMenuButton(getKit(), player, getPlugin()); + if (getKit().usesXp()) + { + buttons[48] = new KitXPButton(getKit(), player, getPlugin()); + } + buttons[getKit().usesXp() ? 50 : 49] = new KitUpgradeMenuButton(getKit(), player, getPlugin()); } /** @@ -90,7 +93,7 @@ public class KitDisplayMenu extends KitMenu int index = 0; for(int i : UPGRADE_SLOTS) { - buttons[i] = new KitUpgradeDetailsButton(index + 1, details.get(index++)); + buttons[i] = new KitUpgradeDetailsButton(getKit(), player, index + 1, details.get(index++)); } return; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java index 42d1aa723..9a61c872f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java @@ -59,11 +59,13 @@ public class KitInformationTrackerMenu extends KitMenu Button[] buttons = new Button[52]; buttons[0] = new BackButton(new KitDisplayMenu(getKit(), getPlugin())); - - setUpXP(buttons, player); - - setUpLevel(buttons, player); - + + if (getKit().usesXp()) + { + setUpXP(buttons, player); + setUpLevel(buttons, player); + } + setUpUpgrade(buttons, player); return buttons; @@ -155,10 +157,10 @@ public class KitInformationTrackerMenu extends KitMenu Map> details = getKit().getUpgradeDetails(); int index = 0; - for(int i : UPGRADE_SLOTS) + for (int i : (getKit().usesXp() ? UPGRADE_SLOTS : LEVEL_SLOTS)) { List list = details.get(index++); - KitUpgradeDetailsButton detailsButton = new KitUpgradeDetailsButton(index, list); + KitUpgradeDetailsButton detailsButton = new KitUpgradeDetailsButton(getKit(), player, index, list); ItemBuilder itemStack = new ItemBuilder(detailsButton.getItemStack()); if (getKit().ownsUpgrade(player.getUniqueId(), index)) @@ -168,12 +170,18 @@ public class KitInformationTrackerMenu extends KitMenu else if (getKit().canPurchaseUpgrade(player.getUniqueId(), index)) { itemStack.setGlow(true); - itemStack.addLore("Costs " + C.cGreen + Calculations.getGemsCost(index) + C.cGray + " gems"); + if (getKit().usesXp()) + { + itemStack.addLore("Costs " + (getKit().crownsEnabled() ? C.cGold : C.cGreen) + Calculations.getGemsCost(index) + C.cGray + (getKit().crownsEnabled() ? " crowns" : " gems")); + } itemStack.addLore(C.cGreen + "Click to purchase this upgrade!"); } else { - itemStack.addLore("Costs " + C.cGreen + Calculations.getGemsCost(index) + C.cGray + " gems"); + if (getKit().usesXp()) + { + itemStack.addLore("Costs " + (getKit().crownsEnabled() ? C.cGold : C.cGreen) + Calculations.getGemsCost(index) + C.cGray + (getKit().crownsEnabled() ? " crowns" : " gems")); + } itemStack.addLore(C.cRed + "You cannot purchase this upgrade!"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java index b4a6ac726..ae9c9013b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java @@ -1,10 +1,12 @@ package mineplex.core.progression.math; -import com.google.common.collect.Maps; -import net.md_5.bungee.api.ChatColor; - +import java.util.HashMap; import java.util.Map; +import com.google.common.collect.Maps; + +import net.md_5.bungee.api.ChatColor; + /** * This class handles all the math and static fields needed for Kit Progressions * You can find some util methods in here as well that relate to numbers @@ -15,6 +17,7 @@ public class Calculations private static final int[] LEVELS = new int[100]; private static final int[] UPGRADE_LEVELS = {5, 10, 30, 75, 100}; private static final Map GEMS_FOR_UPGRADE = Maps.newHashMap(); + private static final Map GEMS_FOR_XPLESS_UPGRADE = new HashMap<>(); static { @@ -23,6 +26,11 @@ public class Calculations { GEMS_FOR_UPGRADE.put(level, level * 1000); } + GEMS_FOR_XPLESS_UPGRADE.put(1, 1000); + GEMS_FOR_XPLESS_UPGRADE.put(2, 5000); + GEMS_FOR_XPLESS_UPGRADE.put(3, 15000); + GEMS_FOR_XPLESS_UPGRADE.put(4, 30000); + GEMS_FOR_XPLESS_UPGRADE.put(5, 60000); } /** @@ -79,6 +87,20 @@ public class Calculations { return GEMS_FOR_UPGRADE.containsKey(currentLevel); } + + public static boolean isUpgradeLevelEligibleXpLess(int gems) + { + boolean afford = false; + + for (int cost : GEMS_FOR_XPLESS_UPGRADE.values()) + { + if (cost <= gems) + { + afford = true; + } + } + return afford; + } /** * Determines if the players current level, and his gems, are what he needs to level up this upgrade @@ -91,6 +113,11 @@ public class Calculations { return GEMS_FOR_UPGRADE.containsKey(currentLevel) && GEMS_FOR_UPGRADE.get(currentLevel) <= gems; } + + public static boolean canUpgradeXpLess(int upgradeLevel, int gems) + { + return GEMS_FOR_XPLESS_UPGRADE.containsKey(upgradeLevel) && GEMS_FOR_XPLESS_UPGRADE.get(upgradeLevel) <= gems; + } /** * Get the XP required for the next level @@ -155,7 +182,7 @@ public class Calculations } /** - * Get the next integer upgrade level based of the players current leve; + * Get the next integer upgrade level based of the players current level * * @param currentLevel The players current level * @return The next upgrade level @@ -169,6 +196,20 @@ public class Calculations } return 5; } + + public static int getNextUpgradeLevelXpLess(int currentLevel) + { + int current = 5; + for (int level : GEMS_FOR_XPLESS_UPGRADE.keySet()) + { + if (level < current && level > currentLevel) + { + current = level; + } + } + + return current; + } /** * Get the next level the player needs to reach to unlock an upgrade @@ -215,4 +256,9 @@ public class Calculations { return GEMS_FOR_UPGRADE.get(getLevelRequiredFor(upgradeLevel)); } + + public static int getGemsCostXpLess(int upgradeLevel) + { + return GEMS_FOR_XPLESS_UPGRADE.get(upgradeLevel); + } } From 43739743bfd3dfc0b2582deb32e03286d594ddce Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:34:58 -0400 Subject: [PATCH 054/170] Add new castle siege game types to Core --- Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index cc5ba27d4..eeb057525 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -15,6 +15,8 @@ public enum GameDisplay BossBattles("Boss Battles", Material.SKULL_ITEM, (byte) 0, GameCategory.EVENT, 55, false), Bridge("The Bridges", Material.IRON_PICKAXE, (byte)0, GameCategory.SURVIVAL, 3, true), CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 4, true), + CastleSiegeNew("Castle Siege New", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), + CastleSiegeTDM("Castle Siege TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, true), ChampionsDominate("Champions Domination", "Champions", Material.BEACON, (byte)0, GameCategory.CHAMPIONS, 6, true), ChampionsTDM("Champions TDM", "Champions", Material.GOLD_SWORD, (byte)0, GameCategory.CHAMPIONS, 5, true), Christmas("Christmas Chaos", Material.SNOW_BALL, (byte)0, GameCategory.CLASSICS, 8, false), From 901fecb49a83f64380c7b3c35f6ca2c06761ea25 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:36:02 -0400 Subject: [PATCH 055/170] Support multi named tiers of achievements, allow rewarding of xp/gems/crowns upon increasing achievement tiers, and replace old castle siege achievements with new ones --- .../core/achievement/Achievement.java | 125 +++++++++++++++--- .../core/achievement/AchievementCategory.java | 7 +- .../core/achievement/StatDisplay.java | 1 + .../achievement/ui/page/AchievementPage.java | 29 ++-- 4 files changed, 130 insertions(+), 32 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 419b8b977..87b22ddad 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -375,28 +375,76 @@ public enum Achievement AchievementCategory.MASTER_BUILDERS), //Castle Siege - CASTLE_SIEGE_WINS("FOR THE KING!", 600, - new String[]{"Castle Siege.ForTheKing"}, - new String[]{"Win as Defenders 50 times"}, - new int[]{50}, + CASTLE_SIEGE_KILL_STREAK("Kill Streak", 0, + new String[]{"Castle Siege New.KillStreak", "Castle Siege TDM.KillStreak"}, + new String[]{"Earn Kill Streak Rewards"}, + new int[][]{new int[]{0, 50, 500}, new int[]{0, 100, 750}, new int[]{0, 150, 1000}, new int[]{0, 200, 1500}, new int[]{0, 400, 2000}, new int[]{0, 500, 2500}, new int[]{0, 1000, 3000}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4000}, new int[]{0, 5000, 100000}}, + new int[]{10, 20, 50, 100, 200, 250, 500, 750, 1000, 2000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_SIEGE), - - CASTLE_SIEGE_KINGSLAYER("Kingslayer", 800, - new String[]{"Castle Siege.KingSlayer"}, - new String[]{"Get the killing blow on the King"}, - new int[]{1}, + + CASTLE_SIEGE_FIRST_BLOOD("First Blood", 0, + new String[]{"Castle Siege New.FirstBlood", "Castle Siege TDM.FirstBlood"}, + new String[]{"Obtain the first kill in a Match"}, + new int[][]{new int[]{0, 100, 100}, new int[]{0, 150, 200}, new int[]{0, 200, 300}, new int[]{0, 250, 400}, new int[]{0, 500, 500}}, + new int[]{2, 5, 10, 25, 50}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V"}, AchievementCategory.CASTLE_SIEGE), - - CASTLE_SIEGE_BLOOD_THIRSTY("Blood Thirsty", 1200, - new String[]{"Castle Siege.BloodThirsty"}, - new String[]{"Kill 50 Undead in a single game"}, - new int[]{1}, + + CASTLE_SIEGE_FIGHTER_KIT("Fighter", 0, + new String[]{"Castle Siege New.FighterKitKills", "Castle Siege TDM.FighterKitKills"}, + new String[]{"Kill opponents while wearing the Fighter Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_SIEGE), - - CASTLE_SIEGE_ASSASSIN("Assassin", 1000, - new String[]{"Castle Siege.Assassin"}, - new String[]{"Do 50% or more of the damage to the king"}, - new int[]{1}, + + CASTLE_SIEGE_TANK_KIT("Tank", 0, + new String[]{"Castle Siege New.TankKitKills", "Castle Siege TDM.TankKitKills"}, + new String[]{"Kill opponents while wearing the Tank Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_ARCHER_KIT("Archer", 0, + new String[]{"Castle Siege New.ArcherKitKills", "Castle Siege TDM.ArcherKitKills"}, + new String[]{"Kill opponents while wearing the Archer Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_DEMOLITIONIST_KIT("Demolitionist", 0, + new String[]{"Castle Siege New.DemolitionistKitKills", "Castle Siege TDM.DemolitionistKitKills"}, + new String[]{"Kill opponents while wearing the Demolitionist Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_WINNER("Siege", 0, + new String[]{"Castle Siege New.Wins", "Castle Siege TDM.Wins"}, + new String[]{"Win games of Castle Siege"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{2, 5, 25, 50, 100, 150, 250, 500, 1000, 2000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_MEDALIST("Medalist", 0, + new String[]{"Castle Siege New.MedalsEarned", "Castle Siege TDM.MedalsEarned"}, + new String[]{"Earn Bronze, Silver, or Gold Medals in Castle Siege Matches"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{2, 50, 150, 250, 500, 1000, 1500, 2500, 5000, 10000}, + "Novice I", + new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_SIEGE), //Champions @@ -1135,17 +1183,36 @@ public enum Achievement private String _name; private String[] _desc; private String[] _stats; + private int[][] _levelUpRewards; private int[] _levels; + private String _defaultLevelName; + private String[] _levelNames; private int _gems; private AchievementCategory _category; + Achievement(String name, int gems, String[] stats, String[] desc, int[][] levelUpRewards, int[] levels, String defaultLevelName, String[] levelNames, AchievementCategory category) + { + _name = name; + _gems = gems; + _desc = desc; + _stats = stats; + _levelUpRewards = levelUpRewards; + _levels = levels; + _defaultLevelName = defaultLevelName; + _levelNames = levelNames; + _category = category; + } + Achievement(String name, int gems, String[] stats, String[] desc, int[] levels, AchievementCategory category) { _name = name; _gems = gems; _desc = desc; _stats = stats; + _levelUpRewards = new int[][] {}; _levels = levels; + _levelNames = new String[] {}; + _defaultLevelName = ""; _category = category; } @@ -1228,11 +1295,26 @@ public enum Achievement { return _stats; } + + public int[][] getLevelUpRewards() + { + return _levelUpRewards; + } public int[] getLevels() { return _levels; } + + public String getDefaultLevelName() + { + return _defaultLevelName; + } + + public String[] getLevelNames() + { + return _levelNames; + } public int getMaxLevel() { @@ -1248,6 +1330,11 @@ public enum Achievement { return _levels.length == 1; } + + public boolean hasLevelNames() + { + return _levelNames.length > 0; + } public AchievementCategory getCategory() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 37805a3be..3316c653b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -85,10 +85,9 @@ public enum AchievementCategory new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, Material.BLAZE_ROD, 0, GameCategory.SURVIVAL, "Witch Doctor Kit", false, GameDisplay.Wizards.getGameId()), - CASTLE_SIEGE("Castle Siege", null, - new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, new StatDisplay("Kills as Defenders"), new StatDisplay("Deaths as Defenders"), - new StatDisplay("Kills as Undead"), new StatDisplay("Deaths as Undead"), StatDisplay.GEMS_EARNED }, - Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiege.getGameId()), + CASTLE_SIEGE("Castle Siege", new String[] {"Castle Siege New", "Castle Siege TDM"}, + new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.CROWNS_EARNED }, + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiegeNew.getGameId()), BAWK_BAWK_BATTLES("Bawk Bawk Battles", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java index a4dc577ed..8609bb12a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java @@ -89,6 +89,7 @@ public class StatDisplay public static final StatDisplay KILLS = new StatDisplay("Kills"); public static final StatDisplay DEATHS = new StatDisplay("Deaths"); public static final StatDisplay GEMS_EARNED = new StatDisplay("Gems Earned", "GemsEarned"); + public static final StatDisplay CROWNS_EARNED = new StatDisplay("Crowns Earned", "CrownsEarned"); public static final StatDisplay TIME_IN_GAME = new StatDisplay("Time In Game", "TimeInGame"); public static final StatDisplay GAMES_PLAYED = new StatDisplay("Games Played", "Wins", "Losses"); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java index b0912addd..cdd420cbf 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java @@ -3,6 +3,15 @@ package mineplex.core.achievement.ui.page; import java.util.ArrayList; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.Achievement; import mineplex.core.achievement.AchievementCategory; @@ -20,14 +29,6 @@ import mineplex.core.shop.page.ShopPageBase; import mineplex.core.stats.PlayerStats; import mineplex.core.stats.StatsManager; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - public class AchievementPage extends ShopPageBase { private static int ACHIEVEMENT_MIDDLE_INDEX = 31; @@ -68,6 +69,7 @@ public class AchievementPage extends ShopPageBase= achievement.getMaxLevel(); if (!hasUnlocked) @@ -80,7 +82,16 @@ public class AchievementPage extends ShopPageBase lore = new ArrayList(); lore.add(" "); From 7b70695e12298e729c4c8dfd34c074cb28c16732 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:40:57 -0400 Subject: [PATCH 056/170] Update arcade games with new crown/gem toggle and flint and steel permission flag --- .../nautilus/game/arcade/ArcadeManager.java | 16 +++++-- .../src/nautilus/game/arcade/game/Game.java | 5 ++ .../game/arcade/managers/GameFlagManager.java | 6 +++ .../arcade/managers/GameRewardManager.java | 48 +++++++++++++------ 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 20c226a03..d1aeddf52 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -4,8 +4,6 @@ import java.io.File; import java.util.ArrayList; import java.util.HashSet; -import net.minecraft.server.v1_8_R3.EntityLiving; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -123,7 +121,6 @@ import mineplex.minecraft.game.core.condition.ConditionManager; import mineplex.minecraft.game.core.damage.DamageManager; import mineplex.minecraft.game.core.fire.Fire; import mineplex.serverdata.Region; - import nautilus.game.arcade.addons.SoupAddon; import nautilus.game.arcade.booster.GameBoosterManager; import nautilus.game.arcade.command.CancelNextGameCommand; @@ -168,6 +165,7 @@ import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager; import nautilus.game.arcade.player.ArcadePlayer; import nautilus.game.arcade.shop.ArcadeShop; +import net.minecraft.server.v1_8_R3.EntityLiving; public class ArcadeManager extends MiniPlugin implements IRelation { @@ -495,7 +493,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation scoreboard.get(ArcadeScoreboardLine.PLAYERS_NAME).write(C.cYellow + C.Bold + "Players"); scoreboard.get(ArcadeScoreboardLine.KIT_NAME).write(C.cGray + C.Bold + "Kit"); - scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); scoreboard.get(ArcadeScoreboardLine.SERVER_NAME).write(C.cAqua + C.Bold + "Server"); scoreboard.get(ArcadeScoreboardLine.SERVER_VALUE).write(_plugin.getConfig().getString("serverstatus.name")); } @@ -520,7 +517,16 @@ public class ArcadeManager extends MiniPlugin implements IRelation } scoreboard.get(ArcadeScoreboardLine.PLAYERS_VALUE).write(_gameManager.getValidPlayersForGameStart().size() + "/" + GetPlayerFull()); - scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + if (GetGame() != null && GetGame().CrownsEnabled) + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGold + C.Bold + "Crowns"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.getCrowns(scoreboard.getOwner())); + } + else + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + } if (GetGame() != null) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 89fe831d5..90d008a25 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -252,6 +252,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public boolean WorldSoilTrample = false; public boolean WorldBoneMeal = false; public boolean WorldChunkUnload = false; + + public boolean AllowFlintAndSteel = false; public int HungerSet = -1; public int HealthSet = -1; @@ -316,6 +318,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public final ChatStatData BlankLine = new ChatStatData().blankLine(); // Gems + public boolean CrownsEnabled = false; + public double GemMultiplier = 1; public boolean GemHunterEnabled = true; public boolean GemBoosterEnabled = true; @@ -334,6 +338,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed public Location SpectatorSpawn = null; public boolean FirstKill = true; + public int FirstKillReward = 10; public String Winner = "Nobody"; public GameTeam WinnerTeam = null; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java index b7a2119d0..68791ddff 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java @@ -54,6 +54,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -1172,6 +1173,11 @@ public class GameFlagManager implements Listener if (game.WorldFireSpread) return; + if (event.getCause() == IgniteCause.FLINT_AND_STEEL && game.AllowFlintAndSteel) + { + return; + } + event.setCancelled(true); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java index f1834bdaf..2e5e4fbdf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java @@ -80,7 +80,7 @@ public class GameRewardManager implements Listener //First Kill if (game.FirstKill) { - game.AddGems(killer, 10, "First Blood", false, false); + game.AddGems(killer, game.FirstKillReward, "First Blood", false, false); Manager.getPluginManager().callEvent(new FirstBloodEvent(killer)); @@ -191,7 +191,7 @@ public class GameRewardManager implements Listener } // Gem Finder - if (game.GemHunterEnabled) + if (game.GemHunterEnabled && !game.CrownsEnabled) { int gemFinder = Manager.GetAchievement().get(player, Achievement.GLOBAL_GEM_HUNTER).getLevel(); if (gemFinder > 0) @@ -216,7 +216,7 @@ public class GameRewardManager implements Listener } } - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && !game.CrownsEnabled) gemsToReward += baseGemsEarned; Rank rank = Manager.GetClients().Get(player).GetRank(); @@ -232,17 +232,35 @@ public class GameRewardManager implements Listener shardsToReward += baseShardsEarned * 2; else if (rank.has(Rank.ETERNAL)) shardsToReward += baseShardsEarned * 2.5; - - Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, "Earned " + game.GetName(), gemsToReward); + + if (!game.CrownsEnabled) + { + Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, "Earned " + game.GetName(), gemsToReward); + } + else + { + Manager.GetDonation().rewardCrowns(gemsToReward, player); + } if (accountId != -1) { Manager.GetDonation().rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, player, "Earned", shardsToReward); } - Manager.getTrackManager().getTrack(GemCollectorTrack.class).earnedGems(player, gemsToReward); + if (!game.CrownsEnabled) + { + Manager.getTrackManager().getTrack(GemCollectorTrack.class).earnedGems(player, gemsToReward); + } //Stats - Manager.GetStatsManager().incrementStat(player, "Global.GemsEarned", gemsToReward); - Manager.GetStatsManager().incrementStat(player, game.GetName() + ".GemsEarned", gemsToReward); + if (!game.CrownsEnabled) + { + Manager.GetStatsManager().incrementStat(player, "Global.GemsEarned", gemsToReward); + Manager.GetStatsManager().incrementStat(player, game.GetName() + ".GemsEarned", gemsToReward); + } + else + { + Manager.GetStatsManager().incrementStat(player, "Global.CrownsEarned", gemsToReward); + Manager.GetStatsManager().incrementStat(player, game.GetName() + ".CrownsEarned", gemsToReward); + } } private void changeName(Player player, String newName) @@ -274,7 +292,7 @@ public class GameRewardManager implements Listener UtilPlayer.message(player, ""); UtilPlayer.message(player, ArcadeFormat.Line); - UtilPlayer.message(player, Manager.IsRewardGems() ? "§f§lGems Earned" : "§f§lGame Stats"); + UtilPlayer.message(player, Manager.IsRewardGems() ? (game.CrownsEnabled ? "§f§lCrowns Earned" : "§f§lGems Earned") : "§f§lGame Stats"); UtilPlayer.message(player, ""); int earnedGems = 0; @@ -294,7 +312,7 @@ public class GameRewardManager implements Listener String out = ""; if (Manager.IsRewardGems()) - out += F.elem(C.cGreen + "+" + (int) (gemCount * game.GemMultiplier) + " Gems") + " for "; + out += F.elem((game.CrownsEnabled ? C.cGold : C.cGreen) + "+" + (int) (gemCount * game.GemMultiplier) + (game.CrownsEnabled ? " Crowns" : " Gems")) + " for "; out += F.elem(amountStr + type); UtilPlayer.message(player, out); @@ -313,7 +331,7 @@ public class GameRewardManager implements Listener int totalGems = earnedGems; //Gem Finder - if (game.GemHunterEnabled) + if (game.GemHunterEnabled && !game.CrownsEnabled) { int gemFinder = Manager.GetAchievement().get(player, Achievement.GLOBAL_GEM_HUNTER).getLevel(); if (gemFinder > 0) @@ -341,7 +359,7 @@ public class GameRewardManager implements Listener if (extraGems > 0) { - UtilPlayer.message(player, F.elem(C.cGreen + "+" + extraGems + " Gems") + " for " + + UtilPlayer.message(player, F.elem((game.CrownsEnabled ? C.cGold : C.cGreen) + "+" + extraGems + (game.CrownsEnabled ? " Crowns" : " Gems")) + " for " + F.elem("Online for " + UtilTime.MakeStr(timeOnline) + C.cGreen + " +" + (int) (hoursOnline * 20) + "%")); totalGems += extraGems; @@ -350,7 +368,7 @@ public class GameRewardManager implements Listener } //Double Gem - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && !game.CrownsEnabled) { UtilPlayer.message(player, F.elem(C.cGreen + "+" + (earnedGems) + " Gems") + " for " + F.elem(C.cDGreen + "Double Gem Weekend")); @@ -393,13 +411,13 @@ public class GameRewardManager implements Listener if (give) { UtilPlayer.message(player, F.elem(C.cWhite + "§lYou now have " + - C.cGreen + C.Bold + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.GEM) + totalGems) + " Gems") + C.cWhite + C.Bold + " and " + + (game.CrownsEnabled ? (C.cGoldB + (Manager.GetDonation().getCrowns(player) + totalGems) + " Crowns") : (C.cGreenB + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.GEM) + totalGems) + " Gems"))) + C.cWhite + C.Bold + " and " + F.elem(C.cAqua + C.Bold + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.TREASURE_SHARD) + shards) + " Treasure Shards")); } else { UtilPlayer.message(player, F.elem(C.cWhite + "§lGame is still in progress...")); - UtilPlayer.message(player, F.elem(C.cWhite + "§lYou may earn more " + C.cGreen + C.Bold + "Gems" + C.cWhite + C.Bold + " when its completed.")); + UtilPlayer.message(player, F.elem(C.cWhite + "§lYou may earn more " + (game.CrownsEnabled ? (C.cGoldB + "Crowns") : (C.cGreenB + "Gems")) + C.cWhite + C.Bold + " when it's completed.")); } UtilPlayer.message(player, ArcadeFormat.Line); From ac98213d2833551cc9631183a88037e9ec96c9d9 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 18:59:41 -0400 Subject: [PATCH 057/170] Update several perks to support vanilla damage system and kit progression --- .../game/arcade/kit/perks/PerkBomberHG.java | 63 +++++++++++++----- .../arcade/kit/perks/PerkFallModifier.java | 35 ++++++++-- .../game/arcade/kit/perks/PerkFletcher.java | 12 ++++ .../game/arcade/kit/perks/PerkIronSkin.java | 66 +++++++++++++++++-- 4 files changed, 152 insertions(+), 24 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java index 947e7a3aa..7edda2765 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java @@ -1,6 +1,16 @@ package nautilus.game.arcade.kit.perks; import java.util.HashSet; +import java.util.Set; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; import mineplex.core.common.util.F; @@ -13,20 +23,18 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.kit.Perk; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerDropItemEvent; - public class PerkBomberHG extends Perk { private int _spawnRate; private int _max; - + private boolean _onlyRestrictNamed; + public PerkBomberHG(int spawnRate, int max) + { + this(spawnRate, max, false); + } + + public PerkBomberHG(int spawnRate, int max, boolean onlyRestrictNamed) { super("Explosives", new String[] { @@ -35,6 +43,7 @@ public class PerkBomberHG extends Perk _spawnRate = spawnRate; _max = max; + _onlyRestrictNamed = onlyRestrictNamed; } public void Apply(Player player) @@ -53,13 +62,19 @@ public class PerkBomberHG extends Perk if (!Kit.HasKit(cur)) continue; + if (!hasPerk(cur)) + continue; + if (!Manager.GetGame().IsAlive(cur)) continue; if (!Recharge.Instance.use(cur, GetName(), _spawnRate*1000, false, false)) continue; - if (UtilInv.contains(cur, Material.TNT, (byte)0, _max)) + if (_onlyRestrictNamed ? UtilInv.contains(cur, F.item("Throwing TNT"), Material.TNT, (byte)0, _max) : UtilInv.contains(cur, Material.TNT, (byte)0, _max)) + continue; + + if (UtilPlayer.isSpectator(cur)) continue; //Add @@ -75,7 +90,13 @@ public class PerkBomberHG extends Perk if (event.isCancelled()) return; - if (!UtilInv.IsItem(event.getItemDrop().getItemStack(), Material.TNT, (byte)0)) + if (_onlyRestrictNamed ? !UtilInv.IsItem(event.getItemDrop().getItemStack(), F.item("Throwing TNT"), Material.TNT, (byte)0) : !UtilInv.IsItem(event.getItemDrop().getItemStack(), Material.TNT, (byte)0)) + return; + + if (!Kit.HasKit(event.getPlayer())) + return; + + if (!hasPerk(event.getPlayer())) return; //Cancel @@ -91,23 +112,33 @@ public class PerkBomberHG extends Perk //boolean containerOpen = !(event.getView().getTopInventory().getHolder() instanceof Player); boolean clickInContainer = event.getClickedInventory() != null && !(event.getClickedInventory().getHolder() instanceof Player); - if(clickInContainer) + if (clickInContainer) { return; } + + if (!(event.getWhoClicked() instanceof Player)) + return; + + if (!Kit.HasKit((Player)event.getWhoClicked())) + return; + + if (!hasPerk((Player)event.getWhoClicked())) + return; + UtilInv.DisallowMovementOf(event, "Throwing TNT", Material.TNT, (byte) 0, true); } @EventHandler public void TNTDeathRemove(PlayerDeathEvent event) { - HashSet remove = new HashSet(); + Set remove = new HashSet<>(); - for (org.bukkit.inventory.ItemStack item : event.getDrops()) - if (UtilInv.IsItem(item, Material.TNT, (byte)0)) + for (ItemStack item : event.getDrops()) + if (_onlyRestrictNamed ? UtilInv.IsItem(item, "Throwing TNT", Material.TNT, (byte)0) : UtilInv.IsItem(item, Material.TNT, (byte)0)) remove.add(item); - for (org.bukkit.inventory.ItemStack item : remove) + for (ItemStack item : remove) event.getDrops().remove(item); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java index bb8decc97..3068c6bc4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java @@ -1,13 +1,16 @@ package nautilus.game.arcade.kit.perks; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.kit.Perk; - import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import mineplex.core.Managers; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import mineplex.minecraft.game.core.damage.DamageManager; +import nautilus.game.arcade.kit.Perk; + public class PerkFallModifier extends Perk { private double _fall; @@ -41,4 +44,28 @@ public class PerkFallModifier extends Perk event.AddMod("Fall Modifier", "Reduce damage", _fall, false); } -} + + @EventHandler(priority = EventPriority.HIGH) + public void handle(EntityDamageEvent event) + { + if (Managers.get(DamageManager.class).IsEnabled()) + { + return; + } + if (event.getCause() != DamageCause.FALL) + return; + + if (!(event.getEntity() instanceof Player)) + return; + + Player player = (Player) event.getEntity(); + + if (!Kit.HasKit(player)) + return; + + if (!Manager.IsAlive(player)) + return; + + event.setDamage(event.getDamage() * _fall); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java index 3867996c0..1b2e54207 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java @@ -183,6 +183,9 @@ public class PerkFletcher extends Perk if (!isFletchedArrow(event.getItemDrop().getItemStack())) return; + + if (!hasPerk(event.getPlayer())) + return; //Cancel event.setCancelled(true); @@ -207,6 +210,15 @@ public class PerkFletcher extends Perk @EventHandler public void FletchInvClick(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) + { + return; + } + + if (!hasPerk((Player)event.getWhoClicked())) + { + return; + } UtilInv.DisallowMovementOf(event, _name, Material.ARROW, (byte)0, true); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java index ec662a740..9db6fb6d1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java @@ -3,23 +3,33 @@ package nautilus.game.arcade.kit.perks; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import mineplex.core.Managers; import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import mineplex.minecraft.game.core.damage.DamageManager; import nautilus.game.arcade.kit.Perk; public class PerkIronSkin extends Perk { private double _reduction; + private boolean _percentage; - public PerkIronSkin(double d) + public PerkIronSkin(double d) + { + this(d, false); + } + + public PerkIronSkin(double d, boolean percentage) { super("Iron Skin", new String[] { - "You take " + d + " less damage from attacks", + "You take " + (d * (percentage ? 100 : 1)) + (percentage ? "%" : "") + " less damage from attacks", }); _reduction = d; + _percentage = percentage; } @EventHandler(priority = EventPriority.HIGH) @@ -40,6 +50,54 @@ public class PerkIronSkin extends Perk if (!Kit.HasKit(damagee)) return; - event.AddMod(damagee.getName(), GetName(), -_reduction, false); + if (!hasPerk(damagee)) + return; + + if (_percentage) + { + event.AddMult(damagee.getName(), GetName(), _reduction, false); + } + else + { + event.AddMod(damagee.getName(), GetName(), -_reduction, false); + } } -} + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void damageDecrease(EntityDamageEvent event) + { + if (Managers.get(DamageManager.class).IsEnabled()) + { + return; + } + + if (event.getCause() == DamageCause.FIRE_TICK) + return; + + if (event.getDamage() <= 1) + return; + + if (!(event.getEntity() instanceof Player)) + return; + + Player damagee = (Player) event.getEntity(); + + if (!Kit.HasKit(damagee)) + return; + + if (!hasPerk(damagee)) + return; + + if (!Manager.IsAlive(damagee)) + return; + + if (_percentage) + { + event.setDamage(event.getDamage() * _reduction); + } + else + { + event.setDamage(event.getDamage() - _reduction); + } + } +} \ No newline at end of file From 97a4b8e94dc05857fbe23d5096b5cf6f254195e4 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 19:00:05 -0400 Subject: [PATCH 058/170] Add implementation for crown and xp toggles in ProgressingKit --- .../game/arcade/kit/ProgressingKit.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java index 75cf10209..ff7c6fdeb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java @@ -18,7 +18,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.scheduler.BukkitRunnable; @@ -319,7 +318,23 @@ public abstract class ProgressingKit extends Kit implements ProgressiveKit { PlayerKit playerKit = _dataManager.get(player); Donor donor = Manager.GetDonation().Get(Bukkit.getPlayer(player)); - return Calculations.canUpgrade(Calculations.getNextUpgradeLevel(playerKit.getLevel(getInternalName())), donor.getBalance(GlobalCurrency.GEM)) && playerKit.getLevel(getInternalName()) >= Calculations.getLevelRequiredFor(upgradeLevel); + int balance = donor.getBalance(GlobalCurrency.GEM); + + if (crownsEnabled()) + { + if (getUpgradeLevel(player) != (upgradeLevel - 1)) + { + return false; + } + balance = Manager.GetDonation().getCrowns(player); + } + + if (!usesXp()) + { + return Calculations.canUpgradeXpLess(upgradeLevel, balance); + } + + return Calculations.canUpgrade(Calculations.getNextUpgradeLevel(playerKit.getLevel(getInternalName())), balance) && playerKit.getLevel(getInternalName()) >= Calculations.getLevelRequiredFor(upgradeLevel); } @Override @@ -427,7 +442,7 @@ public abstract class ProgressingKit extends Kit implements ProgressiveKit public static String receiveItem(String item, int amount) { - return "Receive " + (amount == 1 ? (UtilText.startsWithVowel(item) ? "an" :" a") : C.cGreen + amount) + " " + item; + return "Receive " + (amount == 1 ? (UtilText.startsWithVowel(item) ? "an" :"a") : C.cGreen + amount) + " " + item; } public static String click(boolean left, String comp) From 455e09a9da31f843152bec8b6daa905115e28f07 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 19:00:47 -0400 Subject: [PATCH 059/170] More implementation of xp toggles for kit progression, and display achievement rewards properly for tiered leveling --- .../managers/GameAchievementManager.java | 105 ++++++++++++++---- .../managers/ProgressingKitManager.java | 4 + 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java index a14d161d7..5465f386f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java @@ -1,11 +1,18 @@ package nautilus.game.arcade.managers; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + import mineplex.core.achievement.Achievement; import mineplex.core.achievement.AchievementData; import mineplex.core.achievement.AchievementLog; import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.util.C; -import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilPlayer; @@ -16,14 +23,6 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.Game.GameState; -import org.bukkit.ChatColor; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - public class GameAchievementManager implements Listener { ArcadeManager Manager; @@ -84,13 +83,21 @@ public class GameAchievementManager implements Listener //Display for (final Achievement type : log.keySet()) { - - AchievementData data = Manager.GetAchievement().get(player, type); String nameLevel = F.elem(C.cGold + C.Bold + type.getName()); - if (type.getMaxLevel() > 1) - nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + data.getLevel() + C.cGold + "/" + C.cYellow + type.getMaxLevel()); + if (type.getMaxLevel() > 1) + { + if (type.hasLevelNames()) + { + String tier = data.getLevel() == 0 ? type.getDefaultLevelName() : type.getLevelNames()[Math.min(data.getLevel(), type.getLevelNames().length) - 1]; + nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + "Tier: " + tier); + } + else + { + nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + data.getLevel() + C.cGold + "/" + C.cYellow + type.getMaxLevel()); + } + } String progress = F.elem(C.cGreen + "+" + log.get(type).Amount); @@ -102,17 +109,51 @@ public class GameAchievementManager implements Listener //Finishing for the first time if (!Manager.GetTaskManager().hasCompletedTask(player, type.getName())) { + int gems = type.getGemReward(); + int crowns = 0; + int xp = 0; + if (type.getLevelUpRewards().length > 0) + { + int[] rewards = type.getLevelUpRewards()[type.getLevelUpRewards().length - 1]; + gems += rewards[0]; + crowns += rewards[1]; + xp += rewards[2]; + } UtilPlayer.message(player, ""); - UtilPlayer.message(player, nameLevel + " " + F.elem(C.cAqua + C.Bold + "Completed!") + - " " + F.elem(C.cGreen + C.Bold + "+" + type.getGemReward() + " Gems")); + String inform = nameLevel + " " + F.elem(C.cAqua + C.Bold + "Completed!"); + if (gems > 0) + { + inform += " " + F.elem(C.cGreen + C.Bold + "+" + gems + " Gems"); + } + if (crowns > 0) + { + inform += " " + F.elem(C.cGold + C.Bold + "+" + crowns + " Crowns"); + } + if (xp > 0 && !Manager.GetTaskManager().hasCompletedTask(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getName())) + { + inform += " " + F.elem(C.cYellow + C.Bold + "+" + xp + " XP"); + } + UtilPlayer.message(player, inform); player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); - Manager.GetTaskManager().completedTask(new Callback() + final int finalGems = gems; + final int finalCrowns = crowns; + final int finalXp = xp; + + Manager.GetTaskManager().completedTask(completed -> { - public void run(Boolean completed) + if (finalGems > 0) { - Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, type.getName(), type.getGemReward()); + Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, type.getName(), finalGems); + } + if (finalCrowns > 0) + { + Manager.GetDonation().rewardCrowns(finalCrowns, player); + } + if (finalXp > 0) + { + Manager.GetStatsManager().incrementStat(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getStats()[0], finalXp); } }, player, type.getName()); } @@ -125,9 +166,31 @@ public class GameAchievementManager implements Listener //Multi-Level Achievements else if (log.get(type).LevelUp) { + int gems = 0; + int crowns = 0; + int xp = 0; + if (type.getLevelUpRewards().length > 0) + { + int[] rewards = type.getLevelUpRewards()[Math.min(data.getLevel(), type.getLevelUpRewards().length) - 1]; + gems += rewards[0]; + crowns += rewards[1]; + xp += rewards[2]; + } UtilPlayer.message(player, ""); - UtilPlayer.message(player, nameLevel + " " + progress + - " " + F.elem(C.cAqua + C.Bold + "LEVEL UP!")); + String inform = nameLevel + " " + progress + " " + F.elem(C.cAqua + C.Bold + "LEVEL UP!"); + if (gems > 0) + { + inform += " " + F.elem(C.cGreen + C.Bold + "+" + gems + " Gems"); + } + if (crowns > 0) + { + inform += " " + F.elem(C.cGold + C.Bold + "+" + crowns + " Crowns"); + } + if (xp > 0 && !Manager.GetTaskManager().hasCompletedTask(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getName())) + { + inform += " " + F.elem(C.cYellow + C.Bold + "+" + xp + " XP"); + } + UtilPlayer.message(player, inform); player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); } @@ -179,4 +242,4 @@ public class GameAchievementManager implements Listener UtilPlayer.message(player, ""); UtilPlayer.message(player, ArcadeFormat.Line); } -} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java index 6491ee32c..fd043926f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java @@ -263,6 +263,10 @@ public class ProgressingKitManager implements Listener { return; } + if (!data.getKit().usesXp()) + { + return; + } player.sendMessage(SPACE); From 00d31ffad3781fa214293e4e9efae59b960a3733 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 20:46:38 -0400 Subject: [PATCH 060/170] Fix item builder to properly use null item titles --- .../src/mineplex/core/itemstack/ItemBuilder.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java index b0a1f825d..603f5e150 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java @@ -400,9 +400,14 @@ public class ItemBuilder public ItemBuilder setTitle(String title) { - _title = (title == null ? null - : (title.length() > 2 && ChatColor.getLastColors(title.substring(0, 2)).length() == 0 ? ChatColor.WHITE : "")) - + title; + if (title == null) + { + _title = null; + } + else + { + _title = ((title.length() > 2 && ChatColor.getLastColors(title.substring(0, 2)).length() == 0) ? ChatColor.WHITE : "") + title; + } return this; } From a635793edefe5dc3508804c68c30c54a10bf9d60 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 4 May 2017 22:00:47 -0400 Subject: [PATCH 061/170] Add new Castle Siege modes --- .../src/nautilus/game/arcade/GameType.java | 5 +- .../games/castlesiege/CastleSiegeTDM.java | 1152 +++++++++++++ .../games/castlesiege/ShockCastleSiege.java | 1448 +++++++++++++++++ .../games/castlesiege/data/CapturePoint.java | 71 + .../castlesiege/data/KillStreakData.java | 47 + .../castlesiege/data/ObjectiveTNTSpawner.java | 81 + .../games/castlesiege/data/TeamBeacon.java | 48 + .../game/games/castlesiege/data/TeamKing.java | 122 ++ .../castlesiege/data/medals/MedalData.java | 55 + .../castlesiege/data/medals/MedalType.java | 21 + .../castlesiege/shockkits/KitAlchemist.java | 32 + .../castlesiege/shockkits/KitArcher.java | 133 ++ .../castlesiege/shockkits/KitBuilder.java | 32 + .../shockkits/KitDemolitionist.java | 148 ++ .../castlesiege/shockkits/KitEnchanter.java | 35 + .../castlesiege/shockkits/KitFighter.java | 126 ++ .../castlesiege/shockkits/KitHardline.java | 30 + .../games/castlesiege/shockkits/KitNinja.java | 33 + .../castlesiege/shockkits/KitPlayer.java | 65 + .../games/castlesiege/shockkits/KitTank.java | 133 ++ .../castlesiege/shockkits/KitWorkman.java | 33 + .../castlesiege/shockkits/PerkBloodlust.java | 135 ++ 22 files changed, 3984 insertions(+), 1 deletion(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 66bef53c0..b15bfdfb5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -6,7 +6,6 @@ import mineplex.core.common.MinecraftVersion; import mineplex.core.common.Pair; import mineplex.core.game.GameCategory; import mineplex.core.game.GameDisplay; - import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.games.baconbrawl.BaconBrawl; import nautilus.game.arcade.game.games.barbarians.Barbarians; @@ -26,6 +25,8 @@ import nautilus.game.arcade.game.games.build.modes.TeamBuild; import nautilus.game.arcade.game.games.buildmavericks.BuildMavericks; import nautilus.game.arcade.game.games.cards.Cards; import nautilus.game.arcade.game.games.castlesiege.CastleSiege; +import nautilus.game.arcade.game.games.castlesiege.CastleSiegeTDM; +import nautilus.game.arcade.game.games.castlesiege.ShockCastleSiege; import nautilus.game.arcade.game.games.champions.ChampionsCTF; import nautilus.game.arcade.game.games.champions.ChampionsDominate; import nautilus.game.arcade.game.games.champions.ChampionsTDM; @@ -131,6 +132,8 @@ public enum GameType BossBattles(BossBattles.class, GameDisplay.BossBattles), Bridge(Bridge.class, GameDisplay.Bridge), CastleSiege(CastleSiege.class, GameDisplay.CastleSiege), + CastleSiegeNew(ShockCastleSiege.class, GameDisplay.CastleSiegeNew), + CastleSiegeTDM(CastleSiegeTDM.class, GameDisplay.CastleSiegeTDM), ChampionsCTF(ChampionsCTF.class, GameDisplay.ChampionsCTF), ChampionsDominate(ChampionsDominate.class, GameDisplay.ChampionsDominate), ChampionsTDM(ChampionsTDM.class, GameDisplay.ChampionsTDM), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java new file mode 100644 index 000000000..56e117868 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java @@ -0,0 +1,1152 @@ +package nautilus.game.arcade.game.games.castlesiege; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.MetadataValue; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.loot.ChestLoot; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData.MedalLevel; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalType; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitFighter; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitPlayer; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitTank; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; + +public class CastleSiegeTDM extends TeamGame +{ + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + + private Map _streakData = new WeakHashMap<>(); + private Map _medalData = new WeakHashMap<>(); + private Map _teamKills = new HashMap<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _diamondGearCommon = new ChestLoot(true); + private ChestLoot _diamondGearRare = new ChestLoot(true); + private ChestLoot _weaponGearCommon = new ChestLoot(true); + private ChestLoot _weaponGearRare = new ChestLoot(true); + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + //private ChestLoot _blockGear = new ChestLoot(); + private ChestLoot _enchantGearCommon = new ChestLoot(true); + private ChestLoot _enchantGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private boolean _writeScoreboard = true; + + @SuppressWarnings("deprecation") + public CastleSiegeTDM(ArcadeManager manager) + { + super(manager, GameType.CastleSiegeNew, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] {"AlexTheCoder is awesome!"}); + + this.StrictAntiHack = true; + this.HungerSet = 20; + this.DeathOut = false; + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.FirstKillReward = 20; + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + generateLoot(); + } + + private Player[] getMedalOwners(MedalType type) + { + Player gold = null; + Double goldScore = 0D; + Player silver = null; + Double silverScore = 0D; + Player bronze = null; + Double bronzeScore = 0D; + + //GOLD + for (Entry scores : _medalData.entrySet()) + { + if (scores.getValue().getScore(type) > goldScore) + { + gold = scores.getKey(); + goldScore = scores.getValue().getScore(type); + } + } + + //SILVER + for (Entry scores : _medalData.entrySet()) + { + if (gold != null && gold.getName().equals(scores.getKey().getName())) + { + continue; + } + if (scores.getValue().getScore(type) > silverScore) + { + silver = scores.getKey(); + silverScore = scores.getValue().getScore(type); + } + } + + //BRONZE + for (Entry scores : _medalData.entrySet()) + { + if (gold != null && gold.getName().equals(scores.getKey().getName())) + { + continue; + } + if (silver != null && silver.getName().equals(scores.getKey().getName())) + { + continue; + } + if (scores.getValue().getScore(type) > bronzeScore) + { + bronze = scores.getKey(); + bronzeScore = scores.getValue().getScore(type); + } + } + + return new Player[] {gold, silver, bronze}; + } + + private void generateLoot() + { + { + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + } + { + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + } + { + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); + } + { + _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); + } + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + /*{ + _blockGear.addLoot(new ItemStack(Material.STONE, 64), 2); + _blockGear.addLoot(new ItemStack(Material.WOOD, 64), 2); + }*/ + { + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); + _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); + } + { + _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemBuilder(Material.TNT, 4).setTitle(F.item("Throwing TNT")).build(), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); + } + } + + private void fillChest(Block block) + { + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) + { + return; + } + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) + { + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); + + ChestLoot loot = _miscGear; + if (chance <= 0.6) + { + loot = _rodsAndGaps; + } + if (chance <= 0.5) + { + loot = _potionGearCommon; + if (subChance <= 0.45) + { + loot = _potionGearRare; + } + } + if (chance <= 0.3) + { + loot = _rangedGear; + }/* + if (chance <= 0.4) + { + loot = _weaponGearCommon; + if (subChance <= 0.4) + { + loot = _weaponGearRare; + } + } + if (chance <= 0.3) + { + loot = _diamondGearCommon; + if (subChance <= 0.3) + { + loot = _diamondGearRare; + } + }*/ + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; + } + Scoreboard.reset(); + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) + { + refillTime = TIME_TILL_REFILL; + } + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Scoreboard.write(red.GetFormattedName() + " Team Kills"); + Scoreboard.write(_teamKills.get(red) + ""); + Scoreboard.writeNewLine(); + Scoreboard.write(blue.GetFormattedName() + " Team Kills"); + Scoreboard.write(_teamKills.get(blue) + ""); + Scoreboard.draw(); + } + + public void writeFinalScoreboard(String winner, int kills) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(winner + C.cBlue + " has won"); + Scoreboard.write(C.cBlue + "with " + C.cGreen + kills + C.cBlue + " kills!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + _teamKills.put(red, 0); + GameTeam blue = GetTeam(ChatColor.AQUA); + _teamKills.put(blue, 0); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) + { + if (team.GetPlayers(true).size() > 0) + { + teamsAlive.add(team); + } + } + + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) + { + GameTeam winner = teamsAlive.get(0); + AnnounceEnd(winner); + writeFinalScoreboard(winner.GetColor() + winner.GetName(), _teamKills.get(winner)); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + if (GetKit(player) != null) + { + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + { + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + } + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + if (_teamKills.get(blue).intValue() >= 100) + { + AnnounceEnd(blue); + writeFinalScoreboard(blue.GetColor() + blue.GetName(), _teamKills.get(blue)); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + if (_teamKills.get(red).intValue() >= 100) + { + AnnounceEnd(red); + writeFinalScoreboard(red.GetColor() + red.GetName(), _teamKills.get(red)); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.ELIM, 1D); + _teamKills.merge(GetTeam(player), 1, Integer::sum); + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + player.sendMessage(C.cRedB + "You have received a Kill Streak Reward!"); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cAqua + C.Bold + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + + if (current != null && current.hasItemMeta()) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + } + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + _streakData.getOrDefault(player, new KillStreakData()).reset(); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java new file mode 100644 index 000000000..52c725d24 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java @@ -0,0 +1,1448 @@ +package nautilus.game.arcade.game.games.castlesiege; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.util.Vector; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.loot.ChestLoot; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; +import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; +import nautilus.game.arcade.game.games.castlesiege.data.TeamBeacon; +import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData.MedalLevel; +import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalType; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitFighter; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitPlayer; +import nautilus.game.arcade.game.games.castlesiege.shockkits.KitTank; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; + +public class ShockCastleSiege extends TeamGame +{ + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + private ItemBuilder _wearableTnt; + + private Map _streakData = new WeakHashMap<>(); + private Map _medalData = new WeakHashMap<>(); + private Map> _beacons = new HashMap<>(); + private Map _kings = new HashMap<>(); + private List _tntCarry = new ArrayList<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _diamondGearCommon = new ChestLoot(true); + private ChestLoot _diamondGearRare = new ChestLoot(true); + private ChestLoot _weaponGearCommon = new ChestLoot(true); + private ChestLoot _weaponGearRare = new ChestLoot(true); + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + //private ChestLoot _blockGear = new ChestLoot(); + private ChestLoot _enchantGearCommon = new ChestLoot(true); + private ChestLoot _enchantGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private ObjectiveTNTSpawner _tntSpawner; + + private boolean _writeScoreboard = true; + + @SuppressWarnings("deprecation") + public ShockCastleSiege(ArcadeManager manager) + { + super(manager, GameType.CastleSiegeNew, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] {"AlexTheCoder is awesome!"}); + + this.StrictAntiHack = true; + this.HungerSet = 20; + this.DeathOut = false; + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.FirstKillReward = 20; + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); + generateLoot(); + } + + private Player[] getMedalOwners(MedalType type) + { + Player gold = null; + Double goldScore = 0D; + Player silver = null; + Double silverScore = 0D; + Player bronze = null; + Double bronzeScore = 0D; + + //GOLD + for (Entry scores : _medalData.entrySet()) + { + if (scores.getValue().getScore(type) > goldScore) + { + gold = scores.getKey(); + goldScore = scores.getValue().getScore(type); + } + } + + //SILVER + for (Entry scores : _medalData.entrySet()) + { + if (gold != null && gold.getName().equals(scores.getKey().getName())) + { + continue; + } + if (scores.getValue().getScore(type) > silverScore) + { + silver = scores.getKey(); + silverScore = scores.getValue().getScore(type); + } + } + + //BRONZE + for (Entry scores : _medalData.entrySet()) + { + if (gold != null && gold.getName().equals(scores.getKey().getName())) + { + continue; + } + if (silver != null && silver.getName().equals(scores.getKey().getName())) + { + continue; + } + if (scores.getValue().getScore(type) > bronzeScore) + { + bronze = scores.getKey(); + bronzeScore = scores.getValue().getScore(type); + } + } + + return new Player[] {gold, silver, bronze}; + } + + private void generateLoot() + { + { + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + } + { + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + } + { + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); + } + { + _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); + } + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + /*{ + _blockGear.addLoot(new ItemStack(Material.STONE, 64), 2); + _blockGear.addLoot(new ItemStack(Material.WOOD, 64), 2); + }*/ + { + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); + _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); + } + { + _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemBuilder(Material.TNT, 4).setTitle(F.item("Throwing TNT")).build(), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); + } + } + + private void fillChest(Block block) + { + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) + { + return; + } + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) + { + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); + + ChestLoot loot = _miscGear; + if (chance <= 0.6) + { + loot = _rodsAndGaps; + } + if (chance <= 0.5) + { + loot = _potionGearCommon; + if (subChance <= 0.45) + { + loot = _potionGearRare; + } + } + if (chance <= 0.3) + { + loot = _rangedGear; + }/* + if (chance <= 0.4) + { + loot = _weaponGearCommon; + if (subChance <= 0.4) + { + loot = _weaponGearRare; + } + } + if (chance <= 0.3) + { + loot = _diamondGearCommon; + if (subChance <= 0.3) + { + loot = _diamondGearRare; + } + }*/ + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; + } + Scoreboard.reset(); + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) + { + refillTime = TIME_TILL_REFILL; + } + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "TNT Spawn"); + long tntTime = _tntSpawner.getNextTNT(); + if (!IsLive()) + { + tntTime = 60000; + } + if (_tntSpawner.isSpawned()) + { + Scoreboard.write("Spawned"); + } + else + { + Scoreboard.write(UtilTime.MakeStr(tntTime)); + } + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + if (_beacons.get(red).stream().filter(TeamBeacon::isActive).count() > 0) + { + Scoreboard.write(_kings.get(red).getName(true)); + Scoreboard.write("Protected"); + } + else + { + Scoreboard.write(_kings.get(red).getName(true) + " Health"); + Scoreboard.write(_kings.get(red).getHealth() + ""); + } + Scoreboard.writeNewLine(); + if (_beacons.get(blue).stream().filter(TeamBeacon::isActive).count() > 0) + { + Scoreboard.write(_kings.get(blue).getName(true)); + Scoreboard.write("Protected"); + } + else + { + Scoreboard.write(_kings.get(blue).getName(true) + " Health"); + Scoreboard.write(_kings.get(blue).getHealth() + ""); + } + Scoreboard.draw(); + } + + public void writeFinalScoreboard(String deadKing, String winKing, String warrior) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(deadKing + "'s " + C.cBlue + "castle has been conquered"); + Scoreboard.write(C.cBlue + "by " + winKing + "'s " + C.cBlue + "army with the help of"); + Scoreboard.write(warrior + C.cBlue + "!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Location redKing = WorldData.GetDataLocs("RED").get(0); + Location blueKing = WorldData.GetDataLocs("BLUE").get(0); + Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); + Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); + redKing.setPitch(UtilAlg.GetPitch(redBlue)); + redKing.setYaw(UtilAlg.GetYaw(redBlue)); + blueKing.setPitch(UtilAlg.GetPitch(blueRed)); + blueKing.setYaw(UtilAlg.GetYaw(blueRed)); + _beacons.put(red, Arrays.asList(new TeamBeacon(red, WorldData.GetDataLocs("PINK").get(0)), new TeamBeacon(red, WorldData.GetDataLocs("PINK").get(1)))); + _beacons.put(blue, Arrays.asList(new TeamBeacon(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamBeacon(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); + this.CreatureAllowOverride = true; + _kings.put(red, new TeamKing(red, "King Jon", redKing)); + _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); + this.CreatureAllowOverride = false; + _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) + { + if (team.GetPlayers(true).size() > 0) + { + teamsAlive.add(team); + } + } + + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) + { + GameTeam winner = teamsAlive.get(0); + TeamKing king = _kings.get(winner); + TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); + AnnounceEnd(winner); + writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + if (GetKit(player) != null) + { + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + { + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + } + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + TeamKing redKing = _kings.get(red); + TeamKing blueKing = _kings.get(blue); + redKing.update(_beacons.get(red).stream().filter(TeamBeacon::isActive).count() > 0); + if (redKing.isDead()) + { + AnnounceEnd(blue); + writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(redKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + blueKing.update(_beacons.get(blue).stream().filter(TeamBeacon::isActive).count() > 0); + if (blueKing.isDead()) + { + AnnounceEnd(red); + writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); + boolean announcedMedalStart = false; + for (MedalType type : MedalType.values()) + { + Player[] rewarding = getMedalOwners(type); + if (rewarding[0] != null) + { + if (!announcedMedalStart) + { + announcedMedalStart = true; + Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); + } + AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); + AddStat(rewarding[0], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); + } + if (rewarding[1] != null) + { + AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); + AddStat(rewarding[1], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); + } + if (rewarding[2] != null) + { + AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); + AddStat(rewarding[2], "Medalist", 1, false, false); + Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); + } + } + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(blueKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + + _tntSpawner.update(); + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + _tntSpawner.onStart(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.ELIM, 1D); + + for (TeamKing king : _kings.values()) + { + if (UtilMath.offsetSquared(player.getLocation(), king.getLocation()) <= 25) + { + _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.OBJECTIVE_KILL, 1D); + break; + } + } + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + player.sendMessage(C.cRedB + "You have received a Kill Streak Reward!"); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cAqua + C.Bold + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + + if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + List beacons = new ArrayList<>(); + + for (List b : _beacons.values()) + { + beacons.addAll(b); + } + for (TeamBeacon beacon : beacons) + { + if (beacon.isActive() && !beacon.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), beacon.getLocation()) <= radius) + { + beacon.destroy(); + AddGems(player, 40, "Beacon Destruction", false, true); + long remaining = beacons.stream().filter(b -> b.getOwner().GetColor() == beacon.getOwner().GetColor()).filter(TeamBeacon::isActive).count(); + if (remaining > 0) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(beacon.getOwner().GetFormattedName() + "'s Beacons") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(beacon.getOwner().GetFormattedName() + "'s Beacons") + " has been destroyed and " + F.elem(_kings.get(beacon.getOwner()).getName(false)) + " is now vulnerable!")); + } + } + } + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + if (_tntCarry.contains(shooter)) + { + return; + } + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (event.getEntity() instanceof Zombie) + { + event.setCancelled(true); + if (event instanceof EntityDamageByEntityEvent) + { + GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; + if (e.getDamager() instanceof Player) + { + Player p = (Player) e.getDamager(); + if (UtilPlayer.isSpectator(p)) + { + return; + } + if (owner.HasPlayer(p)) + { + return; + } + if (_beacons.get(owner).stream().filter(TeamBeacon::isActive).count() > 0) + { + UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective beacons!")); + return; + } + TeamKing king = _kings.get(owner); + if (king.handleDamage(p.getName(), e.getDamage())) + { + _medalData.computeIfAbsent(p, key -> new MedalData()).addScore(MedalType.KING_DMG, e.getDamage()); + for (Player alert : owner.GetPlayers(true)) + { + if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) + { + alert.sendMessage(king.getName(true) + " is under attack!"); + } + } + } + } + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + if (current == null || !current.hasItemMeta()) + { + return; + } + if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) + { + event.setCancelled(true); + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned()) + { + if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) + { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPickup(PlayerPickupItemEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) + { + event.setCancelled(true); + if (!_tntCarry.contains(event.getPlayer())) + { + _tntSpawner.pickup(); + _tntCarry.add(event.getPlayer()); + event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); + event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); + event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void TNTUse(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!_tntCarry.contains(player)) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + event.setCancelled(true); + + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler + public void TNTExpire(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTER) + return; + + Iterator tntIterator = _tntCarry.iterator(); + + while (tntIterator.hasNext()) + { + Player player = tntIterator.next(); + + if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + continue; + } + + UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + _streakData.getOrDefault(player, new KillStreakData()).reset(); + + if (!_tntCarry.contains(player)) + { + return; + } + + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java new file mode 100644 index 000000000..3952467e6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java @@ -0,0 +1,71 @@ +package nautilus.game.arcade.game.games.castlesiege.data; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import nautilus.game.arcade.game.GameTeam; + +public class CapturePoint +{ + private static final int POINTS_TO_CAPTURE = 100; + private static final long TIME_PER_POINT = 1000; + private static final int POINTS_PER_TICK = 1; + + private Location _loc; + + private long _lastCap; + private int _points = 0; + private GameTeam _owner = null; + + public CapturePoint(GameTeam owner, Location loc) + { + _owner = owner; + + _loc = loc; + } + + public int getMaxPoints() + { + return POINTS_TO_CAPTURE; + } + + public int getPoints() + { + return _points; + } + + public boolean isCaptured() + { + return _points >= POINTS_TO_CAPTURE; + } + + public void update() + { + if (!UtilTime.elapsed(_lastCap, TIME_PER_POINT)) + { + return; + } + + int capping = 0; + for (Player player : UtilPlayer.getInRadius(_loc, 3.5).keySet()) + { + if (UtilPlayer.isSpectator(player)) + { + continue; + } + if (_owner.HasPlayer(player)) + { + continue; + } + capping++; + } + + if (capping > 0 && _points < POINTS_TO_CAPTURE) + { + _lastCap = System.currentTimeMillis(); + _points += POINTS_PER_TICK; + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java new file mode 100644 index 000000000..2735f5026 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java @@ -0,0 +1,47 @@ +package nautilus.game.arcade.game.games.castlesiege.data; + +public class KillStreakData +{ + private static final int[] REWARDED_STREAKS = {2, 4, 6, 8}; + private int _kills; + private int _bestStreak; + + public KillStreakData() + { + _kills = 0; + _bestStreak = 0; + } + + public int getKills() + { + return _kills; + } + + public int getBestStreak() + { + return Math.max(_bestStreak, _kills); + } + + public boolean addKill(boolean hardLine) + { + _kills++; + for (int streak : REWARDED_STREAKS) + { + if ((_kills + (hardLine ? 1 : 0)) == streak) + { + return true; + } + } + + return false; + } + + public void reset() + { + if (_kills > _bestStreak) + { + _bestStreak = _kills; + } + _kills = 0; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java new file mode 100644 index 000000000..648749147 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java @@ -0,0 +1,81 @@ +package nautilus.game.arcade.game.games.castlesiege.data; + +import java.util.List; + +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTime; + +public class ObjectiveTNTSpawner +{ + private List _locs; + private Location _lastSpawnLoc; + private Item _entity; + private long _lastPickedUp; + + public ObjectiveTNTSpawner(List locs) + { + _locs = locs; + _lastSpawnLoc = null; + _entity = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public Item getItem() + { + return _entity; + } + + public boolean isSpawned() + { + return _entity != null; + } + + public long getNextTNT() + { + return (_lastPickedUp + 60000) - System.currentTimeMillis(); + } + + public void spawn() + { + Location spawn = _locs.get(UtilMath.r(_locs.size())); + spawn.getBlock().getRelative(BlockFace.DOWN).setType(Material.REDSTONE_BLOCK); + _lastSpawnLoc = spawn.clone(); + _entity = spawn.getWorld().dropItem(spawn, new ItemStack(Material.TNT)); + UtilFirework.playFirework(spawn, Type.BURST, Color.RED, false, false); + } + + public void pickup() + { + _entity.getLocation().getBlock().getRelative(BlockFace.DOWN).setType(Material.IRON_BLOCK); + _entity.remove(); + _entity = null; + _lastSpawnLoc = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public void update() + { + if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, 60000)) + { + spawn(); + } + else if (isSpawned()) + { + _entity.teleport(_lastSpawnLoc); + } + } + + public void onStart() + { + _lastPickedUp = System.currentTimeMillis(); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java new file mode 100644 index 000000000..74469579d --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java @@ -0,0 +1,48 @@ +package nautilus.game.arcade.game.games.castlesiege.data; + +import org.bukkit.Location; +import org.bukkit.Material; + +import nautilus.game.arcade.game.GameTeam; + +public class TeamBeacon +{ + private Location _loc; + private GameTeam _owner; + private boolean _destroyed; + + public TeamBeacon(GameTeam owner, Location loc) + { + _owner = owner; + _loc = loc; + + spawn(); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public boolean isActive() + { + return !_destroyed; + } + + public void spawn() + { + _destroyed = false; + _loc.getBlock().setType(Material.BEACON); + } + + public void destroy() + { + _destroyed = true; + _loc.getBlock().setType(Material.AIR); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java new file mode 100644 index 000000000..a925064dd --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java @@ -0,0 +1,122 @@ +package nautilus.game.arcade.game.games.castlesiege.data; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Zombie; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.game.GameTeam; + +public class TeamKing +{ + private static final int MAX_HEALTH = 600; + private Location _loc; + private String _name; + private GameTeam _owner; + private Zombie _entity; + private int _health; + private String _lastDamager; + private long _lastDamage; + + public TeamKing(GameTeam owner, String name, Location loc) + { + _owner = owner; + _loc = loc; + _name = name; + _health = MAX_HEALTH; + _entity = (Zombie) loc.getWorld().spawnEntity(loc, EntityType.ZOMBIE); + UtilEnt.vegetate(_entity, true); + _entity.getEquipment().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setUnbreakable(true).build()); + _entity.getEquipment().setChestplate(new ItemBuilder(Material.DIAMOND_CHESTPLATE).setUnbreakable(true).build()); + _entity.getEquipment().setLeggings(new ItemBuilder(Material.DIAMOND_LEGGINGS).setUnbreakable(true).build()); + _entity.getEquipment().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setUnbreakable(true).build()); + _entity.setRemoveWhenFarAway(false); + _entity.setCustomName(owner.GetColor() + name); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public String getName(boolean bold) + { + return _owner.GetColor() + (bold ? C.Bold : "") + _name; + } + + public String getLastDamager() + { + return _lastDamager; + } + + public int getHealth() + { + return Math.max(_health, 0); + } + + public boolean isDead() + { + return getHealth() <= 0; + } + + public void update(boolean beaconsAlive) + { + _entity.teleport(_loc); + for (int y = 0; y <= 4; y++) + { + for (int x = -4; x <= 4; x++) + { + for (int z = -4; z <= 4; z++) + { + Block block = _loc.clone().add(x, y, z).getBlock(); + if ((block.getType() != Material.IRON_FENCE && block.getType() != Material.IRON_BLOCK) || !beaconsAlive) + { + block.setType(Material.AIR); + } + if (beaconsAlive) + { + if (x == -4 || x == 4 || z == -4 || z == 4) + { + if (y != 4) + { + block.setType(Material.IRON_FENCE); + } + } + if (y == 4) + { + block.setType(Material.IRON_BLOCK); + } + } + } + } + } + } + + public boolean handleDamage(String player, double damage) + { + if (!UtilTime.elapsed(_lastDamage, 400)) + { + return false; + } + _lastDamager = player; + _lastDamage = System.currentTimeMillis(); + + int dmg = (int)Math.ceil(damage); + + _health -= dmg; + + UtilEnt.PlayDamageSound(_entity); + + return true; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java new file mode 100644 index 000000000..2943d761a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java @@ -0,0 +1,55 @@ +package nautilus.game.arcade.game.games.castlesiege.data.medals; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.ChatColor; + +import mineplex.core.common.util.C; + +public class MedalData +{ + private Map _medalScore; + + public MedalData() + { + _medalScore = new HashMap<>(); + } + + public Double getScore(MedalType type) + { + return _medalScore.computeIfAbsent(type, key -> 0D); + } + + public void addScore(MedalType kingDmg, Double score) + { + _medalScore.merge(kingDmg, score, Double::sum); + } + + public static enum MedalLevel + { + GOLD(C.cGold + "Gold", ChatColor.GOLD), + SILVER(C.cGray + "Silver", ChatColor.GRAY), + BRONZE(C.cWhite + "Bronze", ChatColor.WHITE) + ; + + private String _name; + private ChatColor _color; + + private MedalLevel(String name, ChatColor color) + { + _name = name; + _color = color; + } + + public String getName() + { + return _name; + } + + public ChatColor getColor() + { + return _color; + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java new file mode 100644 index 000000000..e12f1bb36 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java @@ -0,0 +1,21 @@ +package nautilus.game.arcade.game.games.castlesiege.data.medals; + +public enum MedalType +{ + ELIM("Eliminations"), + KING_DMG("Damage on King"), + OBJECTIVE_KILL("Objective Kills") + ; + + private String _name; + + private MedalType(String name) + { + _name = name; + } + + public String getName() + { + return _name; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java new file mode 100644 index 000000000..31d0dec71 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitAlchemist extends KitPlayer +{ + public KitAlchemist(ArcadeManager manager) + { + super(manager, "Alchemist", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.POTION); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.POTION).setData((short)8194).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.POTION).setData((short)8193).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java new file mode 100644 index 000000000..e8b0d5f4e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java @@ -0,0 +1,133 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkFletcher; + +public class KitArcher extends KitPlayer +{ + public KitArcher(ArcadeManager manager) + { + super(manager, "Archer", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "10 Fletched Arrows", + C.cGreenB + "Starting Ability:", + C.cGreen + "Fletcher: Obtain 1 Fletched Arrow every 7 seconds (Max of 10)" + }, + new Perk[][] + { + new Perk[] {new PerkFletcher(7, 10, true, false)}, + new Perk[] {new PerkFletcher(7, 16, true, false)}, + new Perk[] {new PerkFletcher(7, 24, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)} + }, + new String[][] + { + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 16" + }, + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 24", + C.cGray + "Obtain a Power I Enchantment on your Bow" + }, + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 32", + }, + { + C.cGray + "Obtain a Power II Enchantment on your Bow" + }, + { + C.cGray + "Receive a Feather Falling IV Enchantment on your Diamond Boots" + } + }, + Material.BOW); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(10).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 1) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(16).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 2) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(24).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 3) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 4) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 5) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + if (level < 5) + { + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else + { + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_FALL, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(8).setTitle(F.item("Fletched Arrow")).build()); + } + else if (streak == 4) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); + } + else if (streak == 6) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_KNOCKBACK, 1).build()); + } + else if (streak == 8) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java new file mode 100644 index 000000000..d69929bf1 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitBuilder extends KitPlayer +{ + public KitBuilder(ArcadeManager manager) + { + super(manager, "Builder", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.STONE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.STONE).setAmount(64).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.WOOD).setAmount(64).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java new file mode 100644 index 000000000..91717d869 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java @@ -0,0 +1,148 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkBomberHG; + +public class KitDemolitionist extends KitPlayer +{ + public KitDemolitionist(ArcadeManager manager) + { + super(manager, "Demolitionist", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword, Flint and Steel", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "Blast Protection IV on all Armor", + C.cGray + "2 Throwing TNT", + C.cGreenB + "Passive Ability:", + C.cGreen + "3 Block Range Increase on TNT Damage", + C.cGreenB + "Starting Ability:", + C.cGreen + "Bombmaker: Obtain 1 Throwing TNT every 10 seconds (Max of 2)" + }, + new Perk[][] + { + new Perk[] {new PerkBomberHG(10, 2, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 6, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 6, true)} + }, + new String[][] + { + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 4" + }, + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 6" + }, + { + C.cGray + "Reduce maximum and starting amount of Throwing TNT to 4", + C.cGray + "Increase range of Throwing TNT by 1.5 times" + }, + { + C.cGray + "Increase range of Throwing TNT by 2.5 times" + }, + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 6", + C.cGray + "Increase range of Throwing TNT by 3 times" + } + }, + Material.TNT); + } + + public double getThrowMultiplier(Player player) + { + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 3) + { + return 1.5; + } + else if (level == 4) + { + return 2.5; + } + else if (level == 5) + { + return 3; + } + + return 1; + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(2).build()); + } + else if (level == 1) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 2) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(6).build()); + } + else if (level == 3) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 4) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 5) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(6).build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(2).build()); + } + else if (streak == 4) + { + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(3).build()); + } + else if (streak == 6) + { + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (streak == 8) + { + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(5).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java new file mode 100644 index 000000000..f25217ad6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java @@ -0,0 +1,35 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitEnchanter extends KitPlayer +{ + public KitEnchanter(ArcadeManager manager) + { + super(manager, "Enchanter", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.ENCHANTED_BOOK); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + player.getInventory().setItem(2, new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + player.getInventory().setItem(3, new ItemBuilder(Material.EXP_BOTTLE).setAmount(32).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java new file mode 100644 index 000000000..5579e0f7c --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java @@ -0,0 +1,126 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitFighter extends KitPlayer +{ + public KitFighter(ArcadeManager manager) + { + super(manager, "Fighter", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "1 Golden Applegate", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGreenB + "Passive Ability:", + C.cGreen + "Bloodlust: Deal half a heart more damage for 3 seconds after killing an enemy" + }, + new Perk[][] + { + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)} + }, + new String[][] + { + { + C.cGray + "Increase starting amount of Golden Applegates to 2" + }, + { + C.cGray + "Obtain a Fishing Rod" + }, + { + C.cGray + "Obtain a Sharpness I Enchantment on your Diamond Sword" + }, + { + C.cGray + "Obtain a Knockback II Enchantment on your Fishing Rod", + C.cGray + "Increase starting amount of Golden Applegates to 3" + }, + { + C.cGray + "Obtain a Sharpness II Enchantment on your Diamond Sword" + } + }, + Material.DIAMOND_SWORD); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + else if (level == 1) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + else if (level == 2) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + else if (level == 3) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + else if (level == 4) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + else if (level == 5) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (streak == 4) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + } + else if (streak == 6) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + } + else if (streak == 8) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java new file mode 100644 index 000000000..e80e62e65 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java @@ -0,0 +1,30 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitHardline extends KitPlayer +{ + public KitHardline(ArcadeManager manager) + { + super(manager, "Hardline", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.GOLDEN_APPLE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java new file mode 100644 index 000000000..20b712abb --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java @@ -0,0 +1,33 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkFallModifier; + +public class KitNinja extends KitPlayer +{ + public KitNinja(ArcadeManager manager) + { + super(manager, "Ninja", KitAvailability.Free, new String[] {}, new Perk[] {new PerkFallModifier(0.5)}, Material.ENDER_PEARL); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.WATER_BUCKET).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ENDER_PEARL).setAmount(2).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java new file mode 100644 index 000000000..b270e8310 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java @@ -0,0 +1,65 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.castlesiege.ShockCastleSiege; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.ProgressingKit; + +public abstract class KitPlayer extends ProgressingKit +{ + private boolean _progressionEnabled = false; + + public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[] perks, Material holding) + { + super(manager, name, "csii" + name.toLowerCase(), availability, description, perks, EntityType.ZOMBIE, new ItemStack(holding)); + } + + public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[][] perks, String[][] upgradeDetails, Material holding) + { + super(manager, name, "csii" + name.toLowerCase(), availability, description, perks, upgradeDetails, EntityType.ZOMBIE, new ItemStack(holding)); + + _progressionEnabled = true; + } + + public abstract void awardKillStreak(Player player, int streak); + + protected ShockCastleSiege getGame() + { + return (ShockCastleSiege) Manager.GetGame(); + } + + protected void giveRegeneration(Player player) + { + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 3, 3)); + } + + @Override + public void SpawnCustom(LivingEntity ent) {} + + @Override + public boolean showUpgrades() + { + return _progressionEnabled; + } + + @Override + public boolean crownsEnabled() + { + return true; + } + + @Override + public boolean usesXp() + { + return false; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java new file mode 100644 index 000000000..67e71d8d3 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java @@ -0,0 +1,133 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkIronSkin; + +public class KitTank extends KitPlayer +{ + public KitTank(ArcadeManager manager) + { + super(manager, "Tank", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "Protection I on Iron Armor", + C.cGreenB + "Passive Ability:", + C.cGreen + "Iron Skin: Take half a heart less damage from all Attacks" + }, + new Perk[][] + { + new Perk[] {new PerkIronSkin(1, false)}, + new Perk[] {new PerkIronSkin(1, false)}, + new Perk[] {new PerkIronSkin(1, false)}, + new Perk[] {new PerkIronSkin(1, false)}, + new Perk[] {new PerkIronSkin(1, false)}, + new Perk[] {new PerkIronSkin(1, false)} + }, + new String[][] + { + { + C.cGray + "Obtain a Protection II Enchantment on your Iron Armor" + }, + { + C.cGray + "Obtain a Protection I Enchantment on your Diamond Helmet" + }, + { + C.cGray + "Obtain a Protection I Enchantment on your Diamond Boots" + }, + { + C.cGray + "Obtain a Protection II Enchantment on your Diamond Helmet", + C.cGray + "Obtain a Protection II Enchantment on your Diamond Boots" + }, + { + C.cGray + "Obtain a Protection III Enchantment on your Iron Chestplate", + C.cGray + "Obtain a Protection III Enchantment on your Iron Leggings" + } + }, + Material.DIAMOND_CHESTPLATE); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 1) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 2) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 3) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 4) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 5) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 3).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 3).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (streak == 4) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + } + else if (streak == 6) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + } + else if (streak == 8) + { + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.THORNS, 2).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java new file mode 100644 index 000000000..83e9ec555 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java @@ -0,0 +1,33 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitWorkman extends KitPlayer +{ + public KitWorkman(ArcadeManager manager) + { + super(manager, "Workman", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.DIAMOND_PICKAXE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.DIAMOND_PICKAXE).addEnchantment(Enchantment.DIG_SPEED, 2).setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.DIAMOND_SPADE).addEnchantment(Enchantment.DIG_SPEED, 2).setUnbreakable(true).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java new file mode 100644 index 000000000..7ab56e1b3 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java @@ -0,0 +1,135 @@ +package nautilus.game.arcade.game.games.castlesiege.shockkits; + +import java.util.Map; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.PlayerDeathEvent; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import nautilus.game.arcade.kit.Perk; + +public class PerkBloodlust extends Perk +{ + private Map _lusting = new WeakHashMap<>(); + + private double _damageBoost; + private int _duration; + + public PerkBloodlust(double damageBoost, int duration) + { + super("Bloodlust", + new String[] + { + C.cGray + "Deal an extra " + (damageBoost / 2) + " hearts of damage for " + duration + " seconds after a kill.", + } + ); + + _damageBoost = damageBoost; + _duration = duration; + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Integer id = _lusting.remove(event.getEntity()); + if (id != null) + { + Bukkit.getScheduler().cancelTask(id.intValue()); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + if (!Kit.HasKit(player)) + { + return; + } + + if (!Manager.GetGame().IsAlive(player)) + { + return; + } + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + if (!hasPerk(player)) + { + return; + } + + Integer id = _lusting.remove(player); + if (id != null) + { + Bukkit.getScheduler().cancelTask(id.intValue()); + } + + player.sendMessage(C.cRed + "You are now channeling bloodlust for 3 seconds!"); + _lusting.put(player, Bukkit.getScheduler().runTaskLater(UtilServer.getPlugin(), () -> _lusting.remove(player), _duration * 20).getTaskId()); + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void damageIncrease(EntityDamageByEntityEvent event) + { + if (event.getCause() == DamageCause.FIRE_TICK) + return; + + if (event.getDamage() <= 1) + return; + + if (!(event.getDamager() instanceof Player)) + return; + + Player damager = (Player) event.getDamager(); + + if (!Kit.HasKit(damager)) + { + return; + } + + if (!hasPerk(damager)) + { + return; + } + + if (!Manager.IsAlive(damager)) + { + return; + } + + if (!_lusting.containsKey(damager)) + { + return; + } + + event.setDamage(event.getDamage() + _damageBoost); + } +} \ No newline at end of file From 4d6824c27cba1d9827f86983ac7254c73dad7471 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 5 May 2017 22:05:58 -0400 Subject: [PATCH 062/170] Update Castle Siege mechanics --- .../games/castlesiege/CastleSiegeTDM.java | 15 ++++++++---- .../games/castlesiege/ShockCastleSiege.java | 24 +++++++++++++++---- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java index 56e117868..a87b6195a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java @@ -368,10 +368,10 @@ public class CastleSiegeTDM extends TeamGame GameTeam red = GetTeam(ChatColor.RED); GameTeam blue = GetTeam(ChatColor.AQUA); Scoreboard.write(red.GetFormattedName() + " Team Kills"); - Scoreboard.write(_teamKills.get(red) + ""); + Scoreboard.write(_teamKills.get(red) + "/50"); Scoreboard.writeNewLine(); Scoreboard.write(blue.GetFormattedName() + " Team Kills"); - Scoreboard.write(_teamKills.get(blue) + ""); + Scoreboard.write(_teamKills.get(blue) + "/50"); Scoreboard.draw(); } @@ -525,7 +525,7 @@ public class CastleSiegeTDM extends TeamGame GameTeam red = GetTeam(ChatColor.RED); GameTeam blue = GetTeam(ChatColor.AQUA); - if (_teamKills.get(blue).intValue() >= 100) + if (_teamKills.get(blue).intValue() >= 50) { AnnounceEnd(blue); writeFinalScoreboard(blue.GetColor() + blue.GetName(), _teamKills.get(blue)); @@ -597,7 +597,7 @@ public class CastleSiegeTDM extends TeamGame SetState(GameState.End); return; } - if (_teamKills.get(red).intValue() >= 100) + if (_teamKills.get(red).intValue() >= 50) { AnnounceEnd(red); writeFinalScoreboard(red.GetColor() + red.GetName(), _teamKills.get(red)); @@ -874,6 +874,11 @@ public class CastleSiegeTDM extends TeamGame _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.ELIM, 1D); _teamKills.merge(GetTeam(player), 1, Integer::sum); + if (UtilPlayer.isSpectator(player)) + { + return; + } + player.setLevel(player.getLevel() + 1); player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); @@ -886,7 +891,7 @@ public class CastleSiegeTDM extends TeamGame } if (UtilMath.isEven(data.getKills())) { - Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cAqua + C.Bold + data.getKills() + " player Kill Streak") + "!")); + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java index 52c725d24..b6e357c3b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java @@ -403,11 +403,13 @@ public class ShockCastleSiege extends TeamGame } Scoreboard.writeNewLine(); GameTeam red = GetTeam(ChatColor.RED); + long redBeacons = _beacons.get(red).stream().filter(TeamBeacon::isActive).count(); GameTeam blue = GetTeam(ChatColor.AQUA); - if (_beacons.get(red).stream().filter(TeamBeacon::isActive).count() > 0) + long blueBeacons = _beacons.get(blue).stream().filter(TeamBeacon::isActive).count(); + if (redBeacons > 0) { Scoreboard.write(_kings.get(red).getName(true)); - Scoreboard.write("Protected"); + Scoreboard.write(redBeacons + "/2 Beacons Active"); } else { @@ -415,10 +417,10 @@ public class ShockCastleSiege extends TeamGame Scoreboard.write(_kings.get(red).getHealth() + ""); } Scoreboard.writeNewLine(); - if (_beacons.get(blue).stream().filter(TeamBeacon::isActive).count() > 0) + if (blueBeacons > 0) { Scoreboard.write(_kings.get(blue).getName(true)); - Scoreboard.write("Protected"); + Scoreboard.write(blueBeacons + "/2 Beacons Active"); } else { @@ -966,6 +968,11 @@ public class ShockCastleSiege extends TeamGame } } + if (UtilPlayer.isSpectator(player)) + { + return; + } + player.setLevel(player.getLevel() + 1); player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); @@ -978,7 +985,7 @@ public class ShockCastleSiege extends TeamGame } if (UtilMath.isEven(data.getKills())) { - Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cAqua + C.Bold + data.getKills() + " player Kill Streak") + "!")); + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); } } @@ -1073,6 +1080,13 @@ public class ShockCastleSiege extends TeamGame } } } + for (TeamKing king : _kings.values()) + { + if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) + { + king.handleDamage(player.getName(), 50); + } + } } } From a47c4291c533420f3e143b26cf30f8df3385c255 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 5 May 2017 22:06:18 -0400 Subject: [PATCH 063/170] Update tiered achievement UI --- .../core/achievement/AchievementCategory.java | 2 +- .../achievement/ui/page/AchievementMainPage.java | 12 +++++++++++- .../core/achievement/ui/page/AchievementPage.java | 2 +- .../game/arcade/managers/GameAchievementManager.java | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 3316c653b..d6137618d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -87,7 +87,7 @@ public enum AchievementCategory CASTLE_SIEGE("Castle Siege", new String[] {"Castle Siege New", "Castle Siege TDM"}, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.CROWNS_EARNED }, - Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiegeNew.getGameId()), + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiegeNew.getGameId(), GameDisplay.CastleSiegeTDM.getGameId()), BAWK_BAWK_BATTLES("Bawk Bawk Battles", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java index e2825bfde..0ff566c82 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java @@ -107,6 +107,14 @@ public class AchievementMainPage extends ShopPageBase 1) continue; @@ -121,6 +129,8 @@ public class AchievementMainPage extends ShopPageBase 0) + { lore.add(" "); + } } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java index cdd420cbf..3915059e8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java @@ -89,7 +89,7 @@ public class AchievementPage extends ShopPageBase Date: Sat, 6 May 2017 17:01:31 -0400 Subject: [PATCH 064/170] Add game tips and remove medals from initial release --- .../games/castlesiege/ShockCastleSiege.java | 184 +----------------- .../castlesiege/data/ObjectiveTNTSpawner.java | 5 +- 2 files changed, 11 insertions(+), 178 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java index b6e357c3b..5c6cb8966 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java @@ -6,7 +6,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.WeakHashMap; import org.bukkit.Bukkit; @@ -89,9 +88,6 @@ import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; import nautilus.game.arcade.game.games.castlesiege.data.TeamBeacon; import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData.MedalLevel; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalType; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitFighter; @@ -112,7 +108,6 @@ public class ShockCastleSiege extends TeamGame private ItemBuilder _wearableTnt; private Map _streakData = new WeakHashMap<>(); - private Map _medalData = new WeakHashMap<>(); private Map> _beacons = new HashMap<>(); private Map _kings = new HashMap<>(); private List _tntCarry = new ArrayList<>(); @@ -127,7 +122,6 @@ public class ShockCastleSiege extends TeamGame private ChestLoot _rodsAndGaps = new ChestLoot(true); private ChestLoot _potionGearCommon = new ChestLoot(true); private ChestLoot _potionGearRare = new ChestLoot(true); - //private ChestLoot _blockGear = new ChestLoot(); private ChestLoot _enchantGearCommon = new ChestLoot(true); private ChestLoot _enchantGearRare = new ChestLoot(true); private ChestLoot _miscGear = new ChestLoot(); @@ -153,6 +147,14 @@ public class ShockCastleSiege extends TeamGame }, new String[] {"AlexTheCoder is awesome!"}); + _help = new String[] + { + "Use the TNT spawning platforms to run TNT to the enemy beacons to destroy them!", + "The enemy king is invulnerable until you destroy the two sentry beacons on each sentry tower", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; + this.StrictAntiHack = true; this.HungerSet = 20; this.DeathOut = false; @@ -183,60 +185,6 @@ public class ShockCastleSiege extends TeamGame generateLoot(); } - private Player[] getMedalOwners(MedalType type) - { - Player gold = null; - Double goldScore = 0D; - Player silver = null; - Double silverScore = 0D; - Player bronze = null; - Double bronzeScore = 0D; - - //GOLD - for (Entry scores : _medalData.entrySet()) - { - if (scores.getValue().getScore(type) > goldScore) - { - gold = scores.getKey(); - goldScore = scores.getValue().getScore(type); - } - } - - //SILVER - for (Entry scores : _medalData.entrySet()) - { - if (gold != null && gold.getName().equals(scores.getKey().getName())) - { - continue; - } - if (scores.getValue().getScore(type) > silverScore) - { - silver = scores.getKey(); - silverScore = scores.getValue().getScore(type); - } - } - - //BRONZE - for (Entry scores : _medalData.entrySet()) - { - if (gold != null && gold.getName().equals(scores.getKey().getName())) - { - continue; - } - if (silver != null && silver.getName().equals(scores.getKey().getName())) - { - continue; - } - if (scores.getValue().getScore(type) > bronzeScore) - { - bronze = scores.getKey(); - bronzeScore = scores.getValue().getScore(type); - } - } - - return new Player[] {gold, silver, bronze}; - } - private void generateLoot() { { @@ -286,10 +234,6 @@ public class ShockCastleSiege extends TeamGame _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); } - /*{ - _blockGear.addLoot(new ItemStack(Material.STONE, 64), 2); - _blockGear.addLoot(new ItemStack(Material.WOOD, 64), 2); - }*/ { _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); @@ -301,7 +245,6 @@ public class ShockCastleSiege extends TeamGame } { _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); - _miscGear.addLoot(new ItemBuilder(Material.TNT, 4).setTitle(F.item("Throwing TNT")).build(), 2); _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); _miscGear.addLoot(_flintAndSteel.build(), 2); _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); @@ -340,23 +283,7 @@ public class ShockCastleSiege extends TeamGame if (chance <= 0.3) { loot = _rangedGear; - }/* - if (chance <= 0.4) - { - loot = _weaponGearCommon; - if (subChance <= 0.4) - { - loot = _weaponGearRare; - } } - if (chance <= 0.3) - { - loot = _diamondGearCommon; - if (subChance <= 0.3) - { - loot = _diamondGearRare; - } - }*/ chest.getBlockInventory().setItem(slot, loot.getLoot()); } } @@ -500,34 +427,6 @@ public class ShockCastleSiege extends TeamGame TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); AnnounceEnd(winner); writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -603,34 +502,6 @@ public class ShockCastleSiege extends TeamGame { AnnounceEnd(blue); writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -680,34 +551,6 @@ public class ShockCastleSiege extends TeamGame { AnnounceEnd(red); writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -957,16 +800,6 @@ public class ShockCastleSiege extends TeamGame } AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); - _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.ELIM, 1D); - - for (TeamKing king : _kings.values()) - { - if (UtilMath.offsetSquared(player.getLocation(), king.getLocation()) <= 25) - { - _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.OBJECTIVE_KILL, 1D); - break; - } - } if (UtilPlayer.isSpectator(player)) { @@ -1215,7 +1048,6 @@ public class ShockCastleSiege extends TeamGame TeamKing king = _kings.get(owner); if (king.handleDamage(p.getName(), e.getDamage())) { - _medalData.computeIfAbsent(p, key -> new MedalData()).addScore(MedalType.KING_DMG, e.getDamage()); for (Player alert : owner.GetPlayers(true)) { if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java index 648749147..70f9e2484 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java @@ -16,6 +16,7 @@ import mineplex.core.common.util.UtilTime; public class ObjectiveTNTSpawner { + private static final long TNT_SPAWN_DELAY = 60000; private List _locs; private Location _lastSpawnLoc; private Item _entity; @@ -41,7 +42,7 @@ public class ObjectiveTNTSpawner public long getNextTNT() { - return (_lastPickedUp + 60000) - System.currentTimeMillis(); + return (_lastPickedUp + TNT_SPAWN_DELAY) - System.currentTimeMillis(); } public void spawn() @@ -64,7 +65,7 @@ public class ObjectiveTNTSpawner public void update() { - if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, 60000)) + if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, TNT_SPAWN_DELAY)) { spawn(); } From 941310b5aab4bf66876b5fd6701bd787a3341d51 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 00:07:42 -0400 Subject: [PATCH 065/170] Change kit prices --- .../src/mineplex/core/progression/math/Calculations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java index ae9c9013b..51299c6d0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java @@ -29,8 +29,8 @@ public class Calculations GEMS_FOR_XPLESS_UPGRADE.put(1, 1000); GEMS_FOR_XPLESS_UPGRADE.put(2, 5000); GEMS_FOR_XPLESS_UPGRADE.put(3, 15000); - GEMS_FOR_XPLESS_UPGRADE.put(4, 30000); - GEMS_FOR_XPLESS_UPGRADE.put(5, 60000); + GEMS_FOR_XPLESS_UPGRADE.put(4, 50000); + GEMS_FOR_XPLESS_UPGRADE.put(5, 100000); } /** From 68205a71a13a36faaca3eda1a1c71a7847c92137 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 00:08:36 -0400 Subject: [PATCH 066/170] Implement proper stat leaderboard system --- .../core/leaderboard/Leaderboard.java | 63 +++++++ .../core/leaderboard/LeaderboardManager.java | 152 +++++++++-------- .../leaderboard/LeaderboardRepository.java | 155 ++++++++++++++++++ .../leaderboard/SetTournamentCommand.java | 27 --- .../leaderboard/StatEventsRepository.java | 59 ------- .../mineplex/core/leaderboard/StatType.java | 48 ------ 6 files changed, 304 insertions(+), 200 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java new file mode 100644 index 000000000..047b0cf6d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -0,0 +1,63 @@ +package mineplex.core.leaderboard; + +import java.util.LinkedList; + +import org.bukkit.Location; + +import mineplex.core.Managers; +import mineplex.core.common.util.C; +import mineplex.core.hologram.Hologram; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; + +public class Leaderboard +{ + private String _display; + private String[] _statIds; + private int _size; + private LeaderboardSQLType _type; + private Location _loc; + private Hologram _holo; + + public Leaderboard(String display, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) + { + _display = display; + _statIds = statIds; + _type = type; + _size = size; + _loc = displayLoc; + + update(new LinkedList<>()); + } + + public int getSize() + { + return _size; + } + + public String[] getStatIds() + { + return _statIds; + } + + public LeaderboardSQLType getType() + { + return _type; + } + + public void update(LinkedList names) + { + deconstruct(); + names.addFirst(C.cRed + " "); + names.addFirst(C.cAqua + _display); + _holo = new Hologram(Managers.get(LeaderboardManager.class).getHologramManager(), _loc, names.toArray(new String[names.size()])).start(); + } + + public void deconstruct() + { + if (_holo != null) + { + _holo.stop(); + _holo = null; + } + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 1ca8b9bc6..9d50dd388 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -1,91 +1,111 @@ package mineplex.core.leaderboard; -import mineplex.core.MiniPlugin; -import mineplex.core.account.CoreClient; -import mineplex.core.account.CoreClientManager; -import mineplex.core.spawn.command.SpawnCommand; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -/** - * Manages dynamic Leaderboard statistics. - * - * Used for recording stat events, retrieving customized leaderboards, etc. - * @author MrTwiggy - * - */ +import mineplex.core.Managers; +import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilMath; +import mineplex.core.hologram.HologramManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; + public class LeaderboardManager extends MiniPlugin { + private final Map _leaderboards = new HashMap<>(); + private final long REFRESH_RATE; + private final LeaderboardRepository _repo; + private final HologramManager _holo; - private static LeaderboardManager _instance; // Singleton instance of Leaderboard Manager - private StatEventsRepository _statEvents; // 'statEvents' table repository. - private CoreClientManager _clientManager; - private String _serverGroup; - - /** - * Private class constructor to prevent non-singleton instances. - */ - public LeaderboardManager(JavaPlugin plugin, CoreClientManager clientManager) + public LeaderboardManager(JavaPlugin plugin, HologramManager hologram) { super("Leaderboard Manager", plugin); - _instance = this; - _clientManager = clientManager; - _statEvents = new StatEventsRepository(plugin); - _serverGroup = _plugin.getConfig().getString("serverstatus.group"); - } - - /** - * Attempt to trigger a stat event. - * @param player - the player responsible for the statistic - * @param stat - the display name of the statistic to be added - * @param value - the counter value used to increment the statistic - * @return true, if a stat event was successfully triggered and logged, false otherwise. - */ - public boolean attemptStatEvent(Player player, String stat, int gamemode, int value) - { - StatType type = StatType.getType(stat); + _repo = new LeaderboardRepository(plugin); + _holo = hologram; - return (type == null) ? false : onStatEvent(player, type, gamemode, value); - } - - /** - * Trigger a stat event to be recorded. - * @param player - the player responsible for the statistic - * @param type - the unique type id designating the statistic being recorded - * @param gamemode - the unique gamemode id associated with the stat event - * @param value - the counter value used to increment the statistic - * @return true, if the stat event was successfully triggered and logged, false otherwise. - */ - public boolean onStatEvent(final Player player, final StatType type, final int gamemode, final int value) - { - /* - // Asynchronously make DB call to insert stat event. - Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() + addCommand(new CommandBase(this, Rank.DEVELOPER, "cycleleaderboard") { - public void run() + @Override + public void Execute(Player caller, String[] args) { - _statEvents.insertStatEvent(player.getName(), gamemode, _serverGroup, type.getTypeId(), value); + caller.sendMessage(F.main(getName(), "Cycling leaderboards!")); + refreshBoards(); } }); - */ - return true; + REFRESH_RATE = 5 * 60 * 20 + ((UtilMath.r(5) + 1) * 60 * 20); + + runSyncTimer(() -> refreshBoards(), 0, REFRESH_RATE); } - @Override - public void addCommands() + private void refreshBoards() { - addCommand(new SetTournamentCommand(this)); + int arrayLength = _leaderboards.size(); + Leaderboard[] boards = _leaderboards.values().toArray(new Leaderboard[arrayLength]); + List statIds = new ArrayList<>(); + int[] sizes = new int[arrayLength]; + LeaderboardSQLType[] types = new LeaderboardSQLType[arrayLength]; + for (int i = 0; i < arrayLength; i++) + { + statIds.add(boards[i].getStatIds()); + sizes[i] = boards[i].getSize(); + types[i] = boards[i].getType(); + } + + _repo.loadLeaderboards(statIds, sizes, types, nameArray -> + { + for (int i = 0; i < nameArray.length && i < boards.length; i++) + { + boards[i].update(nameArray[i]); + } + }); } - /** - * @return the singleton instance for {@link LeaderboardManager}. - */ - public static LeaderboardManager getInstance() + public HologramManager getHologramManager() { - return _instance; + return _holo; } -} + + public Leaderboard getLeaderboard(String identifier) + { + return _leaderboards.get(identifier); + } + + public void handleStatIncrease(Player player, String statId, int value) + { + int accountId = Managers.get(CoreClientManager.class).getAccountId(player); + if (accountId != -1) + { + _repo.insertStat(accountId, statId, value); + } + } + + public void registerLeaderboard(String identifier, Leaderboard board) + { + if (_leaderboards.containsKey(identifier)) + { + board.deconstruct(); + return; + } + _leaderboards.put(identifier, board); + _repo.loadLeaderboard(board.getStatIds(), board.getSize(), board.getType(), board::update); + } + + public void unregisterLeaderboard(String boardIdentifier) + { + if (!_leaderboards.containsKey(boardIdentifier)) + { + return; + } + _leaderboards.remove(boardIdentifier).deconstruct(); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java new file mode 100644 index 000000000..a35e71649 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -0,0 +1,155 @@ +package mineplex.core.leaderboard; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.List; +import java.util.function.Consumer; + +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; +import mineplex.serverdata.database.column.ColumnInt; +import mineplex.serverdata.database.column.ColumnVarChar; + +public class LeaderboardRepository extends RepositoryBase +{ + private static final int SEASON = 1; + private static final String CREATE = "CREATE TABLE Account.statLeaderboard (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String INSERT_STAT = "INSERT INTO statLeaderboard (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + + public LeaderboardRepository(JavaPlugin plugin) + { + super(DBPool.getAccount()); + } + + public void insertStat(int accountId, String statId, int value) + { + UtilServer.runAsync(() -> + { + executeInsert(INSERT_STAT, null, new ColumnInt("accountId", accountId), new ColumnVarChar("name", 100, statId), new ColumnInt("value", value)); + }); + } + + public void loadLeaderboard(String[] statIds, int size, LeaderboardSQLType type, Consumer> leaderboard) + { + UtilServer.runAsync(() -> + { + try (Connection c = getConnection()) + { + LinkedList names = new LinkedList<>(); + ResultSet rs = type.getStatement(c, statIds, size).executeQuery(); + int place = 1; + while (rs.next()) + { + names.add(C.cGreen + "#" + place + " " + rs.getString(1) + C.cRed + " " + rs.getInt(2)); + place++; + } + + UtilServer.runSync(() -> leaderboard.accept(names)); + } + catch (SQLException ex) + { + ex.printStackTrace(); + } + }); + } + + @SuppressWarnings("unchecked") + public void loadLeaderboards(List statIdArray, int[] sizes, LeaderboardSQLType[] types, Consumer[]> leaderboard) + { + UtilServer.runAsync(() -> + { + try (Connection c = getConnection()) + { + LinkedList[] nameArray = new LinkedList[statIdArray.size()]; + StringBuilder queryBuilder = new StringBuilder(); + for (int i = 0; i < statIdArray.size() && i < sizes.length && i < types.length; i++) + { + String[] statIds = statIdArray.get(i); + int size = sizes[i]; + LeaderboardSQLType type = types[i]; + queryBuilder.append(type.getMultiStatement(statIds, size)); + nameArray[i] = new LinkedList<>(); + } + + if (queryBuilder.length() > 0) + { + Statement s = c.createStatement(); + s.execute(queryBuilder.toString()); + + for (int i = 0; i < nameArray.length; i++) + { + ResultSet rs = s.getResultSet(); + int place = 1; + while (rs.next()) + { + nameArray[i].add(C.cGreen + "#" + place + " " + rs.getString(1) + C.cRed + " " + rs.getInt(2)); + place++; + } + + if (!s.getMoreResults()) + { + break; + } + } + } + + UtilServer.runSync(() -> leaderboard.accept(nameArray)); + } + catch (SQLException ex) + { + ex.printStackTrace(); + } + }); + } + + public static enum LeaderboardSQLType + { + DAILY(FETCH_STAT_DAILY), + WEEKLY(FETCH_STAT_WEEKLY), + MONTHLY(FETCH_STAT_MONTHLY), + YEARLY(FETCH_STAT_YEARLY), + ALL(FETCH_STAT_ALL) + ; + + private String _sql; + + private LeaderboardSQLType(String sql) + { + _sql = sql; + } + + public PreparedStatement getStatement(Connection connection, String[] statIds, int limit) throws SQLException + { + StringBuilder idBuilder = new StringBuilder(); + for (String id : statIds) + { + idBuilder.append("'" + id + "'").append(", "); + } + PreparedStatement ps = connection.prepareStatement(_sql.replace("%LIMIT%", String.valueOf(limit)).replace("%IDS%", idBuilder.substring(0, idBuilder.length() - 2))); + return ps; + } + + public String getMultiStatement(String[] statIds, int limit) + { + StringBuilder idBuilder = new StringBuilder(); + for (String id : statIds) + { + idBuilder.append("'" + id + "'").append(", "); + } + return _sql.replace("%LIMIT%", String.valueOf(limit)).replace("%IDS%", idBuilder.substring(0, idBuilder.length() - 2)); + } + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java deleted file mode 100644 index 7e25605bf..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package mineplex.core.leaderboard; - -import mineplex.core.command.CommandBase; -import mineplex.core.common.Rank; - -import org.bukkit.entity.Player; - -public class SetTournamentCommand extends CommandBase -{ - public SetTournamentCommand(LeaderboardManager plugin) - { - super(plugin, Rank.ADMIN, "settournament", "set-tournament"); - } - - @Override - public void Execute(Player caller, String[] args) - { - // TODO: Implement set tournament command. - /*if (args.length == 3) - { - String statType = args[0]; - int gamemode = Integer.parseInt(args[1]); - int value = Integer.parseInt(args[2]); - LeaderboardManager.getInstance().attemptStatEvent(caller, statType, gamemode, value); - }*/ - } -} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java deleted file mode 100644 index 3acf6a2f8..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java +++ /dev/null @@ -1,59 +0,0 @@ -package mineplex.core.leaderboard; - -import mineplex.core.database.MinecraftRepository; -import mineplex.serverdata.database.DBPool; -import mineplex.serverdata.database.RepositoryBase; -import mineplex.serverdata.database.column.ColumnInt; -import mineplex.serverdata.database.column.ColumnVarChar; - -import org.bukkit.plugin.java.JavaPlugin; - - -/** - * StatEventsRepository offers the ability to insert and log newly generated stat events. - * - * Intended for the purpose of statistical tracking of players. - * @author MrTwiggy - * - */ -public class StatEventsRepository extends RepositoryBase -{ - - // Insert or update stat events query - /*private static String INSERT_EVENT = - "INSERT INTO statEvents(accountId, gamemode, serverGroup, type, value, date) " - + "VALUES (?, ?, ?, ?, ?, CURRENT_DATE()) " - + "ON DUPLICATE KEY UPDATE value=value+";*/ - - private static String INSERT_EVENT = - "INSERT INTO statEvents(accountId, gamemode, serverGroup, type, value, date) " - + "SELECT accounts.id, ?, ?, ?, ?, CURRENT_DATE() " - + "FROM accounts WHERE name = ? " - + "ON DUPLICATE KEY UPDATE value=value+"; - - /** - * Class constructor - * @param plugin - the plugin responsible for instantiating this repository. - */ - public StatEventsRepository(JavaPlugin plugin) - { - super(DBPool.getAccount()); - } - - - /** - * Insert (or update) a new stat event record for today into the repository. - * @param accountId - the id of the account responsible for the stat event. - * @param gamemode - the id of the gamemode type at the time of the stat event. - * @param serverGroup - the server group id associated with the stat event. - * @param type - the type of stat event to be inserted (id of type). - * @param value - the integer based value denoting the actual statistic being logged. - */ - public void insertStatEvent(String playerName, int gamemode, String serverGroup, int type, int value) - { - // Hacky string concatanation - Don't judge me!! - // TODO: How to handle outside value block parameters - executeUpdate(INSERT_EVENT + value + ";", new ColumnInt("gamemode", gamemode), new ColumnVarChar("serverGroup", 100, serverGroup), - new ColumnInt("type", type), new ColumnInt("value", value), new ColumnVarChar("name", 100, playerName)); - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java deleted file mode 100644 index 10663bae0..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java +++ /dev/null @@ -1,48 +0,0 @@ -package mineplex.core.leaderboard; - -/** - * An enumeration delegating the various types of statistics to be dynamically tracked. - * @author MrTwiggy - * - */ -public enum StatType -{ - WIN(1), - LOSS(2), - KILL(3), - DEATH(4); - - private int _typeId; // Unique id for stat type - public int getTypeId() { return _typeId; } - - /** - * Private class constructor - * @param typeId - the unique identifying id for this {@link StatType} - */ - private StatType(int typeId) - { - _typeId = typeId; - } - - /** - * @param stat - the display name for the stat type - * @return the {@link StatType} corresponding to the passed in {@code stat}, if one exists, - * null otherwise. - */ - public static StatType getType(String stat) - { - switch(stat.toUpperCase().trim()) - { - case "WINS": - return WIN; - case "LOSSES": - return LOSS; - case "KILLS": - return KILL; - case "DEATHS": - return DEATH; - default: - return null; - } - } -} From d7341de2f55411e5c0965c9566f915bd2af60df8 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 00:09:04 -0400 Subject: [PATCH 067/170] Final tweaks to Castle Siege and implementation of leaderboards in arcade --- .../src/nautilus/game/arcade/Arcade.java | 11 +- .../src/nautilus/game/arcade/game/Game.java | 2 + .../games/castlesiege/ShockCastleSiege.java | 219 +++++++++++++++--- .../castlesiege/data/ObjectiveTNTSpawner.java | 17 +- .../{TeamBeacon.java => TeamCrystal.java} | 14 +- .../castlesiege/shockkits/KitArcher.java | 4 + .../shockkits/KitDemolitionist.java | 4 + .../castlesiege/shockkits/KitFighter.java | 8 +- .../games/castlesiege/shockkits/KitTank.java | 17 +- .../game/arcade/managers/GameStatManager.java | 30 +-- .../lobby/current/NewGameLobbyManager.java | 78 ++++--- 11 files changed, 309 insertions(+), 95 deletions(-) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/{TeamBeacon.java => TeamCrystal.java} (57%) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 731d73616..9c0b9e40f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -1,10 +1,10 @@ package nautilus.game.arcade; +import static mineplex.core.Managers.require; + import java.io.File; import java.util.HashMap; -import net.minecraft.server.v1_8_R3.MinecraftServer; - import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -83,12 +83,10 @@ import mineplex.core.visibility.VisibilityManager; import mineplex.core.website.WebsiteLinkManager; import mineplex.minecraft.game.core.combat.CombatManager; import mineplex.minecraft.game.core.damage.DamageManager; - import nautilus.game.arcade.anticheatmetadata.GameInfoMetadata; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.GameServerConfig; - -import static mineplex.core.Managers.require; +import net.minecraft.server.v1_8_R3.MinecraftServer; public class Arcade extends JavaPlugin { @@ -167,7 +165,6 @@ public class Arcade extends JavaPlugin incognito.setPreferencesManager(preferenceManager); Creature creature = new Creature(this); - LeaderboardManager leaderboardManager = new LeaderboardManager(this, _clientManager); Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion(), GenericServer.HUB); @@ -199,6 +196,8 @@ public class Arcade extends JavaPlugin ProjectileManager projectileManager = new ProjectileManager(this); HologramManager hologramManager = new HologramManager(this, packetHandler); + new LeaderboardManager(this, hologramManager); + //Inventory InventoryManager inventoryManager = new InventoryManager(this, _clientManager); CastleManager castleManager = new CastleManager(this, _clientManager, hologramManager, false); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 90d008a25..75ad46dbb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -346,6 +346,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed //ELO public boolean EloRanking = false; public int EloStart = 1000; + + public boolean Leaderboards = false; public boolean CanAddStats = true; public boolean CanGiveLoot = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java index 5c6cb8966..91f074691 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java @@ -18,6 +18,8 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Entity; import org.bukkit.entity.ItemFrame; @@ -30,7 +32,9 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockDispenseEvent; import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; @@ -55,6 +59,7 @@ import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.util.Vector; +import mineplex.core.Managers; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; @@ -67,9 +72,13 @@ import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.EnchantedBookBuilder; import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -86,7 +95,7 @@ import nautilus.game.arcade.game.GemData; import nautilus.game.arcade.game.TeamGame; import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; -import nautilus.game.arcade.game.games.castlesiege.data.TeamBeacon; +import nautilus.game.arcade.game.games.castlesiege.data.TeamCrystal; import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; @@ -95,6 +104,7 @@ import nautilus.game.arcade.game.games.castlesiege.shockkits.KitPlayer; import nautilus.game.arcade.game.games.castlesiege.shockkits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; public class ShockCastleSiege extends TeamGame { @@ -108,7 +118,7 @@ public class ShockCastleSiege extends TeamGame private ItemBuilder _wearableTnt; private Map _streakData = new WeakHashMap<>(); - private Map> _beacons = new HashMap<>(); + private Map> _crystals = new HashMap<>(); private Map _kings = new HashMap<>(); private List _tntCarry = new ArrayList<>(); @@ -145,12 +155,20 @@ public class ShockCastleSiege extends TeamGame //new KitNinja(manager), new KitTank(manager) }, - new String[] {"AlexTheCoder is awesome!"}); + new String[] + { + "Destroy enemy sentry crystals with running TNT", + "After the enemy crystals are destroyed you must slay their king", + "First team to kill the enemy king wins", + "Chests refill every 2 minutes", + "TNT Respawns every 1 minute" + } + ); _help = new String[] { - "Use the TNT spawning platforms to run TNT to the enemy beacons to destroy them!", - "The enemy king is invulnerable until you destroy the two sentry beacons on each sentry tower", + "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", + "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" }; @@ -172,7 +190,9 @@ public class ShockCastleSiege extends TeamGame this.AllowFlintAndSteel = true; this.BlockPlaceAllow.add(Material.FIRE.getId()); this.CrownsEnabled = true; + this.Leaderboards = true; this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; new CompassModule() .setGiveCompass(true) @@ -183,6 +203,34 @@ public class ShockCastleSiege extends TeamGame _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); generateLoot(); + + if (manager.IsRewardStats()) + { + if (manager.GetLobby() instanceof NewGameLobbyManager) + { + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", new String[] {"Castle Siege New.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", new String[] {"Castle Siege New.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", new String[] {"Castle Siege New.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", new String[] {"Castle Siege New.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + } + } + } } private void generateLoot() @@ -330,13 +378,13 @@ public class ShockCastleSiege extends TeamGame } Scoreboard.writeNewLine(); GameTeam red = GetTeam(ChatColor.RED); - long redBeacons = _beacons.get(red).stream().filter(TeamBeacon::isActive).count(); + long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); GameTeam blue = GetTeam(ChatColor.AQUA); - long blueBeacons = _beacons.get(blue).stream().filter(TeamBeacon::isActive).count(); - if (redBeacons > 0) + long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); + if (redCrystals > 0) { Scoreboard.write(_kings.get(red).getName(true)); - Scoreboard.write(redBeacons + "/2 Beacons Active"); + Scoreboard.write(redCrystals + "/2 Crystals Active"); } else { @@ -344,10 +392,10 @@ public class ShockCastleSiege extends TeamGame Scoreboard.write(_kings.get(red).getHealth() + ""); } Scoreboard.writeNewLine(); - if (blueBeacons > 0) + if (blueCrystals > 0) { Scoreboard.write(_kings.get(blue).getName(true)); - Scoreboard.write(blueBeacons + "/2 Beacons Active"); + Scoreboard.write(blueCrystals + "/2 Crystals Active"); } else { @@ -362,9 +410,9 @@ public class ShockCastleSiege extends TeamGame _writeScoreboard = false; Scoreboard.reset(); Scoreboard.writeNewLine(); - Scoreboard.write(deadKing + "'s " + C.cBlue + "castle has been conquered"); - Scoreboard.write(C.cBlue + "by " + winKing + "'s " + C.cBlue + "army with the help of"); - Scoreboard.write(warrior + C.cBlue + "!"); + Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); + Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); + Scoreboard.write(warrior + C.cWhite + "!"); Scoreboard.writeNewLine(); Scoreboard.draw(); @@ -390,11 +438,22 @@ public class ShockCastleSiege extends TeamGame redKing.setYaw(UtilAlg.GetYaw(redBlue)); blueKing.setPitch(UtilAlg.GetPitch(blueRed)); blueKing.setYaw(UtilAlg.GetYaw(blueRed)); - _beacons.put(red, Arrays.asList(new TeamBeacon(red, WorldData.GetDataLocs("PINK").get(0)), new TeamBeacon(red, WorldData.GetDataLocs("PINK").get(1)))); - _beacons.put(blue, Arrays.asList(new TeamBeacon(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamBeacon(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); + _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); + _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); this.CreatureAllowOverride = true; _kings.put(red, new TeamKing(red, "King Jon", redKing)); _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); + int kitIndex = 0; + for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + { + if (kitIndex >= GetKits().length) + { + kitIndex = 0; + } + Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); + Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); + kitIndex++; + } this.CreatureAllowOverride = false; _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); } @@ -444,10 +503,29 @@ public class ShockCastleSiege extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } if (GetKit(player) != null) @@ -497,7 +575,7 @@ public class ShockCastleSiege extends TeamGame GameTeam blue = GetTeam(ChatColor.AQUA); TeamKing redKing = _kings.get(red); TeamKing blueKing = _kings.get(blue); - redKing.update(_beacons.get(red).stream().filter(TeamBeacon::isActive).count() > 0); + redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); if (redKing.isDead()) { AnnounceEnd(blue); @@ -546,7 +624,7 @@ public class ShockCastleSiege extends TeamGame SetState(GameState.End); return; } - blueKing.update(_beacons.get(blue).stream().filter(TeamBeacon::isActive).count() > 0); + blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); if (blueKing.isDead()) { AnnounceEnd(red); @@ -686,6 +764,23 @@ public class ShockCastleSiege extends TeamGame { event.setCancelled(true); } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } } @SuppressWarnings("deprecation") @@ -813,7 +908,6 @@ public class ShockCastleSiege extends TeamGame if (data.addKill(hardLine)) { AddStat(player, "KillStreak", 1, false, false); - player.sendMessage(C.cRedB + "You have received a Kill Streak Reward!"); ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); } if (UtilMath.isEven(data.getKills())) @@ -890,26 +984,26 @@ public class ShockCastleSiege extends TeamGame if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) { - List beacons = new ArrayList<>(); + List crystals = new ArrayList<>(); - for (List b : _beacons.values()) + for (List c : _crystals.values()) { - beacons.addAll(b); + crystals.addAll(c); } - for (TeamBeacon beacon : beacons) + for (TeamCrystal crystal : crystals) { - if (beacon.isActive() && !beacon.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), beacon.getLocation()) <= radius) + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) { - beacon.destroy(); - AddGems(player, 40, "Beacon Destruction", false, true); - long remaining = beacons.stream().filter(b -> b.getOwner().GetColor() == beacon.getOwner().GetColor()).filter(TeamBeacon::isActive).count(); + crystal.destroy(); + AddGems(player, 40, "Crystal Destruction", false, true); + long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); if (remaining > 0) { - Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(beacon.getOwner().GetFormattedName() + "'s Beacons") + " has been destroyed!")); + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); } else { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(beacon.getOwner().GetFormattedName() + "'s Beacons") + " has been destroyed and " + F.elem(_kings.get(beacon.getOwner()).getName(false)) + " is now vulnerable!")); + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); } } } @@ -996,6 +1090,10 @@ public class ShockCastleSiege extends TeamGame teleport.setYaw(shooter.getLocation().getYaw()); shooter.teleport(teleport); } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } } @EventHandler @@ -1022,6 +1120,11 @@ public class ShockCastleSiege extends TeamGame { return; } + if (event.getEntity() instanceof EnderCrystal) + { + event.setCancelled(true); + return; + } if (event.getEntity() instanceof Zombie) { event.setCancelled(true); @@ -1040,9 +1143,9 @@ public class ShockCastleSiege extends TeamGame { return; } - if (_beacons.get(owner).stream().filter(TeamBeacon::isActive).count() > 0) + if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) { - UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective beacons!")); + UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); return; } TeamKing king = _kings.get(owner); @@ -1203,6 +1306,7 @@ public class ShockCastleSiege extends TeamGame event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); } } } @@ -1239,8 +1343,15 @@ public class ShockCastleSiege extends TeamGame @EventHandler public void TNTExpire(UpdateEvent event) { - if (event.getType() != UpdateType.FASTER) + if (!IsLive()) + { return; + } + + if (event.getType() != UpdateType.FASTER) + { + return; + } Iterator tntIterator = _tntCarry.iterator(); @@ -1265,7 +1376,34 @@ public class ShockCastleSiege extends TeamGame tntIterator.remove(); continue; } - + + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + } + } + + UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); } } @@ -1291,4 +1429,13 @@ public class ShockCastleSiege extends TeamGame tnt.setFuseTicks(0); UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) + { + if (_tntSpawner.canPlaceFireAt(event.getBlock())) + { + event.setCancelled(true); + } + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java index 70f9e2484..18cb00cf5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java @@ -3,9 +3,10 @@ package nautilus.game.arcade.game.games.castlesiege.data; import java.util.List; import org.bukkit.Color; +import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.FireworkEffect.Type; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; @@ -40,6 +41,16 @@ public class ObjectiveTNTSpawner return _entity != null; } + public boolean canPlaceFireAt(Block block) + { + if (!isSpawned()) + { + return false; + } + + return UtilMath.offsetSquared(_lastSpawnLoc, block.getLocation()) <= 9; + } + public long getNextTNT() { return (_lastPickedUp + TNT_SPAWN_DELAY) - System.currentTimeMillis(); @@ -72,6 +83,10 @@ public class ObjectiveTNTSpawner else if (isSpawned()) { _entity.teleport(_lastSpawnLoc); + if (!_entity.isValid() || _entity.isDead()) + { + _entity = _lastSpawnLoc.getWorld().dropItem(_lastSpawnLoc, new ItemStack(Material.TNT)); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java similarity index 57% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java index 74469579d..8c2ebb0af 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamBeacon.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java @@ -2,16 +2,19 @@ package nautilus.game.arcade.game.games.castlesiege.data; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EnderCrystal; import nautilus.game.arcade.game.GameTeam; -public class TeamBeacon +public class TeamCrystal { private Location _loc; private GameTeam _owner; + private EnderCrystal _crystal; private boolean _destroyed; - public TeamBeacon(GameTeam owner, Location loc) + public TeamCrystal(GameTeam owner, Location loc) { _owner = owner; _loc = loc; @@ -37,12 +40,15 @@ public class TeamBeacon public void spawn() { _destroyed = false; - _loc.getBlock().setType(Material.BEACON); + _crystal = _loc.getWorld().spawn(_loc, EnderCrystal.class); + _loc.getBlock().getRelative(0, -2, 0).setType(Material.BEACON); } public void destroy() { _destroyed = true; - _loc.getBlock().setType(Material.AIR); + _crystal.remove(); + _crystal = null; + _loc.getBlock().getRelative(0, -2, 0).setType(Material.SMOOTH_BRICK); } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java index e8b0d5f4e..4ae56308e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java @@ -115,18 +115,22 @@ public class KitArcher extends KitPlayer { if (streak == 2) { + player.sendMessage(C.cRedB + "You have received 8 Arrows as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(8).setTitle(F.item("Fletched Arrow")).build()); } else if (streak == 4) { + player.sendMessage(C.cRedB + "You have received a Power I book as a Kill Streak Reward!"); player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); } else if (streak == 6) { + player.sendMessage(C.cRedB + "You have received a Punch I book as a Kill Streak Reward!"); player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_KNOCKBACK, 1).build()); } else if (streak == 8) { + player.sendMessage(C.cRedB + "You have received a Power I book as a Kill Streak Reward!"); player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java index 91717d869..2a5731ee6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java @@ -130,18 +130,22 @@ public class KitDemolitionist extends KitPlayer { if (streak == 2) { + player.sendMessage(C.cRedB + "You have received 2 Throwing TNT as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(2).build()); } else if (streak == 4) { + player.sendMessage(C.cRedB + "You have received 3 Throwing TNT as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(3).build()); } else if (streak == 6) { + player.sendMessage(C.cRedB + "You have received 4 Throwing TNT as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); } else if (streak == 8) { + player.sendMessage(C.cRedB + "You have received 5 Throwing TNT as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(5).build()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java index 5579e0f7c..c961311ed 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java @@ -108,18 +108,22 @@ public class KitFighter extends KitPlayer { if (streak == 2) { + player.sendMessage(C.cRedB + "You have received a Golden Applegate as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); } else if (streak == 4) { - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + player.sendMessage(C.cRedB + "You have received a Splash Healing II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)16421).build()); } else if (streak == 6) { - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + player.sendMessage(C.cRedB + "You have received a Speed II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)8290).build()); } else if (streak == 8) { + player.sendMessage(C.cRedB + "You have received a Fire Aspect I book as a Kill Streak Reward!"); player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java index 67e71d8d3..cbd30bb10 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java @@ -3,6 +3,10 @@ package nautilus.game.arcade.game.games.castlesiege.shockkits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import mineplex.core.common.util.C; import mineplex.core.itemstack.EnchantedBookBuilder; @@ -115,18 +119,27 @@ public class KitTank extends KitPlayer { if (streak == 2) { + player.sendMessage(C.cRedB + "You have received a Golden Applegate as a Kill Streak Reward!"); player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); } else if (streak == 4) { - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + player.sendMessage(C.cRedB + "You have received a Regeneration II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)8289).build()); } else if (streak == 6) { - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + player.sendMessage(C.cRedB + "You have received a Resistance I Potion as a Kill Streak Reward!"); + ItemStack item = new ItemBuilder(Material.POTION).setData((short)8205).build(); + PotionMeta pm = (PotionMeta) item.getItemMeta(); + pm.clearCustomEffects(); + pm.addCustomEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20 * 60, 0), true); + item.setItemMeta(pm); + player.getInventory().addItem(item); } else if (streak == 8) { + player.sendMessage(C.cRedB + "You have received a Thorns II book as a Kill Streak Reward!"); player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.THORNS, 2).build()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java index 8e7128943..ce18f5910 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java @@ -3,6 +3,16 @@ package nautilus.game.arcade.managers; import java.util.HashMap; import java.util.UUID; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import mineplex.core.Managers; import mineplex.core.common.Rank; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilMath; @@ -14,15 +24,6 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.stats.StatTracker; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - public class GameStatManager implements Listener { ArcadeManager Manager; @@ -74,10 +75,13 @@ public class GameStatManager implements Listener Manager.GetStatsManager().incrementStat(player, stat, value); - // Leaderboard hook for logging appropriate stat events - // Note: Rejects stat events that are not of the appropriate types. - int gameId = event.GetGame().GetType().getGameId(); - LeaderboardManager.getInstance().attemptStatEvent(player, stat.split("\\.")[1], gameId, value); + if (!event.GetGame().Leaderboards) + continue; + + if (stat.startsWith("Global.")) + continue; + + Managers.get(LeaderboardManager.class).handleStatIncrease(player, stat, value); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java index a0a07de20..11b970117 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java @@ -1,24 +1,20 @@ package nautilus.game.arcade.managers.lobby.current; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.timing.TimingManager; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.games.deathtag.DeathTag; -import nautilus.game.arcade.game.games.hideseek.HideSeek; -import nautilus.game.arcade.game.games.smash.SuperSmash; -import nautilus.game.arcade.game.games.wither.WitherGame; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.KitAvailability; -import nautilus.game.arcade.kit.KitSorter; -import nautilus.game.arcade.kit.NullKit; -import nautilus.game.arcade.managers.LobbyEnt; -import nautilus.game.arcade.managers.lobby.LobbyManager; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -32,16 +28,26 @@ import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerArmorStandManipulateEvent; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import mineplex.core.common.timing.TimingManager; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.games.deathtag.DeathTag; +import nautilus.game.arcade.game.games.hideseek.HideSeek; +import nautilus.game.arcade.game.games.smash.SuperSmash; +import nautilus.game.arcade.game.games.wither.WitherGame; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.KitSorter; +import nautilus.game.arcade.kit.NullKit; +import nautilus.game.arcade.managers.LobbyEnt; +import nautilus.game.arcade.managers.lobby.LobbyManager; /** * @@ -574,5 +580,15 @@ public class NewGameLobbyManager extends LobbyManager return null; } - -} + + public Map> getCustomLocs() + { + Map> ret = new HashMap<>(); + ret.putAll(_multipleLocs); + for (Entry singleEntry : _singleLocs.entrySet()) + { + ret.put(singleEntry.getKey(), Arrays.asList(singleEntry.getValue())); + } + return ret; + } +} \ No newline at end of file From 49575e794f60b8a72afdbeb58b5b5a8a3e846f52 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 00:11:19 -0400 Subject: [PATCH 068/170] Clean up castle siege leaderboards upon game end --- .../game/arcade/game/games/castlesiege/ShockCastleSiege.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java index 91f074691..fcd57e09b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java @@ -704,6 +704,10 @@ public class ShockCastleSiege extends TeamGame Manager.GetDamage().SetEnabled(true); Manager.GetExplosion().setEnabled(true); Manager.GetCreature().SetDisableCustomDrops(false); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_KILLS"); } } From b9fd59737095eda9c5803e53aa78ac16021aaeb5 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 01:14:17 -0400 Subject: [PATCH 069/170] Replace old castle siege with new castle siege --- .../core/achievement/Achievement.java | 16 +- .../core/achievement/AchievementCategory.java | 4 +- .../src/mineplex/core/game/GameDisplay.java | 5 +- .../hub/server/ui/ServerGameMenu.java | 9 +- .../src/nautilus/game/arcade/GameType.java | 4 +- .../game/games/castlesiege/CastleSiege.java | 2114 ++++++++++------- .../games/castlesiege/CastleSiegeClassic.java | 973 ++++++++ .../games/castlesiege/CastleSiegeTDM.java | 10 +- .../games/castlesiege/ShockCastleSiege.java | 1445 ----------- .../{kits => classickits}/KitHuman.java | 2 +- .../{kits => classickits}/KitHumanKnight.java | 2 +- .../KitHumanMarksman.java | 2 +- .../KitHumanPeasant.java | 2 +- .../{kits => classickits}/KitUndead.java | 2 +- .../KitUndeadArcher.java | 2 +- .../{kits => classickits}/KitUndeadGhoul.java | 2 +- .../KitUndeadZombie.java | 2 +- .../{shockkits => kits}/KitAlchemist.java | 2 +- .../{shockkits => kits}/KitArcher.java | 2 +- .../{shockkits => kits}/KitBuilder.java | 2 +- .../{shockkits => kits}/KitDemolitionist.java | 2 +- .../{shockkits => kits}/KitEnchanter.java | 2 +- .../{shockkits => kits}/KitFighter.java | 2 +- .../{shockkits => kits}/KitHardline.java | 2 +- .../{shockkits => kits}/KitNinja.java | 2 +- .../{shockkits => kits}/KitPlayer.java | 8 +- .../{shockkits => kits}/KitTank.java | 2 +- .../{shockkits => kits}/KitWorkman.java | 2 +- .../{shockkits => kits}/PerkBloodlust.java | 2 +- .../arcade/stats/BloodThirstyStatTracker.java | 2 +- .../arcade/stats/KingDamageStatTracker.java | 8 +- .../arcade/stats/KingSlayerStatTracker.java | 4 +- 32 files changed, 2319 insertions(+), 2321 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitHuman.java (90%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitHumanKnight.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitHumanMarksman.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitHumanPeasant.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitUndead.java (93%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitUndeadArcher.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitUndeadGhoul.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{kits => classickits}/KitUndeadZombie.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitAlchemist.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitArcher.java (98%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitBuilder.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitDemolitionist.java (98%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitEnchanter.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitFighter.java (98%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitHardline.java (94%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitNinja.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitPlayer.java (88%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitTank.java (99%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/KitWorkman.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{shockkits => kits}/PerkBloodlust.java (97%) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 87b22ddad..ff7e2344b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -376,7 +376,7 @@ public enum Achievement //Castle Siege CASTLE_SIEGE_KILL_STREAK("Kill Streak", 0, - new String[]{"Castle Siege New.KillStreak", "Castle Siege TDM.KillStreak"}, + new String[]{"Castle Siege.KillStreak", "Castle Siege TDM.KillStreak"}, new String[]{"Earn Kill Streak Rewards"}, new int[][]{new int[]{0, 50, 500}, new int[]{0, 100, 750}, new int[]{0, 150, 1000}, new int[]{0, 200, 1500}, new int[]{0, 400, 2000}, new int[]{0, 500, 2500}, new int[]{0, 1000, 3000}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4000}, new int[]{0, 5000, 100000}}, new int[]{10, 20, 50, 100, 200, 250, 500, 750, 1000, 2000}, @@ -385,7 +385,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_FIRST_BLOOD("First Blood", 0, - new String[]{"Castle Siege New.FirstBlood", "Castle Siege TDM.FirstBlood"}, + new String[]{"Castle Siege.FirstBlood", "Castle Siege TDM.FirstBlood"}, new String[]{"Obtain the first kill in a Match"}, new int[][]{new int[]{0, 100, 100}, new int[]{0, 150, 200}, new int[]{0, 200, 300}, new int[]{0, 250, 400}, new int[]{0, 500, 500}}, new int[]{2, 5, 10, 25, 50}, @@ -394,7 +394,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_FIGHTER_KIT("Fighter", 0, - new String[]{"Castle Siege New.FighterKitKills", "Castle Siege TDM.FighterKitKills"}, + new String[]{"Castle Siege.FighterKitKills", "Castle Siege TDM.FighterKitKills"}, new String[]{"Kill opponents while wearing the Fighter Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, @@ -403,7 +403,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_TANK_KIT("Tank", 0, - new String[]{"Castle Siege New.TankKitKills", "Castle Siege TDM.TankKitKills"}, + new String[]{"Castle Siege.TankKitKills", "Castle Siege TDM.TankKitKills"}, new String[]{"Kill opponents while wearing the Tank Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, @@ -412,7 +412,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_ARCHER_KIT("Archer", 0, - new String[]{"Castle Siege New.ArcherKitKills", "Castle Siege TDM.ArcherKitKills"}, + new String[]{"Castle Siege.ArcherKitKills", "Castle Siege TDM.ArcherKitKills"}, new String[]{"Kill opponents while wearing the Archer Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, @@ -421,7 +421,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_DEMOLITIONIST_KIT("Demolitionist", 0, - new String[]{"Castle Siege New.DemolitionistKitKills", "Castle Siege TDM.DemolitionistKitKills"}, + new String[]{"Castle Siege.DemolitionistKitKills", "Castle Siege TDM.DemolitionistKitKills"}, new String[]{"Kill opponents while wearing the Demolitionist Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, @@ -430,7 +430,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_WINNER("Siege", 0, - new String[]{"Castle Siege New.Wins", "Castle Siege TDM.Wins"}, + new String[]{"Castle Siege.Wins", "Castle Siege TDM.Wins"}, new String[]{"Win games of Castle Siege"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{2, 5, 25, 50, 100, 150, 250, 500, 1000, 2000}, @@ -439,7 +439,7 @@ public enum Achievement AchievementCategory.CASTLE_SIEGE), CASTLE_SIEGE_MEDALIST("Medalist", 0, - new String[]{"Castle Siege New.MedalsEarned", "Castle Siege TDM.MedalsEarned"}, + new String[]{"Castle Siege.MedalsEarned", "Castle Siege TDM.MedalsEarned"}, new String[]{"Earn Bronze, Silver, or Gold Medals in Castle Siege Matches"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{2, 50, 150, 250, 500, 1000, 1500, 2500, 5000, 10000}, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index d6137618d..63cdf68c0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -85,9 +85,9 @@ public enum AchievementCategory new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, Material.BLAZE_ROD, 0, GameCategory.SURVIVAL, "Witch Doctor Kit", false, GameDisplay.Wizards.getGameId()), - CASTLE_SIEGE("Castle Siege", new String[] {"Castle Siege New", "Castle Siege TDM"}, + CASTLE_SIEGE("Castle Siege", new String[] {"Castle Siege", "Castle Siege TDM"}, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.CROWNS_EARNED }, - Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiegeNew.getGameId(), GameDisplay.CastleSiegeTDM.getGameId()), + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiege.getGameId(), GameDisplay.CastleSiegeTDM.getGameId()), BAWK_BAWK_BATTLES("Bawk Bawk Battles", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index eeb057525..5a63e6100 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -14,9 +14,8 @@ public enum GameDisplay Barbarians("A Barbarians Life", Material.WOOD_AXE, (byte)0, GameCategory.EXTRA, 2, false), BossBattles("Boss Battles", Material.SKULL_ITEM, (byte) 0, GameCategory.EVENT, 55, false), Bridge("The Bridges", Material.IRON_PICKAXE, (byte)0, GameCategory.SURVIVAL, 3, true), - CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 4, true), - CastleSiegeNew("Castle Siege New", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), - CastleSiegeTDM("Castle Siege TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, true), + CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), + CastleSiegeTDM("Castle Siege TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, false), ChampionsDominate("Champions Domination", "Champions", Material.BEACON, (byte)0, GameCategory.CHAMPIONS, 6, true), ChampionsTDM("Champions TDM", "Champions", Material.GOLD_SWORD, (byte)0, GameCategory.CHAMPIONS, 5, true), Christmas("Christmas Chaos", Material.SNOW_BALL, (byte)0, GameCategory.CLASSICS, 8, false), diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java index 5bfebcbdd..79d186558 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -154,12 +154,13 @@ public class ServerGameMenu extends ShopPageBase C.Reset + "last man standing.", }, "TDM", "Team_Deathmatch", new SelectTDMButton(this)); - add(24, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Siege " + C.cGray + "Team Game", new String[] + add(24, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Siege " + C.cGray + "Fast-Paced PvP", new String[] { + (_extraValue ? C.cAquaB : C.cWhiteB) + "MAJOR UPDATE/REWRITE", C.Reset + "", - C.Reset + "Defenders must protect King Sparklez", - C.Reset + "from the endless waves of Undead", - C.Reset + "until the sun rises!", + C.Reset + "Combatants must battle to", + C.Reset + "win the day for their king", + C.Reset + "at all costs!", }, "CS", "Castle_Siege", new SelectCSButton(this)); add(26, Material.GRASS, C.cYellowB + "Block Hunt " + C.cGray + "Cat and Mouse", new String[] diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index b15bfdfb5..76e5c38bf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -24,9 +24,8 @@ import nautilus.game.arcade.game.games.build.modes.DukesOfDecoration; import nautilus.game.arcade.game.games.build.modes.TeamBuild; import nautilus.game.arcade.game.games.buildmavericks.BuildMavericks; import nautilus.game.arcade.game.games.cards.Cards; -import nautilus.game.arcade.game.games.castlesiege.CastleSiege; import nautilus.game.arcade.game.games.castlesiege.CastleSiegeTDM; -import nautilus.game.arcade.game.games.castlesiege.ShockCastleSiege; +import nautilus.game.arcade.game.games.castlesiege.CastleSiege; import nautilus.game.arcade.game.games.champions.ChampionsCTF; import nautilus.game.arcade.game.games.champions.ChampionsDominate; import nautilus.game.arcade.game.games.champions.ChampionsTDM; @@ -132,7 +131,6 @@ public enum GameType BossBattles(BossBattles.class, GameDisplay.BossBattles), Bridge(Bridge.class, GameDisplay.Bridge), CastleSiege(CastleSiege.class, GameDisplay.CastleSiege), - CastleSiegeNew(ShockCastleSiege.class, GameDisplay.CastleSiegeNew), CastleSiegeTDM(CastleSiegeTDM.class, GameDisplay.CastleSiegeTDM), ChampionsCTF(ChampionsCTF.class, GameDisplay.ChampionsCTF), ChampionsDominate(ChampionsDominate.class, GameDisplay.ChampionsDominate), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java index a5a67d2d0..f17e43398 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java @@ -1,973 +1,1445 @@ package nautilus.game.arcade.game.games.castlesiege; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; -import org.bukkit.Effect; -import org.bukkit.EntityEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.block.Block; -import org.bukkit.entity.Creature; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Horse; -import org.bukkit.entity.Horse.Style; -import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; +import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.player.PlayerEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.util.Vector; +import mineplex.core.Managers; import mineplex.core.common.util.C; import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; - import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.events.PlayerGameRespawnEvent; import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; import nautilus.game.arcade.game.TeamGame; -import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanKnight; -import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanMarksman; -import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanPeasant; -import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadArcher; -import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadGhoul; -import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadZombie; +import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; +import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; +import nautilus.game.arcade.game.games.castlesiege.data.TeamCrystal; +import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; +import nautilus.game.arcade.game.games.castlesiege.kits.KitArcher; +import nautilus.game.arcade.game.games.castlesiege.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castlesiege.kits.KitFighter; +import nautilus.game.arcade.game.games.castlesiege.kits.KitPlayer; +import nautilus.game.arcade.game.games.castlesiege.kits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.NullKit; -import nautilus.game.arcade.stats.BloodThirstyStatTracker; -import nautilus.game.arcade.stats.KingDamageStatTracker; -import nautilus.game.arcade.stats.KingSlayerStatTracker; -import nautilus.game.arcade.stats.TeamDeathsStatTracker; -import nautilus.game.arcade.stats.TeamKillsStatTracker; -import nautilus.game.arcade.stats.WinAsTeamStatTracker; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; public class CastleSiege extends TeamGame { - public static class KingDamageEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlerList() - { - return handlers; - } - - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } - - private final double _damage; - - public KingDamageEvent(Player who, double damage) - { - super(who); - - _damage = damage; - } - - public double getDamage() - { - return _damage; - } - } - - public static class KingSlaughterEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlerList() - { - return handlers; - } - - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } - - public KingSlaughterEvent(Player who) - { - super(who); - } - } - - private ArrayList _lastScoreboard = new ArrayList(); - - private long _tntSpawn = 0; - private ArrayList _tntSpawns = new ArrayList(); - private ArrayList _tntWeakness = new ArrayList(); - - private HashMap _tntCarry = new HashMap(); - private HashSet _tntCarryEnd = new HashSet(); - - private ArrayList _kingLocs; - private Creature _king; - private Location _kingLoc; - private String _kingName; - private Player _kingDamager = null; - private int _kingHealth = 40; - - private ArrayList _peasantSpawns; - private ArrayList _horseSpawns; - + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + private ItemBuilder _wearableTnt; + + private Map _streakData = new WeakHashMap<>(); + private Map> _crystals = new HashMap<>(); + private Map _kings = new HashMap<>(); + private List _tntCarry = new ArrayList<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _diamondGearCommon = new ChestLoot(true); + private ChestLoot _diamondGearRare = new ChestLoot(true); + private ChestLoot _weaponGearCommon = new ChestLoot(true); + private ChestLoot _weaponGearRare = new ChestLoot(true); + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + private ChestLoot _enchantGearCommon = new ChestLoot(true); + private ChestLoot _enchantGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private ObjectiveTNTSpawner _tntSpawner; + + private boolean _writeScoreboard = true; + + @SuppressWarnings("deprecation") public CastleSiege(ArcadeManager manager) { - super(manager, GameType.CastleSiege, - - new Kit[] - { - new KitHumanMarksman(manager), - new KitHumanKnight(manager), - //new KitHumanBrawler(manager), - //new KitHumanAssassin(manager), - new NullKit(manager), - new KitHumanPeasant(manager), - new NullKit(manager), - new KitUndeadGhoul(manager), - new KitUndeadArcher(manager), - new KitUndeadZombie(manager), - }, - - new String[] - { - F.elem(C.cAqua + "Defenders") + C.cWhite + " must defend the King.", - F.elem(C.cAqua + "Defenders") + C.cWhite + " win when the sun rises.", - F.elem(C.cAqua + "Defenders") + C.cWhite + " respawn as wolves.", - "", - F.elem(C.cRed + "Undead") + C.cWhite + " must kill the King.", - F.elem(C.cRed + "Undead") + C.cWhite + " lose when the sun rises.", - - }); - - _help = new String[] - { - "Marksmen are extremely important to defence!", - "It's recommended 50%+ of defence are Marksmen.", - "Use Barricades to block the Undeads path.", - "Use TNT to destroy weak points in walls.", - "Weak points are marked by cracked stone brick.", - "Undead can break fences with their axes.", - "Undead Archers must pick up arrows from the ground.", - - }; - - this.StrictAntiHack = true; + super(manager, GameType.CastleSiegeNew, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] + { + "Destroy enemy sentry crystals with running TNT", + "After the enemy crystals are destroyed you must slay their king", + "First team to kill the enemy king wins", + "Chests refill every 2 minutes", + "TNT Respawns every 1 minute" + } + ); + _help = new String[] + { + "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", + "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; + + this.StrictAntiHack = true; this.HungerSet = 20; this.DeathOut = false; - this.WorldTimeSet = 14000; //14000 - this.BlockPlaceAllow.add(85); - - _kingName = C.cYellow + C.Bold + "King Sparklez"; - - GameTeam notRedTeam = null; - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() != ChatColor.RED) - { - notRedTeam = team; - break; - } - } - - registerStatTrackers( - new KingSlayerStatTracker(this), - new BloodThirstyStatTracker(this), - new KingDamageStatTracker(this), - - new TeamDeathsStatTracker(this), - new TeamKillsStatTracker(this) - ); - - registerChatStats( - Kills, - Deaths, - KDRatio, - BlankLine, - Assists, - DamageDealt, - DamageTaken - ); - - registerChatStats(); - + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.Leaderboards = true; + this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; + new CompassModule() - .setGiveCompass(true) - .setGiveCompassToSpecs(true) - .setGiveCompassToAlive(false) - .register(this); - } - - @Override - public void ParseData() - { - _tntSpawns = WorldData.GetDataLocs("RED"); - _tntWeakness = WorldData.GetDataLocs("BLACK"); - - _kingLocs = WorldData.GetDataLocs("YELLOW"); - - _peasantSpawns = WorldData.GetDataLocs("GREEN"); - _horseSpawns = WorldData.GetDataLocs("BROWN"); - } - - @Override - public void RestrictKits() - { - for (Kit kit : GetKits()) + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); + generateLoot(); + + if (manager.IsRewardStats()) { - for (GameTeam team : GetTeamList()) + if (manager.GetLobby() instanceof NewGameLobbyManager) { - if (team.GetColor() == ChatColor.RED) + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) { - if (kit.GetName().contains("Castle")) - team.GetRestrictedKits().add(kit); - - team.SetName("Undead"); + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); } - else + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) { - if (kit.GetName().contains("Undead")) - team.GetRestrictedKits().add(kit); - - team.SetRespawnTime(8); - - team.SetName("Defenders"); + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.ALL, loc, 10)); } - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void registerTeamTracker(GameStateChangeEvent event) - { - if (event.GetState() == GameState.Recruit) - { - GameTeam notRed = null; - - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() == ChatColor.RED) - continue; - - notRed = team; - break; - } - - if (notRed != null) - { - registerStatTrackers(new WinAsTeamStatTracker(this, notRed, "ForTheKing")); - System.out.println("Successfully registered For the King StatTrak"); } } } - @EventHandler - public void MoveKits(GameStateChangeEvent event) + private void generateLoot() { - if (event.GetState() != GameState.Prepare) - return; - - for (int i = 0; i < WorldData.GetDataLocs("PINK").size() && i < 3; i++) { - if (GetKits().length <= 5 + i) - continue; - - this.CreatureAllowOverride = true; - Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("PINK").get(i)); - this.CreatureAllowOverride = false; - - Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("PINK").get(i)); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + } + { + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + } + { + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); + } + { + _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); + } + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + { + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); + _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); + } + { + _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); } } - - @EventHandler - public void HorseSpawn(GameStateChangeEvent event) + + private void fillChest(Block block) { - if (event.GetState() != GameState.Prepare) - return; - - for (Location loc : _horseSpawns) + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) { - this.CreatureAllowOverride = true; - Horse horse = loc.getWorld().spawn(loc, Horse.class); - this.CreatureAllowOverride = false; - - horse.setAdult(); - horse.setAgeLock(true); - horse.setColor(org.bukkit.entity.Horse.Color.BLACK); - horse.setStyle(Style.BLACK_DOTS); - horse.setMaxDomestication(1); - horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); - horse.getInventory().setArmor(new ItemStack(Material.IRON_BARDING)); - - horse.setMaxHealth(60); - horse.setHealth(horse.getMaxHealth()); - - horse.setCustomName("War Horse"); + return; } - } - - @EventHandler - public void HorseInteract(PlayerInteractEntityEvent event) - { - if (!(event.getRightClicked() instanceof Horse)) - return; - - Player player = event.getPlayer(); - GameTeam team = GetTeam(player); - - if (team == null || team.GetColor() == ChatColor.RED || !IsAlive(player)) + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) { - event.setCancelled(true); - } - } - - @EventHandler - public void HorseDamageCancel(CustomDamageEvent event) - { - if (!(event.GetDamageeEntity() instanceof Horse)) - return; - - Player player = event.GetDamagerPlayer(true); - if (player == null) - return; - - if (!IsAlive(player)) - return; - - if (GetTeam(player) == null) - return; - - if (GetTeam(player).GetColor() == ChatColor.RED) - return; - - event.SetCancelled("Horse Team Damage"); - } - - @EventHandler(priority = EventPriority.HIGH) - public void GameStateChange(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; - - //Spawn King - this.CreatureAllowOverride = true; - - _kingLoc = _kingLocs.get(UtilMath.r(_kingLocs.size())); - - _king = (Creature) _kingLoc.getWorld().spawnEntity(_kingLoc, EntityType.ZOMBIE); - - _king.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); - _king.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); - _king.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); - _king.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); - _king.getEquipment().setItemInHand(new ItemStack(Material.DIAMOND_SWORD)); - - _king.setCustomName(_kingName); - _king.setCustomNameVisible(true); - - _king.setRemoveWhenFarAway(false); - - this.CreatureAllowOverride = false; - } - - @EventHandler(priority = EventPriority.HIGH) - public void SetDefenderRespawn(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Live) - return; - - //Change to Peasant Spawns - this.GetTeam(ChatColor.AQUA).SetSpawns(_peasantSpawns); - } - - - @EventHandler - public void KingTarget(EntityTargetEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void KingDamage(CustomDamageEvent event) - { - if (_king == null || !_king.isValid()) - return; - - if (!event.GetDamageeEntity().equals(_king)) - return; - - event.SetCancelled("King Damage"); - - Player damager = event.GetDamagerPlayer(true); - if (damager == null) return; - - GameTeam team = GetTeam(damager); - - if (team != null && team.GetColor() == ChatColor.RED) - { - if (!Recharge.Instance.use(damager, "Damage King", 400, false, false)) - return; + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); - if (!IsAlive(damager)) + ChestLoot loot = _miscGear; + if (chance <= 0.6) { - return; + loot = _rodsAndGaps; } - - _king.playEffect(EntityEffect.HURT); - - _kingDamager = damager; - _kingHealth--; - - Bukkit.getPluginManager().callEvent(new KingDamageEvent(damager, 1)); - - if (_kingHealth < 0) - _kingHealth = 0; - - WriteScoreboard(); - - if (_kingHealth <= 0) - _king.damage(500); - - EndCheck(); - } - } - - @EventHandler - public void KingUpdate(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.SEC) - return; - - if (_king == null) - return; - - if (UtilMath.offset(_king.getLocation(), _kingLoc) > 6) - { - _king.teleport(_kingLoc); - } - else - { - UtilEnt.CreatureMove(_king, _kingLoc, 1f); - } - } - - @EventHandler - public void PlayerDeath(PlayerGameRespawnEvent event) - { - if (GetTeam(ChatColor.AQUA).HasPlayer(event.GetPlayer())) - SetKit(event.GetPlayer(), GetKits()[3], true); - } - - @Override - @EventHandler - public void ScoreboardUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - WriteScoreboard(); - } - - public void WriteScoreboard() - { - //Get Values - HashMap _scoreGroup = new HashMap(); - _scoreGroup.put(C.cAqua + "Defenders", 0); - _scoreGroup.put(C.cDAqua + "Wolves", 0); - _scoreGroup.put(C.cRed + "Undead", 0); - - for (Player player : UtilServer.getPlayers()) - { - if (!IsAlive(player)) - continue; - - Kit kit = GetKit(player); - if (kit == null) continue; - - if (kit.GetName().contains("Castle")) + if (chance <= 0.5) { - if (kit.GetName().contains("Wolf")) + loot = _potionGearCommon; + if (subChance <= 0.45) { - _scoreGroup.put(C.cDAqua + "Wolves", 1 + _scoreGroup.get(C.cDAqua + "Wolves")); - } - else - { - _scoreGroup.put(C.cAqua + "Defenders", 1 + _scoreGroup.get(C.cAqua + "Defenders")); + loot = _potionGearRare; } } - else if (kit.GetName().contains("Undead")) + if (chance <= 0.3) { - _scoreGroup.put(C.cRed + "Undead", 1 + _scoreGroup.get(C.cRed + "Undead")); + loot = _rangedGear; } + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; } - - //Wipe Last Scoreboard.reset(); - - //Teams - for (String group : _scoreGroup.keySet()) + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) { - Scoreboard.writeNewLine(); - Scoreboard.write(group); - Scoreboard.write(ChatColor.getLastColors(group) + _scoreGroup.get(group) + " Players"); + refillTime = TIME_TILL_REFILL; } - - //King - if (_king != null && _king.isValid()) + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "TNT Spawn"); + long tntTime = _tntSpawner.getNextTNT(); + if (!IsLive()) { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "King"); - Scoreboard.write(_kingHealth + " Health"); + tntTime = 60000; } - - long timeLeft = 24000 - WorldTimeSet; - timeLeft = timeLeft / 20 * 1000; - - - if (timeLeft > 0) + if (_tntSpawner.isSpawned()) { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); - Scoreboard.write(UtilTime.MakeStr(timeLeft, 0)); + Scoreboard.write("Spawned"); } else { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); - Scoreboard.write("Undead Burning!"); - - for (Player player : GetTeam(ChatColor.RED).GetPlayers(true)) - Manager.GetCondition().Factory().Ignite("Sun Damage", player, player, 5, false, false); + Scoreboard.write(UtilTime.MakeStr(tntTime)); + } + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); + GameTeam blue = GetTeam(ChatColor.AQUA); + long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); + if (redCrystals > 0) + { + Scoreboard.write(_kings.get(red).getName(true)); + Scoreboard.write(redCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(red).getName(true) + " Health"); + Scoreboard.write(_kings.get(red).getHealth() + ""); + } + Scoreboard.writeNewLine(); + if (blueCrystals > 0) + { + Scoreboard.write(_kings.get(blue).getName(true)); + Scoreboard.write(blueCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(blue).getName(true) + " Health"); + Scoreboard.write(_kings.get(blue).getHealth() + ""); } - Scoreboard.draw(); } - + + public void writeFinalScoreboard(String deadKing, String winKing, String warrior) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); + Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); + Scoreboard.write(warrior + C.cWhite + "!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Location redKing = WorldData.GetDataLocs("RED").get(0); + Location blueKing = WorldData.GetDataLocs("BLUE").get(0); + Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); + Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); + redKing.setPitch(UtilAlg.GetPitch(redBlue)); + redKing.setYaw(UtilAlg.GetYaw(redBlue)); + blueKing.setPitch(UtilAlg.GetPitch(blueRed)); + blueKing.setYaw(UtilAlg.GetYaw(blueRed)); + _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); + _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); + this.CreatureAllowOverride = true; + _kings.put(red, new TeamKing(red, "King Jon", redKing)); + _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); + int kitIndex = 0; + for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + { + if (kitIndex >= GetKits().length) + { + kitIndex = 0; + } + Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); + Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); + kitIndex++; + } + this.CreatureAllowOverride = false; + _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); + } + @Override public void EndCheck() { if (!IsLive()) - return; - - if (this.WorldTimeSet > 24100 || GetTeam(ChatColor.RED).GetSize() == 0) { - SetCustomWinLine(_kingName + ChatColor.RESET + " has survived the siege!"); - - AnnounceEnd(GetTeam(ChatColor.AQUA)); - - for (GameTeam team : GetTeamList()) - { - if (WinnerTeam != null && team.equals(WinnerTeam)) - { - for (Player player : team.GetPlayers(false)) - { - AddGems(player, 10, "Winning Team", false, false); - } - } - - for (Player player : team.GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - } - - SetState(GameState.End); + return; } - if (!_king.isValid() || GetTeam(ChatColor.AQUA).GetSize() == 0) + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) { - if (_kingDamager != null) + if (team.GetPlayers(true).size() > 0) { - SetCustomWinLine(C.cRed + _kingDamager.getName() + C.cWhite + " slaughtered " + _kingName + ChatColor.RESET + "!"); - AddGems(_kingDamager, 20, "King Slayer", false, false); - - Bukkit.getPluginManager().callEvent(new KingSlaughterEvent(_kingDamager)); + teamsAlive.add(team); } - else - SetCustomWinLine(_kingName + ChatColor.RESET + " has died!"); + } - AnnounceEnd(GetTeam(ChatColor.RED)); - - for (GameTeam team : GetTeamList()) + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) { - if (WinnerTeam != null && team.equals(WinnerTeam)) + GameTeam winner = teamsAlive.get(0); + TeamKing king = _kings.get(winner); + TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); + AnnounceEnd(winner); + writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); + for (GameTeam team : GetTeamList()) { - for (Player player : team.GetPlayers(false)) + for (Player player : team.GetPlayers(true)) { - AddGems(player, 10, "Winning Team", false, false); + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + + if (GetKit(player) != null) + { + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } } } - - for (Player player : team.GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - } - - SetState(GameState.End); - } - } - - @EventHandler - public void TNTSpawn(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.SEC) - return; - - if (!UtilTime.elapsed(this.GetStateTime(), 20000)) - return; - - if (!UtilTime.elapsed(_tntSpawn, 25000)) - return; - - if (_tntSpawns.isEmpty()) - return; - - Location loc = _tntSpawns.get(UtilMath.r(_tntSpawns.size())); - - if (loc.getBlock().getTypeId() == 46) - return; - - loc.getBlock().setTypeId(46); - _tntSpawn = System.currentTimeMillis(); - } - - @EventHandler(priority = EventPriority.LOW) - public void TNTPickup(PlayerInteractEvent event) - { - if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_BLOCK) - return; - - if (event.getClickedBlock().getTypeId() != 46) - return; - - event.setCancelled(true); - - Player player = event.getPlayer(); - - if (!IsAlive(player)) - return; - - if (!GetTeam(ChatColor.RED).HasPlayer(player)) - return; - - if (_tntCarry.containsKey(player)) - return; - - event.getClickedBlock().setTypeId(0); - - FallingBlock tnt = player.getWorld().spawnFallingBlock(player.getEyeLocation(), 46, (byte) 0); - - player.eject(); - player.setPassenger(tnt); - - _tntCarry.put(player, tnt); - - UtilPlayer.message(player, F.main("Game", "You picked up " + F.skill("TNT") + ".")); - UtilPlayer.message(player, F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); - } - - @EventHandler(priority = EventPriority.NORMAL) - public void TNTUse(PlayerInteractEvent event) - { - if (event.isCancelled()) - return; - - if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) - return; - - Player player = event.getPlayer(); - - if (!_tntCarry.containsKey(player)) - return; - - event.setCancelled(true); - - for (Location loc : _tntSpawns) - { - if (UtilMath.offset(player.getLocation(), loc) < 16) - { - UtilPlayer.message(player, F.main("Game", "You cannot " + F.skill("Detonate") + " so far from the Castle.")); + SetState(GameState.End); return; } } - - _tntCarry.remove(player).remove(); - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); } - - @EventHandler(priority = EventPriority.LOWEST) - public void TNTDeath(PlayerDeathEvent event) + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) { - Player player = event.getEntity(); - - if (!_tntCarry.containsKey(player)) - return; - - //Remove the TNT - _tntCarry.get(player).remove(); - - //Flag for Removal - _tntCarryEnd.add(player); - - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void TNTDamageDivert(ProjectileHitEvent event) - { - Iterator playerIterator = _tntCarry.keySet().iterator(); - - while (playerIterator.hasNext()) + if (event.getType() != UpdateType.FAST) { - Player player = playerIterator.next(); - - if (player.getPassenger() == null) - continue; - - double dist = UtilMath.offset(player.getPassenger().getLocation(), event.getEntity().getLocation().add(event.getEntity().getVelocity())); - - if (dist < 2) + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) { - int damage = (int) (5 * (event.getEntity().getVelocity().length() / 3d)); - - //Damage Event - Manager.GetDamage().NewDamageEvent(player, (LivingEntity)event.getEntity().getShooter(), event.getEntity(), - DamageCause.CUSTOM, damage, true, false, false, - null, GetName()); - - event.getEntity().remove(); + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); } - - if (_tntCarryEnd.contains(player)) + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + TeamKing redKing = _kings.get(red); + TeamKing blueKing = _kings.get(blue); + redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); + if (redKing.isDead()) { - playerIterator.remove(); + AnnounceEnd(blue); + writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(redKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; } + blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); + if (blueKing.isDead()) + { + AnnounceEnd(red); + writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(blueKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + + _tntSpawner.update(); + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + _tntSpawner.onStart(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_KILLS"); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; } - _tntCarryEnd.clear(); + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } } + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + + if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) + { + crystal.destroy(); + AddGems(player, 40, "Crystal Destruction", false, true); + long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); + if (remaining > 0) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); + } + } + } + for (TeamKing king : _kings.values()) + { + if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) + { + king.handleDamage(player.getName(), 50); + } + } + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + if (_tntCarry.contains(shooter)) + { + return; + } + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (event.getEntity() instanceof EnderCrystal) + { + event.setCancelled(true); + return; + } + if (event.getEntity() instanceof Zombie) + { + event.setCancelled(true); + if (event instanceof EntityDamageByEntityEvent) + { + GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; + if (e.getDamager() instanceof Player) + { + Player p = (Player) e.getDamager(); + if (UtilPlayer.isSpectator(p)) + { + return; + } + if (owner.HasPlayer(p)) + { + return; + } + if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) + { + UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); + return; + } + TeamKing king = _kings.get(owner); + if (king.handleDamage(p.getName(), e.getDamage())) + { + for (Player alert : owner.GetPlayers(true)) + { + if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) + { + alert.sendMessage(king.getName(true) + " is under attack!"); + } + } + } + } + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + if (current == null || !current.hasItemMeta()) + { + return; + } + if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) + { + event.setCancelled(true); + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned()) + { + if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) + { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPickup(PlayerPickupItemEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) + { + event.setCancelled(true); + if (!_tntCarry.contains(event.getPlayer())) + { + _tntSpawner.pickup(); + _tntCarry.add(event.getPlayer()); + event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); + event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); + event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void TNTUse(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!_tntCarry.contains(player)) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + event.setCancelled(true); + + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + @EventHandler public void TNTExpire(UpdateEvent event) { - if (event.getType() != UpdateType.FASTER) + if (!IsLive()) + { return; + } + + if (event.getType() != UpdateType.FASTER) + { + return; + } - Iterator tntIterator = _tntCarry.keySet().iterator(); + Iterator tntIterator = _tntCarry.iterator(); while (tntIterator.hasNext()) { Player player = tntIterator.next(); - FallingBlock block = _tntCarry.get(player); - - if (player.isDead() || !block.isValid() || block.getTicksLived() > 1500) + + if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) { - player.eject(); - block.remove(); - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); tnt.setFuseTicks(0); - + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + tntIterator.remove(); continue; } - - //Firework + + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + } + } + + UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); } } - - @EventHandler - public void TNTWeakness(ExplosionPrimeEvent event) - { - Location weakness = null; - for (Location loc : _tntWeakness) - { - if (UtilMath.offset(loc, event.getEntity().getLocation()) < 4) - { - weakness = loc; - break; - } - } - - if (weakness == null) - return; - - _tntWeakness.remove(weakness); - - final Location extra = weakness; - - for (int i = 0; i < 10; i++) - { - Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() - { - public void run() - { - TNTPrimed tnt = extra.getWorld().spawn(extra.clone().add(3 - UtilMath.r(6), 5 + UtilMath.r(2), 3 - UtilMath.r(6)), TNTPrimed.class); - tnt.setFuseTicks(0); - tnt.setIsIncendiary(true); - } - }, i * 3); - } - - weakness.getWorld().playSound(weakness, Sound.EXPLODE, 16f, 0.8f); - } - - @EventHandler(priority = EventPriority.HIGH) - public void AttackerBlockBreak(org.bukkit.event.block.BlockBreakEvent event) - { - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - return; - - if (team.GetColor() != ChatColor.RED) - return; - - if (event.getBlock().getTypeId() == 85) - event.setCancelled(false); - } - - @EventHandler - public void DefenderBlockPlace(org.bukkit.event.block.BlockPlaceEvent event) - { - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - return; - - if (team.GetColor() != ChatColor.AQUA) - return; - - if (event.getBlock().getTypeId() != 85) - return; - - for (Block block : UtilBlock.getSurrounding(event.getBlock(), false)) - { - if (block.isLiquid()) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " in water.")); - } - } - - if (event.getBlockAgainst().getTypeId() == 85) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " on each other.")); - } - - if (_king != null && UtilMath.offset(_king.getLocation(), event.getBlock().getLocation().add(0.5, 0.5, 0.5)) < 4) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " near " + F.elem(C.cAqua + _kingName) + ".")); - } - } @EventHandler - public void DefenderBlockInteract(PlayerInteractEvent event) + public void onDeath(PlayerDeathEvent event) { - if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) - return; + Player player = event.getEntity(); - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) + _streakData.getOrDefault(player, new KillStreakData()).reset(); + + if (!_tntCarry.contains(player)) + { return; + } + + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } - if (team.GetColor() != ChatColor.AQUA) - return; - - if (event.getClickedBlock() == null || event.getClickedBlock().getTypeId() != 85) - return; - - UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, event.getClickedBlock().getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0, 1, - ViewDist.LONG, UtilServer.getPlayers()); - event.getClickedBlock().getWorld().playSound(event.getClickedBlock().getLocation(), Sound.NOTE_STICKS, 2f, 1f); - Manager.GetBlockRestore().add(event.getClickedBlock(), 0, (byte) 0, 1000); - } - @EventHandler - public void DayTimer(UpdateEvent event) + public void onBlockPlace(BlockPlaceEvent event) { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.TICK) - return; - - WorldTimeSet = (WorldTimeSet + 1); + if (_tntSpawner.canPlaceFireAt(event.getBlock())) + { + event.setCancelled(true); + } } - - @EventHandler - public void SnowDamage(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.FAST) - return; - - for (Player player : GetPlayers(true)) - if (player.getLocation().getBlock().getTypeId() == 78) - { - //Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.DROWNING, 2, false, true, false, - "Snow", "Snow Damage"); - - player.getWorld().playEffect(player.getLocation(), Effect.STEP_SOUND, 80); - } - } -} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java new file mode 100644 index 000000000..76e0d0f7c --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java @@ -0,0 +1,973 @@ +package nautilus.game.arcade.game.games.castlesiege; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Effect; +import org.bukkit.EntityEffect; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Style; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerGameRespawnEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanKnight; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanMarksman; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanPeasant; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadArcher; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadGhoul; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadZombie; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.NullKit; +import nautilus.game.arcade.stats.BloodThirstyStatTracker; +import nautilus.game.arcade.stats.KingDamageStatTracker; +import nautilus.game.arcade.stats.KingSlayerStatTracker; +import nautilus.game.arcade.stats.TeamDeathsStatTracker; +import nautilus.game.arcade.stats.TeamKillsStatTracker; +import nautilus.game.arcade.stats.WinAsTeamStatTracker; + +public class CastleSiegeClassic extends TeamGame +{ + public static class KingDamageEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } + + private final double _damage; + + public KingDamageEvent(Player who, double damage) + { + super(who); + + _damage = damage; + } + + public double getDamage() + { + return _damage; + } + } + + public static class KingSlaughterEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } + + public KingSlaughterEvent(Player who) + { + super(who); + } + } + + private ArrayList _lastScoreboard = new ArrayList(); + + private long _tntSpawn = 0; + private ArrayList _tntSpawns = new ArrayList(); + private ArrayList _tntWeakness = new ArrayList(); + + private HashMap _tntCarry = new HashMap(); + private HashSet _tntCarryEnd = new HashSet(); + + private ArrayList _kingLocs; + private Creature _king; + private Location _kingLoc; + private String _kingName; + private Player _kingDamager = null; + private int _kingHealth = 40; + + private ArrayList _peasantSpawns; + private ArrayList _horseSpawns; + + public CastleSiegeClassic(ArcadeManager manager) + { + super(manager, GameType.CastleSiege, + + new Kit[] + { + new KitHumanMarksman(manager), + new KitHumanKnight(manager), + //new KitHumanBrawler(manager), + //new KitHumanAssassin(manager), + new NullKit(manager), + new KitHumanPeasant(manager), + new NullKit(manager), + new KitUndeadGhoul(manager), + new KitUndeadArcher(manager), + new KitUndeadZombie(manager), + }, + + new String[] + { + F.elem(C.cAqua + "Defenders") + C.cWhite + " must defend the King.", + F.elem(C.cAqua + "Defenders") + C.cWhite + " win when the sun rises.", + F.elem(C.cAqua + "Defenders") + C.cWhite + " respawn as wolves.", + "", + F.elem(C.cRed + "Undead") + C.cWhite + " must kill the King.", + F.elem(C.cRed + "Undead") + C.cWhite + " lose when the sun rises.", + + }); + + _help = new String[] + { + "Marksmen are extremely important to defence!", + "It's recommended 50%+ of defence are Marksmen.", + "Use Barricades to block the Undeads path.", + "Use TNT to destroy weak points in walls.", + "Weak points are marked by cracked stone brick.", + "Undead can break fences with their axes.", + "Undead Archers must pick up arrows from the ground.", + + }; + + this.StrictAntiHack = true; + + this.HungerSet = 20; + this.DeathOut = false; + this.WorldTimeSet = 14000; //14000 + this.BlockPlaceAllow.add(85); + + _kingName = C.cYellow + C.Bold + "King Sparklez"; + + GameTeam notRedTeam = null; + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() != ChatColor.RED) + { + notRedTeam = team; + break; + } + } + + registerStatTrackers( + new KingSlayerStatTracker(this), + new BloodThirstyStatTracker(this), + new KingDamageStatTracker(this), + + new TeamDeathsStatTracker(this), + new TeamKillsStatTracker(this) + ); + + registerChatStats( + Kills, + Deaths, + KDRatio, + BlankLine, + Assists, + DamageDealt, + DamageTaken + ); + + registerChatStats(); + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + } + + @Override + public void ParseData() + { + _tntSpawns = WorldData.GetDataLocs("RED"); + _tntWeakness = WorldData.GetDataLocs("BLACK"); + + _kingLocs = WorldData.GetDataLocs("YELLOW"); + + _peasantSpawns = WorldData.GetDataLocs("GREEN"); + _horseSpawns = WorldData.GetDataLocs("BROWN"); + } + + @Override + public void RestrictKits() + { + for (Kit kit : GetKits()) + { + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() == ChatColor.RED) + { + if (kit.GetName().contains("Castle")) + team.GetRestrictedKits().add(kit); + + team.SetName("Undead"); + } + else + { + if (kit.GetName().contains("Undead")) + team.GetRestrictedKits().add(kit); + + team.SetRespawnTime(8); + + team.SetName("Defenders"); + } + } + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void registerTeamTracker(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Recruit) + { + GameTeam notRed = null; + + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() == ChatColor.RED) + continue; + + notRed = team; + break; + } + + if (notRed != null) + { + registerStatTrackers(new WinAsTeamStatTracker(this, notRed, "ForTheKing")); + System.out.println("Successfully registered For the King StatTrak"); + } + } + } + + @EventHandler + public void MoveKits(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + for (int i = 0; i < WorldData.GetDataLocs("PINK").size() && i < 3; i++) + { + if (GetKits().length <= 5 + i) + continue; + + this.CreatureAllowOverride = true; + Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("PINK").get(i)); + this.CreatureAllowOverride = false; + + Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("PINK").get(i)); + } + } + + @EventHandler + public void HorseSpawn(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + for (Location loc : _horseSpawns) + { + this.CreatureAllowOverride = true; + Horse horse = loc.getWorld().spawn(loc, Horse.class); + this.CreatureAllowOverride = false; + + horse.setAdult(); + horse.setAgeLock(true); + horse.setColor(org.bukkit.entity.Horse.Color.BLACK); + horse.setStyle(Style.BLACK_DOTS); + horse.setMaxDomestication(1); + horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); + horse.getInventory().setArmor(new ItemStack(Material.IRON_BARDING)); + + horse.setMaxHealth(60); + horse.setHealth(horse.getMaxHealth()); + + horse.setCustomName("War Horse"); + } + } + + @EventHandler + public void HorseInteract(PlayerInteractEntityEvent event) + { + if (!(event.getRightClicked() instanceof Horse)) + return; + + Player player = event.getPlayer(); + GameTeam team = GetTeam(player); + + if (team == null || team.GetColor() == ChatColor.RED || !IsAlive(player)) + { + event.setCancelled(true); + } + } + + @EventHandler + public void HorseDamageCancel(CustomDamageEvent event) + { + if (!(event.GetDamageeEntity() instanceof Horse)) + return; + + Player player = event.GetDamagerPlayer(true); + if (player == null) + return; + + if (!IsAlive(player)) + return; + + if (GetTeam(player) == null) + return; + + if (GetTeam(player).GetColor() == ChatColor.RED) + return; + + event.SetCancelled("Horse Team Damage"); + } + + @EventHandler(priority = EventPriority.HIGH) + public void GameStateChange(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + //Spawn King + this.CreatureAllowOverride = true; + + _kingLoc = _kingLocs.get(UtilMath.r(_kingLocs.size())); + + _king = (Creature) _kingLoc.getWorld().spawnEntity(_kingLoc, EntityType.ZOMBIE); + + _king.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + _king.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + _king.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + _king.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + _king.getEquipment().setItemInHand(new ItemStack(Material.DIAMOND_SWORD)); + + _king.setCustomName(_kingName); + _king.setCustomNameVisible(true); + + _king.setRemoveWhenFarAway(false); + + this.CreatureAllowOverride = false; + } + + @EventHandler(priority = EventPriority.HIGH) + public void SetDefenderRespawn(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + return; + + //Change to Peasant Spawns + this.GetTeam(ChatColor.AQUA).SetSpawns(_peasantSpawns); + } + + + @EventHandler + public void KingTarget(EntityTargetEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void KingDamage(CustomDamageEvent event) + { + if (_king == null || !_king.isValid()) + return; + + if (!event.GetDamageeEntity().equals(_king)) + return; + + event.SetCancelled("King Damage"); + + Player damager = event.GetDamagerPlayer(true); + if (damager == null) return; + + GameTeam team = GetTeam(damager); + + if (team != null && team.GetColor() == ChatColor.RED) + { + if (!Recharge.Instance.use(damager, "Damage King", 400, false, false)) + return; + + if (!IsAlive(damager)) + { + return; + } + + _king.playEffect(EntityEffect.HURT); + + _kingDamager = damager; + _kingHealth--; + + Bukkit.getPluginManager().callEvent(new KingDamageEvent(damager, 1)); + + if (_kingHealth < 0) + _kingHealth = 0; + + WriteScoreboard(); + + if (_kingHealth <= 0) + _king.damage(500); + + EndCheck(); + } + } + + @EventHandler + public void KingUpdate(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.SEC) + return; + + if (_king == null) + return; + + if (UtilMath.offset(_king.getLocation(), _kingLoc) > 6) + { + _king.teleport(_kingLoc); + } + else + { + UtilEnt.CreatureMove(_king, _kingLoc, 1f); + } + } + + @EventHandler + public void PlayerDeath(PlayerGameRespawnEvent event) + { + if (GetTeam(ChatColor.AQUA).HasPlayer(event.GetPlayer())) + SetKit(event.GetPlayer(), GetKits()[3], true); + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + WriteScoreboard(); + } + + public void WriteScoreboard() + { + //Get Values + HashMap _scoreGroup = new HashMap(); + _scoreGroup.put(C.cAqua + "Defenders", 0); + _scoreGroup.put(C.cDAqua + "Wolves", 0); + _scoreGroup.put(C.cRed + "Undead", 0); + + for (Player player : UtilServer.getPlayers()) + { + if (!IsAlive(player)) + continue; + + Kit kit = GetKit(player); + if (kit == null) continue; + + if (kit.GetName().contains("Castle")) + { + if (kit.GetName().contains("Wolf")) + { + _scoreGroup.put(C.cDAqua + "Wolves", 1 + _scoreGroup.get(C.cDAqua + "Wolves")); + } + else + { + _scoreGroup.put(C.cAqua + "Defenders", 1 + _scoreGroup.get(C.cAqua + "Defenders")); + } + } + else if (kit.GetName().contains("Undead")) + { + _scoreGroup.put(C.cRed + "Undead", 1 + _scoreGroup.get(C.cRed + "Undead")); + } + } + + //Wipe Last + Scoreboard.reset(); + + //Teams + for (String group : _scoreGroup.keySet()) + { + Scoreboard.writeNewLine(); + Scoreboard.write(group); + Scoreboard.write(ChatColor.getLastColors(group) + _scoreGroup.get(group) + " Players"); + } + + //King + if (_king != null && _king.isValid()) + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "King"); + Scoreboard.write(_kingHealth + " Health"); + } + + long timeLeft = 24000 - WorldTimeSet; + timeLeft = timeLeft / 20 * 1000; + + + if (timeLeft > 0) + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); + Scoreboard.write(UtilTime.MakeStr(timeLeft, 0)); + } + else + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); + Scoreboard.write("Undead Burning!"); + + for (Player player : GetTeam(ChatColor.RED).GetPlayers(true)) + Manager.GetCondition().Factory().Ignite("Sun Damage", player, player, 5, false, false); + } + + Scoreboard.draw(); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + return; + + if (this.WorldTimeSet > 24100 || GetTeam(ChatColor.RED).GetSize() == 0) + { + SetCustomWinLine(_kingName + ChatColor.RESET + " has survived the siege!"); + + AnnounceEnd(GetTeam(ChatColor.AQUA)); + + for (GameTeam team : GetTeamList()) + { + if (WinnerTeam != null && team.equals(WinnerTeam)) + { + for (Player player : team.GetPlayers(false)) + { + AddGems(player, 10, "Winning Team", false, false); + } + } + + for (Player player : team.GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); + } + + SetState(GameState.End); + } + + if (!_king.isValid() || GetTeam(ChatColor.AQUA).GetSize() == 0) + { + if (_kingDamager != null) + { + SetCustomWinLine(C.cRed + _kingDamager.getName() + C.cWhite + " slaughtered " + _kingName + ChatColor.RESET + "!"); + AddGems(_kingDamager, 20, "King Slayer", false, false); + + Bukkit.getPluginManager().callEvent(new KingSlaughterEvent(_kingDamager)); + } + else + SetCustomWinLine(_kingName + ChatColor.RESET + " has died!"); + + AnnounceEnd(GetTeam(ChatColor.RED)); + + for (GameTeam team : GetTeamList()) + { + if (WinnerTeam != null && team.equals(WinnerTeam)) + { + for (Player player : team.GetPlayers(false)) + { + AddGems(player, 10, "Winning Team", false, false); + } + } + + for (Player player : team.GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); + } + + SetState(GameState.End); + } + } + + @EventHandler + public void TNTSpawn(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.SEC) + return; + + if (!UtilTime.elapsed(this.GetStateTime(), 20000)) + return; + + if (!UtilTime.elapsed(_tntSpawn, 25000)) + return; + + if (_tntSpawns.isEmpty()) + return; + + Location loc = _tntSpawns.get(UtilMath.r(_tntSpawns.size())); + + if (loc.getBlock().getTypeId() == 46) + return; + + loc.getBlock().setTypeId(46); + _tntSpawn = System.currentTimeMillis(); + } + + @EventHandler(priority = EventPriority.LOW) + public void TNTPickup(PlayerInteractEvent event) + { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_BLOCK) + return; + + if (event.getClickedBlock().getTypeId() != 46) + return; + + event.setCancelled(true); + + Player player = event.getPlayer(); + + if (!IsAlive(player)) + return; + + if (!GetTeam(ChatColor.RED).HasPlayer(player)) + return; + + if (_tntCarry.containsKey(player)) + return; + + event.getClickedBlock().setTypeId(0); + + FallingBlock tnt = player.getWorld().spawnFallingBlock(player.getEyeLocation(), 46, (byte) 0); + + player.eject(); + player.setPassenger(tnt); + + _tntCarry.put(player, tnt); + + UtilPlayer.message(player, F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(player, F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void TNTUse(PlayerInteractEvent event) + { + if (event.isCancelled()) + return; + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) + return; + + Player player = event.getPlayer(); + + if (!_tntCarry.containsKey(player)) + return; + + event.setCancelled(true); + + for (Location loc : _tntSpawns) + { + if (UtilMath.offset(player.getLocation(), loc) < 16) + { + UtilPlayer.message(player, F.main("Game", "You cannot " + F.skill("Detonate") + " so far from the Castle.")); + return; + } + } + + _tntCarry.remove(player).remove(); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void TNTDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + if (!_tntCarry.containsKey(player)) + return; + + //Remove the TNT + _tntCarry.get(player).remove(); + + //Flag for Removal + _tntCarryEnd.add(player); + + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void TNTDamageDivert(ProjectileHitEvent event) + { + Iterator playerIterator = _tntCarry.keySet().iterator(); + + while (playerIterator.hasNext()) + { + Player player = playerIterator.next(); + + if (player.getPassenger() == null) + continue; + + double dist = UtilMath.offset(player.getPassenger().getLocation(), event.getEntity().getLocation().add(event.getEntity().getVelocity())); + + if (dist < 2) + { + int damage = (int) (5 * (event.getEntity().getVelocity().length() / 3d)); + + //Damage Event + Manager.GetDamage().NewDamageEvent(player, (LivingEntity)event.getEntity().getShooter(), event.getEntity(), + DamageCause.CUSTOM, damage, true, false, false, + null, GetName()); + + event.getEntity().remove(); + } + + if (_tntCarryEnd.contains(player)) + { + playerIterator.remove(); + } + } + + _tntCarryEnd.clear(); + } + + + @EventHandler + public void TNTExpire(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTER) + return; + + Iterator tntIterator = _tntCarry.keySet().iterator(); + + while (tntIterator.hasNext()) + { + Player player = tntIterator.next(); + FallingBlock block = _tntCarry.get(player); + + if (player.isDead() || !block.isValid() || block.getTicksLived() > 1500) + { + player.eject(); + block.remove(); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + tnt.setFuseTicks(0); + + tntIterator.remove(); + continue; + } + + //Firework + UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); + } + } + + @EventHandler + public void TNTWeakness(ExplosionPrimeEvent event) + { + Location weakness = null; + for (Location loc : _tntWeakness) + { + if (UtilMath.offset(loc, event.getEntity().getLocation()) < 4) + { + weakness = loc; + break; + } + } + + if (weakness == null) + return; + + _tntWeakness.remove(weakness); + + final Location extra = weakness; + + for (int i = 0; i < 10; i++) + { + Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() + { + public void run() + { + TNTPrimed tnt = extra.getWorld().spawn(extra.clone().add(3 - UtilMath.r(6), 5 + UtilMath.r(2), 3 - UtilMath.r(6)), TNTPrimed.class); + tnt.setFuseTicks(0); + tnt.setIsIncendiary(true); + } + }, i * 3); + } + + weakness.getWorld().playSound(weakness, Sound.EXPLODE, 16f, 0.8f); + } + + @EventHandler(priority = EventPriority.HIGH) + public void AttackerBlockBreak(org.bukkit.event.block.BlockBreakEvent event) + { + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.RED) + return; + + if (event.getBlock().getTypeId() == 85) + event.setCancelled(false); + } + + @EventHandler + public void DefenderBlockPlace(org.bukkit.event.block.BlockPlaceEvent event) + { + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.AQUA) + return; + + if (event.getBlock().getTypeId() != 85) + return; + + for (Block block : UtilBlock.getSurrounding(event.getBlock(), false)) + { + if (block.isLiquid()) + { + event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " in water.")); + } + } + + if (event.getBlockAgainst().getTypeId() == 85) + { + event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " on each other.")); + } + + if (_king != null && UtilMath.offset(_king.getLocation(), event.getBlock().getLocation().add(0.5, 0.5, 0.5)) < 4) + { + event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " near " + F.elem(C.cAqua + _kingName) + ".")); + } + } + + @EventHandler + public void DefenderBlockInteract(PlayerInteractEvent event) + { + if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) + return; + + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.AQUA) + return; + + if (event.getClickedBlock() == null || event.getClickedBlock().getTypeId() != 85) + return; + + UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, event.getClickedBlock().getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0, 1, + ViewDist.LONG, UtilServer.getPlayers()); + event.getClickedBlock().getWorld().playSound(event.getClickedBlock().getLocation(), Sound.NOTE_STICKS, 2f, 1f); + Manager.GetBlockRestore().add(event.getClickedBlock(), 0, (byte) 0, 1000); + } + + @EventHandler + public void DayTimer(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.TICK) + return; + + WorldTimeSet = (WorldTimeSet + 1); + } + + @EventHandler + public void SnowDamage(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.FAST) + return; + + for (Player player : GetPlayers(true)) + if (player.getLocation().getBlock().getTypeId() == 78) + { + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, + DamageCause.DROWNING, 2, false, true, false, + "Snow", "Snow Damage"); + + player.getWorld().playEffect(player.getLocation(), Effect.STEP_SOUND, 80); + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java index a87b6195a..f5c443c60 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java @@ -75,12 +75,12 @@ import nautilus.game.arcade.game.TeamGame; import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData; import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData.MedalLevel; +import nautilus.game.arcade.game.games.castlesiege.kits.KitArcher; +import nautilus.game.arcade.game.games.castlesiege.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castlesiege.kits.KitFighter; +import nautilus.game.arcade.game.games.castlesiege.kits.KitPlayer; +import nautilus.game.arcade.game.games.castlesiege.kits.KitTank; import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalType; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitFighter; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitPlayer; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java deleted file mode 100644 index fcd57e09b..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/ShockCastleSiege.java +++ /dev/null @@ -1,1445 +0,0 @@ -package nautilus.game.arcade.game.games.castlesiege; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.FireworkEffect.Type; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Chest; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.EnderCrystal; -import org.bukkit.entity.EnderPearl; -import org.bukkit.entity.Entity; -import org.bukkit.entity.ItemFrame; -import org.bukkit.entity.Painting; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockDispenseEvent; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.entity.ItemDespawnEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.inventory.PrepareItemCraftEvent; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerBucketFillEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Dispenser; -import org.bukkit.material.MaterialData; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.util.Vector; - -import mineplex.core.Managers; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextBottom; -import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.EnchantedBookBuilder; -import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.leaderboard.Leaderboard; -import mineplex.core.leaderboard.LeaderboardManager; -import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; -import mineplex.core.loot.ChestLoot; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.DeathMessageType; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.FirstBloodEvent; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.GemData; -import nautilus.game.arcade.game.TeamGame; -import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; -import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; -import nautilus.game.arcade.game.games.castlesiege.data.TeamCrystal; -import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitArcher; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitDemolitionist; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitFighter; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitPlayer; -import nautilus.game.arcade.game.games.castlesiege.shockkits.KitTank; -import nautilus.game.arcade.game.modules.compass.CompassModule; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; - -public class ShockCastleSiege extends TeamGame -{ - private static final int MAX_FLINT_AND_STEEL_USES = 4; - private static final int ITEMS_PER_CHEST = 5; - private static final long TIME_TILL_REFILL = 2 * 60 * 1000; - - private long _lastRefill; - - private ItemBuilder _flintAndSteel; - private ItemBuilder _wearableTnt; - - private Map _streakData = new WeakHashMap<>(); - private Map> _crystals = new HashMap<>(); - private Map _kings = new HashMap<>(); - private List _tntCarry = new ArrayList<>(); - - private List _chests = new ArrayList<>(); - - private ChestLoot _diamondGearCommon = new ChestLoot(true); - private ChestLoot _diamondGearRare = new ChestLoot(true); - private ChestLoot _weaponGearCommon = new ChestLoot(true); - private ChestLoot _weaponGearRare = new ChestLoot(true); - private ChestLoot _rangedGear = new ChestLoot(true); - private ChestLoot _rodsAndGaps = new ChestLoot(true); - private ChestLoot _potionGearCommon = new ChestLoot(true); - private ChestLoot _potionGearRare = new ChestLoot(true); - private ChestLoot _enchantGearCommon = new ChestLoot(true); - private ChestLoot _enchantGearRare = new ChestLoot(true); - private ChestLoot _miscGear = new ChestLoot(); - - private ObjectiveTNTSpawner _tntSpawner; - - private boolean _writeScoreboard = true; - - @SuppressWarnings("deprecation") - public ShockCastleSiege(ArcadeManager manager) - { - super(manager, GameType.CastleSiegeNew, - new Kit[] - { - //new KitAlchemist(manager), - new KitArcher(manager), - new KitDemolitionist(manager), - //new KitEnchanter(manager), - new KitFighter(manager), - //new KitHardline(manager), - //new KitNinja(manager), - new KitTank(manager) - }, - new String[] - { - "Destroy enemy sentry crystals with running TNT", - "After the enemy crystals are destroyed you must slay their king", - "First team to kill the enemy king wins", - "Chests refill every 2 minutes", - "TNT Respawns every 1 minute" - } - ); - - _help = new String[] - { - "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", - "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", - "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", - "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" - }; - - this.StrictAntiHack = true; - this.HungerSet = 20; - this.DeathOut = false; - this.DeathSpectateSecs = 5; - this.CreatureAllow = false; - this.DeathDropItems = false; - this.WorldWeatherEnabled = false; - this.AllowParticles = false; - this.SoupEnabled = false; - this.InventoryClick = true; - this.InventoryOpenChest = true; - this.InventoryOpenBlock = true; - this.ItemDrop = true; - this.ItemPickup = true; - this.AllowFlintAndSteel = true; - this.BlockPlaceAllow.add(Material.FIRE.getId()); - this.CrownsEnabled = true; - this.Leaderboards = true; - this.FirstKillReward = 20; - this.GemKillDeathRespawn = 1; - - new CompassModule() - .setGiveCompass(true) - .setGiveCompassToSpecs(true) - .setGiveCompassToAlive(false) - .register(this); - - _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); - _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); - generateLoot(); - - if (manager.IsRewardStats()) - { - if (manager.GetLobby() instanceof NewGameLobbyManager) - { - Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); - if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", new String[] {"Castle Siege New.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", new String[] {"Castle Siege New.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", new String[] {"Castle Siege New.Wins"}, LeaderboardSQLType.ALL, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", new String[] {"Castle Siege New.Kills"}, LeaderboardSQLType.ALL, loc, 10)); - } - } - } - } - - private void generateLoot() - { - { - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - } - { - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - } - { - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); - } - { - _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); - } - { - _rangedGear.addLoot(new ItemStack(Material.BOW), 3); - _rangedGear.addLoot(Material.ARROW, 3, 8, 16); - } - { - _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); - _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); - } - { - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); - } - { - _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); - _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); - } - { - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); - _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); - } - { - _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); - } - { - _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); - _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); - _miscGear.addLoot(_flintAndSteel.build(), 2); - _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); - } - } - - private void fillChest(Block block) - { - if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) - { - return; - } - Chest chest = (Chest) block.getState(); - - chest.getBlockInventory().clear(); - int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); - - for (int slot : slots) - { - double chance = UtilMath.random.nextDouble(); - double subChance = UtilMath.random.nextDouble(); - - ChestLoot loot = _miscGear; - if (chance <= 0.6) - { - loot = _rodsAndGaps; - } - if (chance <= 0.5) - { - loot = _potionGearCommon; - if (subChance <= 0.45) - { - loot = _potionGearRare; - } - } - if (chance <= 0.3) - { - loot = _rangedGear; - } - chest.getBlockInventory().setItem(slot, loot.getLoot()); - } - } - - public ItemStack getNewFlintAndSteel(boolean kitItem) - { - if (kitItem) - { - return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); - } - return _flintAndSteel.build(); - } - - public void writeScoreboard() - { - if (!_writeScoreboard) - { - return; - } - Scoreboard.reset(); - Scoreboard.write(C.cDRedB + GetName()); - Scoreboard.writeNewLine(); - Scoreboard.write(C.cGreenB + "Chest Refill"); - long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); - if (!IsLive()) - { - refillTime = TIME_TILL_REFILL; - } - Scoreboard.write(UtilTime.MakeStr(refillTime)); - Scoreboard.writeNewLine(); - Scoreboard.write(C.cGreenB + "TNT Spawn"); - long tntTime = _tntSpawner.getNextTNT(); - if (!IsLive()) - { - tntTime = 60000; - } - if (_tntSpawner.isSpawned()) - { - Scoreboard.write("Spawned"); - } - else - { - Scoreboard.write(UtilTime.MakeStr(tntTime)); - } - Scoreboard.writeNewLine(); - GameTeam red = GetTeam(ChatColor.RED); - long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); - GameTeam blue = GetTeam(ChatColor.AQUA); - long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); - if (redCrystals > 0) - { - Scoreboard.write(_kings.get(red).getName(true)); - Scoreboard.write(redCrystals + "/2 Crystals Active"); - } - else - { - Scoreboard.write(_kings.get(red).getName(true) + " Health"); - Scoreboard.write(_kings.get(red).getHealth() + ""); - } - Scoreboard.writeNewLine(); - if (blueCrystals > 0) - { - Scoreboard.write(_kings.get(blue).getName(true)); - Scoreboard.write(blueCrystals + "/2 Crystals Active"); - } - else - { - Scoreboard.write(_kings.get(blue).getName(true) + " Health"); - Scoreboard.write(_kings.get(blue).getHealth() + ""); - } - Scoreboard.draw(); - } - - public void writeFinalScoreboard(String deadKing, String winKing, String warrior) - { - _writeScoreboard = false; - Scoreboard.reset(); - Scoreboard.writeNewLine(); - Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); - Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); - Scoreboard.write(warrior + C.cWhite + "!"); - Scoreboard.writeNewLine(); - - Scoreboard.draw(); - } - - @Override - public void ParseData() - { - for (Location chestLoc : WorldData.GetDataLocs("BROWN")) - { - Block block = chestLoc.getBlock(); - block.setType(Material.CHEST); - fillChest(block); - _chests.add(block); - } - GameTeam red = GetTeam(ChatColor.RED); - GameTeam blue = GetTeam(ChatColor.AQUA); - Location redKing = WorldData.GetDataLocs("RED").get(0); - Location blueKing = WorldData.GetDataLocs("BLUE").get(0); - Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); - Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); - redKing.setPitch(UtilAlg.GetPitch(redBlue)); - redKing.setYaw(UtilAlg.GetYaw(redBlue)); - blueKing.setPitch(UtilAlg.GetPitch(blueRed)); - blueKing.setYaw(UtilAlg.GetYaw(blueRed)); - _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); - _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); - this.CreatureAllowOverride = true; - _kings.put(red, new TeamKing(red, "King Jon", redKing)); - _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); - int kitIndex = 0; - for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) - { - if (kitIndex >= GetKits().length) - { - kitIndex = 0; - } - Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); - Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); - kitIndex++; - } - this.CreatureAllowOverride = false; - _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); - } - - @Override - public void EndCheck() - { - if (!IsLive()) - { - return; - } - - List teamsAlive = new ArrayList<>(); - - for (GameTeam team : GetTeamList()) - { - if (team.GetPlayers(true).size() > 0) - { - teamsAlive.add(team); - } - } - - if (teamsAlive.size() <= 1) - { - //Announce - if (teamsAlive.size() > 0) - { - GameTeam winner = teamsAlive.get(0); - TeamKing king = _kings.get(winner); - TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); - AnnounceEnd(winner); - writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); - for (GameTeam team : GetTeamList()) - { - for (Player player : team.GetPlayers(true)) - { - if (team.GetColor() == winner.GetColor()) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak >= 2 && streak < 4) - { - AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 4 && streak < 6) - { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 6 && streak < 8) - { - AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 8) - { - AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); - } - } - - if (GetKit(player) != null) - { - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } - } - } - SetState(GameState.End); - return; - } - } - } - - @Override - @EventHandler - public void ScoreboardUpdate(UpdateEvent event) {}; - - @EventHandler - public void onUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - { - return; - } - if (IsLive()) - { - if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) - { - _lastRefill = System.currentTimeMillis(); - _chests.forEach(this::fillChest); - Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); - } - - GameTeam red = GetTeam(ChatColor.RED); - GameTeam blue = GetTeam(ChatColor.AQUA); - TeamKing redKing = _kings.get(red); - TeamKing blueKing = _kings.get(blue); - redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); - if (redKing.isDead()) - { - AnnounceEnd(blue); - writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); - for (GameTeam team : GetTeamList()) - { - for (Player player : team.GetPlayers(true)) - { - if (player.getName().equals(redKing.getLastDamager())) - { - AddGems(player, 20, "King Slayer", false, false); - } - if (team.GetColor() == ChatColor.AQUA) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) - { - AddGems(player, streak, streak + " Player Kill Streak", false, false); - } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } - } - SetState(GameState.End); - return; - } - blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); - if (blueKing.isDead()) - { - AnnounceEnd(red); - writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); - for (GameTeam team : GetTeamList()) - { - for (Player player : team.GetPlayers(true)) - { - if (player.getName().equals(blueKing.getLastDamager())) - { - AddGems(player, 20, "King Slayer", false, false); - } - if (team.GetColor() == ChatColor.RED) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) - { - AddGems(player, streak, streak + " Player Kill Streak", false, false); - } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } - } - SetState(GameState.End); - return; - } - - _tntSpawner.update(); - } - if (InProgress()) - { - writeScoreboard(); - } - } - - @EventHandler - public void onEditSettings(GameStateChangeEvent event) - { - if (event.GetGame() != this) - { - return; - } - - if (event.GetState() == GameState.Live) - { - _lastRefill = System.currentTimeMillis(); - _tntSpawner.onStart(); - Manager.GetDamage().SetEnabled(false); - Manager.GetExplosion().setEnabled(false); - Manager.GetCreature().SetDisableCustomDrops(true); - } - - if (event.GetState() == GameState.End) - { - Manager.GetDamage().SetEnabled(true); - Manager.GetExplosion().setEnabled(true); - Manager.GetCreature().SetDisableCustomDrops(false); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_KILLS"); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void handleDeath(CombatDeathEvent event) - { - if (!IsLive()) - { - return; - } - - event.SetBroadcastType(DeathMessageType.Detailed); - } - - @EventHandler - public void disableDamageLevel(CustomDamageEvent event) - { - event.SetDamageToLevel(false); - } - - @EventHandler - public void BlockFade(BlockFadeEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void BlockBurn(BlockBurnEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void BlockDecay(LeavesDecayEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void hangingBreak(HangingBreakEvent event) - { - if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) - { - event.setCancelled(true); - } - } - - @EventHandler - public void noFlow(BlockFromToEvent event) - { - if (!IsLive()) - { - return; - } - - Block block = event.getBlock(); - if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) - { - event.setCancelled(true); - } - if (event.getToBlock().getType() == Material.ICE) - { - event.setCancelled(true); - } - } - - @EventHandler - public void onBlockChange(BlockFormEvent e) - { - if (!IsLive()) - { - return; - } - if (e.getNewState().getType() == Material.ICE) - { - e.setCancelled(true); - } - } - - @SuppressWarnings("deprecation") - @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) - { - if (!IsLive()) - { - return; - } - - Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.WATER_BUCKET) - { - player.getItemInHand().setType(Material.BUCKET); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - return; - } - for (BlockFace bf : BlockFace.values()) - { - Block relative = block.getRelative(bf); - if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - } - else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) - { - event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - - @SuppressWarnings("deprecation") - @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketFillEvent event) - { - if (!IsLive()) - { - return; - } - - Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.LAVA_BUCKET) - { - event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - - @EventHandler(ignoreCancelled=true) - public void onBlockDispense(BlockDispenseEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getItem().getType() == Material.WATER_BUCKET) - { - Block dispenser = event.getBlock(); - - MaterialData mat = dispenser.getState().getData(); - Dispenser disp_mat = (Dispenser)mat; - BlockFace face = disp_mat.getFacing(); - Block block = dispenser.getRelative(face); - if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - return; - } - for (BlockFace bf : BlockFace.values()) - { - if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - } - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void onCombatDeath(CombatDeathEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.GetLog().GetKiller() == null) - { - return; - } - - if (!event.GetLog().GetKiller().IsPlayer()) - { - return; - } - - Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); - if (player == null) - { - return; - } - - AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); - - if (UtilPlayer.isSpectator(player)) - { - return; - } - - player.setLevel(player.getLevel() + 1); - player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); - KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); - boolean hardLine = GetKit(player).GetName().equals("Hardline"); - if (data.addKill(hardLine)) - { - AddStat(player, "KillStreak", 1, false, false); - ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); - } - if (UtilMath.isEven(data.getKills())) - { - Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); - } - } - - @EventHandler - public void TNTExplosion(ExplosionPrimeEvent event) - { - if (!event.getEntity().hasMetadata("THROWER")) - { - return; - } - float radius = event.getRadius(); - event.setRadius(0f); - - Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); - if (player == null) - { - return; - } - if (GetTeam(player) == null) - { - return; - } - if (GetKit(player).GetName().equals("Demolitionist")) - { - radius += 3; - } - - Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); - for (Player near : nearby.keySet()) - { - if (UtilPlayer.isSpectator(near)) - { - continue; - } - if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) - { - continue; - } - if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) - { - continue; - } - - double mult = nearby.get(near); - - int highestBlastProt = 0; - int blastProtEPF = 0; - for (ItemStack item : near.getInventory().getArmorContents()) - { - if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) - { - blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); - if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) - { - highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); - } - } - } - blastProtEPF = Math.min(blastProtEPF, 20); - - double damage = 8 * mult; - damage = damage * (1 - (blastProtEPF / 25)); - - double knockbackReduction = 1 - (highestBlastProt * 0.15); - - near.damage(damage, event.getEntity()); - UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); - } - - if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) - { - List crystals = new ArrayList<>(); - - for (List c : _crystals.values()) - { - crystals.addAll(c); - } - for (TeamCrystal crystal : crystals) - { - if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) - { - crystal.destroy(); - AddGems(player, 40, "Crystal Destruction", false, true); - long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); - if (remaining > 0) - { - Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); - } - else - { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); - } - } - } - for (TeamKing king : _kings.values()) - { - if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) - { - king.handleDamage(player.getName(), 50); - } - } - } - } - - @EventHandler - public void TNTThrow(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (!UtilEvent.isAction(event, ActionType.L)) - { - return; - } - - Player player = event.getPlayer(); - - if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) - { - return; - } - - if (!IsAlive(player)) - { - return; - } - - event.setCancelled(true); - - if (!Manager.GetGame().CanThrowTNT(player.getLocation())) - { - // Inform - UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); - return; - } - - UtilInv.remove(player, Material.TNT, (byte) 0, 1); - UtilInv.Update(player); - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); - - tnt.setFuseTicks(60); - - double throwMult = 1; - - if (GetKit(player).GetName().equals("Demolitionist")) - { - throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); - } - - UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); - - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - } - - @EventHandler - public void onLaunch(ProjectileHitEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) - { - Entity shooter = (Entity) event.getEntity().getShooter(); - if (_tntCarry.contains(shooter)) - { - return; - } - Location teleport = event.getEntity().getLocation(); - teleport.setPitch(shooter.getLocation().getPitch()); - teleport.setYaw(shooter.getLocation().getYaw()); - shooter.teleport(teleport); - } - if (event.getEntity() instanceof Arrow) - { - Manager.runSyncLater(event.getEntity()::remove, 1L); - } - } - - @EventHandler - public void onOpenChest(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) - { - if (UtilPlayer.isSpectator(event.getPlayer())) - { - event.setCancelled(true); - } - } - } - - @EventHandler(ignoreCancelled = true) - public void onDamage(EntityDamageEvent event) - { - if (!IsLive()) - { - return; - } - if (event.getEntity() instanceof EnderCrystal) - { - event.setCancelled(true); - return; - } - if (event.getEntity() instanceof Zombie) - { - event.setCancelled(true); - if (event instanceof EntityDamageByEntityEvent) - { - GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); - EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; - if (e.getDamager() instanceof Player) - { - Player p = (Player) e.getDamager(); - if (UtilPlayer.isSpectator(p)) - { - return; - } - if (owner.HasPlayer(p)) - { - return; - } - if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) - { - UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); - return; - } - TeamKing king = _kings.get(owner); - if (king.handleDamage(p.getName(), e.getDamage())) - { - for (Player alert : owner.GetPlayers(true)) - { - if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) - { - alert.sendMessage(king.getName(true) + " is under attack!"); - } - } - } - } - } - } - } - - @EventHandler - public void onDrop(PlayerDropItemEvent event) - { - if (!IsLive()) - { - return; - } - - ItemStack drop = event.getItemDrop().getItemStack(); - if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) - { - event.setCancelled(true); - return; - } - - event.getItemDrop().remove(); - } - - @EventHandler - public void craftItem(PrepareItemCraftEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) - { - event.getInventory().setResult(_flintAndSteel.build()); - } - } - - @EventHandler - public void onInvClick(InventoryClickEvent event) - { - if (!IsLive()) - { - return; - } - ItemStack current = event.getCurrentItem(); - if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) - { - current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); - } - if (current == null || !current.hasItemMeta()) - { - return; - } - if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) - { - event.setCancelled(true); - return; - } - if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) - { - if (current.getItemMeta().hasLore()) - { - for (String lore : current.getItemMeta().getLore()) - { - if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) - { - event.setCancelled(true); - break; - } - } - } - - } - } - - @EventHandler - public void onFirstBlood(FirstBloodEvent event) - { - if (!IsLive()) - { - return; - } - - AddStat(event.getPlayer(), "FirstBlood", 1, true, false); - } - - @EventHandler - public void onPearl(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (!UtilEvent.isAction(event, ActionType.R)) - { - return; - } - - if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) - { - Player player = (Player) event.getPlayer(); - if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) - { - event.setCancelled(true); - player.updateInventory(); - } - } - } - - @EventHandler - public void onItemDespawn(ItemDespawnEvent event) - { - if (!IsLive()) - { - return; - } - - if (_tntSpawner.isSpawned()) - { - if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) - { - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onPickup(PlayerPickupItemEvent event) - { - if (!IsLive()) - { - return; - } - - if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) - { - event.setCancelled(true); - if (!_tntCarry.contains(event.getPlayer())) - { - _tntSpawner.pickup(); - _tntCarry.add(event.getPlayer()); - event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); - event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); - event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); - UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); - UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); - } - } - } - - @EventHandler(ignoreCancelled = true) - public void TNTUse(PlayerInteractEvent event) - { - Player player = event.getPlayer(); - - if (!_tntCarry.contains(player)) - { - return; - } - - if (!UtilEvent.isAction(event, ActionType.R)) - { - return; - } - - event.setCancelled(true); - - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - _tntCarry.remove(player); - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); - } - - @EventHandler - public void TNTExpire(UpdateEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getType() != UpdateType.FASTER) - { - return; - } - - Iterator tntIterator = _tntCarry.iterator(); - - while (tntIterator.hasNext()) - { - Player player = tntIterator.next(); - - if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) - { - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - - if (!player.isDead()) - { - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - } - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - - tntIterator.remove(); - continue; - } - - List crystals = new ArrayList<>(); - - for (List c : _crystals.values()) - { - crystals.addAll(c); - } - for (TeamCrystal crystal : crystals) - { - if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) - { - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - - if (!player.isDead()) - { - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - } - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - - tntIterator.remove(); - } - } - - UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); - UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); - } - } - - @EventHandler - public void onDeath(PlayerDeathEvent event) - { - Player player = event.getEntity(); - - _streakData.getOrDefault(player, new KillStreakData()).reset(); - - if (!_tntCarry.contains(player)) - { - return; - } - - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - _tntCarry.remove(player); - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); - } - - @EventHandler - public void onBlockPlace(BlockPlaceEvent event) - { - if (_tntSpawner.canPlaceFireAt(event.getBlock())) - { - event.setCancelled(true); - } - } -} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java similarity index 90% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java index 6c4da8994..0adab2c1b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.KitAvailability; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java index ec8a3ddbc..e1387e91f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import mineplex.core.common.util.C; import mineplex.core.common.util.F; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java index fcd021465..d2687a1ea 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import org.bukkit.Material; import org.bukkit.entity.EntityType; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java index c1ec3e24f..a59843e3e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import mineplex.core.disguise.disguises.DisguiseWolf; import mineplex.core.itemstack.ItemStackFactory; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java similarity index 93% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java index 31db5ed38..035385d90 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.KitAvailability; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java index ebdefc25a..481b7249e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilInv; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java index 1c893a7a6..ec56ec3f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import mineplex.core.common.util.C; import mineplex.core.disguise.disguises.DisguisePigZombie; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java index 9d9eb4b75..f45fc539f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castlesiege.classickits; import mineplex.core.common.util.C; import mineplex.core.disguise.disguises.DisguiseZombie; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java index 31d0dec71..50c4f443d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitAlchemist.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java similarity index 98% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java index 4ae56308e..9638a2a60 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitArcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java index d69929bf1..67d2c8872 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitBuilder.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java similarity index 98% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java index 2a5731ee6..16588ff54 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitDemolitionist.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java index f25217ad6..d92d12c30 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitEnchanter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java similarity index 98% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java index c961311ed..abf6ad397 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitFighter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java similarity index 94% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java index e80e62e65..9154b7a45 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitHardline.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java index 20b712abb..898091c80 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitNinja.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java similarity index 88% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java index b270e8310..53cc7b7e1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -9,7 +9,7 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.game.games.castlesiege.ShockCastleSiege; +import nautilus.game.arcade.game.games.castlesiege.CastleSiege; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.ProgressingKit; @@ -32,9 +32,9 @@ public abstract class KitPlayer extends ProgressingKit public abstract void awardKillStreak(Player player, int streak); - protected ShockCastleSiege getGame() + protected CastleSiege getGame() { - return (ShockCastleSiege) Manager.GetGame(); + return (CastleSiege) Manager.GetGame(); } protected void giveRegeneration(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java similarity index 99% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java index cbd30bb10..3549ffb12 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitTank.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java index 83e9ec555..e3359c66d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/KitWorkman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java index 7ab56e1b3..8c9c84484 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/shockkits/PerkBloodlust.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.shockkits; +package nautilus.game.arcade.game.games.castlesiege.kits; import java.util.Map; import java.util.WeakHashMap; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java index c6df42427..82ea187e8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java @@ -11,7 +11,7 @@ import org.bukkit.event.EventPriority; import mineplex.core.common.util.UtilPlayer; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.kits.KitUndead; +import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndead; import nautilus.game.arcade.game.games.hideseek.kits.KitSeeker; public class BloodThirstyStatTracker extends StatTracker diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java index 5b84ac9af..bf5053000 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java @@ -10,20 +10,20 @@ import org.bukkit.event.EventPriority; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.CastleSiege; +import nautilus.game.arcade.game.games.castlesiege.CastleSiegeClassic; -public class KingDamageStatTracker extends StatTracker +public class KingDamageStatTracker extends StatTracker { private final Map _kingDamage = new HashMap<>(); private double _totalKingDamage = 0; - public KingDamageStatTracker(CastleSiege game) + public KingDamageStatTracker(CastleSiegeClassic game) { super(game); } @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void onKingDamage(CastleSiege.KingDamageEvent event) + public void onKingDamage(CastleSiegeClassic.KingDamageEvent event) { if (getGame().GetState() != Game.GameState.Live) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java index c229272e5..8f3e7f287 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java @@ -3,7 +3,7 @@ package nautilus.game.arcade.stats; import org.bukkit.event.EventHandler; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.CastleSiege; +import nautilus.game.arcade.game.games.castlesiege.CastleSiegeClassic; public class KingSlayerStatTracker extends StatTracker { @@ -13,7 +13,7 @@ public class KingSlayerStatTracker extends StatTracker } @EventHandler - public void onKingSlaughtered(CastleSiege.KingSlaughterEvent event) + public void onKingSlaughtered(CastleSiegeClassic.KingSlaughterEvent event) { if (getGame().GetState() != Game.GameState.Live) return; From 6ef7608f207e848a3c4f57f7694b44bea066b074 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 01:24:52 -0400 Subject: [PATCH 070/170] Fix incorrect repository method name --- .../src/mineplex/core/donation/crown/CrownRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java index 1a449f565..49fd9364d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java @@ -82,7 +82,7 @@ public class CrownRepository }); } - public void setGold(final Callback callback, final int accountId, final int crowns) + public void setCrowns(final Callback callback, final int accountId, final int crowns) { if (crowns < 0) { From 49aaaa5301c11ec119ba629d17432d7db882e83d Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 02:08:03 -0400 Subject: [PATCH 071/170] Leaderboard changes --- .../core/leaderboard/Leaderboard.java | 25 +++++++---- .../core/leaderboard/LeaderboardManager.java | 23 +++-------- .../leaderboard/LeaderboardRepository.java | 41 +++++++++---------- .../game/games/castlesiege/CastleSiege.java | 10 ++--- 4 files changed, 48 insertions(+), 51 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java index 047b0cf6d..29087eb56 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -1,6 +1,9 @@ package mineplex.core.leaderboard; +import java.util.LinkedHashMap; import java.util.LinkedList; +import java.util.Map; +import java.util.Map.Entry; import org.bukkit.Location; @@ -11,22 +14,23 @@ import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; public class Leaderboard { - private String _display; + private String _display, _statDisplay; private String[] _statIds; private int _size; private LeaderboardSQLType _type; private Location _loc; private Hologram _holo; - public Leaderboard(String display, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) + public Leaderboard(String display, String statDisplayName, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) { _display = display; + _statDisplay = statDisplayName; _statIds = statIds; _type = type; _size = size; _loc = displayLoc; - update(new LinkedList<>()); + update(new LinkedHashMap<>()); } public int getSize() @@ -44,12 +48,19 @@ public class Leaderboard return _type; } - public void update(LinkedList names) + public void update(Map names) { deconstruct(); - names.addFirst(C.cRed + " "); - names.addFirst(C.cAqua + _display); - _holo = new Hologram(Managers.get(LeaderboardManager.class).getHologramManager(), _loc, names.toArray(new String[names.size()])).start(); + LinkedList display = new LinkedList<>(); + display.add(C.cAqua + _display); + display.add(C.cRed + " "); + int place = 1; + for (Entry entry : names.entrySet()) + { + display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay); + place++; + } + _holo = new Hologram(Managers.get(LeaderboardManager.class).getHologramManager(), _loc, display.toArray(new String[display.size()])).start(); } public void deconstruct() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 9d50dd388..c9e66f1a8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -16,7 +16,6 @@ import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; import mineplex.core.hologram.HologramManager; -import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; public class LeaderboardManager extends MiniPlugin { @@ -49,23 +48,13 @@ public class LeaderboardManager extends MiniPlugin private void refreshBoards() { - int arrayLength = _leaderboards.size(); - Leaderboard[] boards = _leaderboards.values().toArray(new Leaderboard[arrayLength]); - List statIds = new ArrayList<>(); - int[] sizes = new int[arrayLength]; - LeaderboardSQLType[] types = new LeaderboardSQLType[arrayLength]; - for (int i = 0; i < arrayLength; i++) + List leaderboards = new ArrayList<>(); + leaderboards.addAll(_leaderboards.values()); + _repo.loadLeaderboards(_leaderboards.values(), boards -> { - statIds.add(boards[i].getStatIds()); - sizes[i] = boards[i].getSize(); - types[i] = boards[i].getType(); - } - - _repo.loadLeaderboards(statIds, sizes, types, nameArray -> - { - for (int i = 0; i < nameArray.length && i < boards.length; i++) + for (int i = 0; i < boards.length && i < leaderboards.size(); i++) { - boards[i].update(nameArray[i]); + leaderboards.get(i).update(boards[i]); } }); } @@ -97,7 +86,7 @@ public class LeaderboardManager extends MiniPlugin return; } _leaderboards.put(identifier, board); - _repo.loadLeaderboard(board.getStatIds(), board.getSize(), board.getType(), board::update); + _repo.loadLeaderboard(board, board::update); } public void unregisterLeaderboard(String boardIdentifier) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index a35e71649..188103c5a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -5,13 +5,13 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.LinkedList; -import java.util.List; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.function.Consumer; import org.bukkit.plugin.java.JavaPlugin; -import mineplex.core.common.util.C; import mineplex.core.common.util.UtilServer; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; @@ -42,19 +42,17 @@ public class LeaderboardRepository extends RepositoryBase }); } - public void loadLeaderboard(String[] statIds, int size, LeaderboardSQLType type, Consumer> leaderboard) + public void loadLeaderboard(Leaderboard board, Consumer> leaderboard) { UtilServer.runAsync(() -> { try (Connection c = getConnection()) { - LinkedList names = new LinkedList<>(); - ResultSet rs = type.getStatement(c, statIds, size).executeQuery(); - int place = 1; + Map names = new LinkedHashMap<>(); + ResultSet rs = board.getType().getStatement(c, board.getStatIds(), board.getSize()).executeQuery(); while (rs.next()) { - names.add(C.cGreen + "#" + place + " " + rs.getString(1) + C.cRed + " " + rs.getInt(2)); - place++; + names.put(rs.getString("name"), rs.getInt("value")); } UtilServer.runSync(() -> leaderboard.accept(names)); @@ -67,21 +65,22 @@ public class LeaderboardRepository extends RepositoryBase } @SuppressWarnings("unchecked") - public void loadLeaderboards(List statIdArray, int[] sizes, LeaderboardSQLType[] types, Consumer[]> leaderboard) + public void loadLeaderboards(Collection boards, Consumer[]> leaderboard) { UtilServer.runAsync(() -> { try (Connection c = getConnection()) { - LinkedList[] nameArray = new LinkedList[statIdArray.size()]; + Map[] leaderboards = new Map[boards.size()]; StringBuilder queryBuilder = new StringBuilder(); - for (int i = 0; i < statIdArray.size() && i < sizes.length && i < types.length; i++) { - String[] statIds = statIdArray.get(i); - int size = sizes[i]; - LeaderboardSQLType type = types[i]; - queryBuilder.append(type.getMultiStatement(statIds, size)); - nameArray[i] = new LinkedList<>(); + int i = 0; + for (Leaderboard board : boards) + { + queryBuilder.append(board.getType().getMultiStatement(board.getStatIds(), board.getSize())); + leaderboards[i] = new LinkedHashMap<>(); + i++; + } } if (queryBuilder.length() > 0) @@ -89,14 +88,12 @@ public class LeaderboardRepository extends RepositoryBase Statement s = c.createStatement(); s.execute(queryBuilder.toString()); - for (int i = 0; i < nameArray.length; i++) + for (int i = 0; i < boards.size(); i++) { ResultSet rs = s.getResultSet(); - int place = 1; while (rs.next()) { - nameArray[i].add(C.cGreen + "#" + place + " " + rs.getString(1) + C.cRed + " " + rs.getInt(2)); - place++; + leaderboards[i].put(rs.getString("name"), rs.getInt("value")); } if (!s.getMoreResults()) @@ -106,7 +103,7 @@ public class LeaderboardRepository extends RepositoryBase } } - UtilServer.runSync(() -> leaderboard.accept(nameArray)); + UtilServer.runSync(() -> leaderboard.accept(leaderboards)); } catch (SQLException ex) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java index f17e43398..e4e1f4620 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java @@ -143,7 +143,7 @@ public class CastleSiege extends TeamGame @SuppressWarnings("deprecation") public CastleSiege(ArcadeManager manager) { - super(manager, GameType.CastleSiegeNew, + super(manager, GameType.CastleSiege, new Kit[] { //new KitAlchemist(manager), @@ -212,22 +212,22 @@ public class CastleSiege extends TeamGame if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", "Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", "Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_WINS")) { Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", "Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.ALL, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", "Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.ALL, loc, 10)); } } } From 452eaeeba98d6546699d89315fd90f71333cf672 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 02:08:45 -0400 Subject: [PATCH 072/170] Fix incorrect GameType association with TDM --- .../game/arcade/game/games/castlesiege/CastleSiegeTDM.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java index f5c443c60..50e9a7d65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java @@ -118,7 +118,7 @@ public class CastleSiegeTDM extends TeamGame @SuppressWarnings("deprecation") public CastleSiegeTDM(ArcadeManager manager) { - super(manager, GameType.CastleSiegeNew, + super(manager, GameType.CastleSiegeTDM, new Kit[] { //new KitAlchemist(manager), From d13610251fac994f8d11f762c1a4cb35c6793942 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 17:05:30 -0400 Subject: [PATCH 073/170] Rename Castle Siege 2.0 to Castle Assault and re-implement the old game --- .../core/achievement/Achievement.java | 80 +- .../core/achievement/AchievementCategory.java | 11 +- .../src/mineplex/core/game/GameDisplay.java | 5 +- .../core/leaderboard/Leaderboard.java | 17 +- .../preferences/ui/PreferenceMainMenu.java | 2 +- .../src/nautilus/game/arcade/GameType.java | 6 +- .../games/castleassault/CastleAssault.java | 1446 +++++++++++ .../CastleAssaultTDM.java} | 26 +- .../data/CapturePoint.java | 140 +- .../data/KillStreakData.java | 92 +- .../data/ObjectiveTNTSpawner.java | 195 +- .../data/TeamCrystal.java | 106 +- .../data/TeamKing.java | 242 +- .../data/medals/MedalData.java | 2 +- .../data/medals/MedalType.java | 2 +- .../kits/KitAlchemist.java | 2 +- .../kits/KitArcher.java | 10 +- .../kits/KitBuilder.java | 2 +- .../kits/KitDemolitionist.java | 2 +- .../kits/KitEnchanter.java | 2 +- .../kits/KitFighter.java | 2 +- .../kits/KitHardline.java | 2 +- .../kits/KitNinja.java | 2 +- .../kits/KitPlayer.java | 8 +- .../kits/KitTank.java | 2 +- .../kits/KitWorkman.java | 2 +- .../kits/PerkBloodlust.java | 2 +- .../game/games/castlesiege/CastleSiege.java | 2116 +++++++---------- .../games/castlesiege/CastleSiegeClassic.java | 973 -------- .../{classickits => kits}/KitHuman.java | 2 +- .../{classickits => kits}/KitHumanKnight.java | 2 +- .../KitHumanMarksman.java | 2 +- .../KitHumanPeasant.java | 2 +- .../{classickits => kits}/KitUndead.java | 2 +- .../KitUndeadArcher.java | 2 +- .../{classickits => kits}/KitUndeadGhoul.java | 2 +- .../KitUndeadZombie.java | 2 +- .../arcade/stats/BloodThirstyStatTracker.java | 2 +- .../arcade/stats/KingDamageStatTracker.java | 8 +- .../arcade/stats/KingSlayerStatTracker.java | 4 +- 40 files changed, 2783 insertions(+), 2746 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege/CastleSiegeTDM.java => castleassault/CastleAssaultTDM.java} (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/CapturePoint.java (90%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/KillStreakData.java (85%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/ObjectiveTNTSpawner.java (87%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/TeamCrystal.java (89%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/TeamKing.java (93%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/medals/MedalData.java (93%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/data/medals/MedalType.java (78%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitAlchemist.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitArcher.java (91%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitBuilder.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitDemolitionist.java (98%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitEnchanter.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitFighter.java (99%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitHardline.java (94%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitNinja.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitPlayer.java (88%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitTank.java (99%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/KitWorkman.java (95%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/{castlesiege => castleassault}/kits/PerkBloodlust.java (97%) delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitHuman.java (90%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitHumanKnight.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitHumanMarksman.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitHumanPeasant.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitUndead.java (93%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitUndeadArcher.java (97%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitUndeadGhoul.java (96%) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/{classickits => kits}/KitUndeadZombie.java (96%) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index ff7e2344b..17b03158f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -373,79 +373,95 @@ public enum Achievement new String[]{"Win 30 games of Master Builders"}, new int[]{30}, AchievementCategory.MASTER_BUILDERS), - + //Castle Siege - CASTLE_SIEGE_KILL_STREAK("Kill Streak", 0, - new String[]{"Castle Siege.KillStreak", "Castle Siege TDM.KillStreak"}, + CASTLE_SIEGE_WINS("FOR THE KING!", 600, + new String[]{"Castle Siege.ForTheKing"}, + new String[]{"Win as Defenders 50 times"}, + new int[]{50}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_KINGSLAYER("Kingslayer", 800, + new String[]{"Castle Siege.KingSlayer"}, + new String[]{"Get the killing blow on the King"}, + new int[]{1}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_BLOOD_THIRSTY("Blood Thirsty", 1200, + new String[]{"Castle Siege.BloodThirsty"}, + new String[]{"Kill 50 Undead in a single game"}, + new int[]{1}, + AchievementCategory.CASTLE_SIEGE), + + CASTLE_SIEGE_ASSASSIN("Assassin", 1000, + new String[]{"Castle Siege.Assassin"}, + new String[]{"Do 50% or more of the damage to the king"}, + new int[]{1}, + AchievementCategory.CASTLE_SIEGE), + + //Castle Assault + CASTLE_ASSAULT_KILL_STREAK("Kill Streak", 0, + new String[]{"Castle Assault.KillStreak", "Castle Assault TDM.KillStreak"}, new String[]{"Earn Kill Streak Rewards"}, new int[][]{new int[]{0, 50, 500}, new int[]{0, 100, 750}, new int[]{0, 150, 1000}, new int[]{0, 200, 1500}, new int[]{0, 400, 2000}, new int[]{0, 500, 2500}, new int[]{0, 1000, 3000}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4000}, new int[]{0, 5000, 100000}}, new int[]{10, 20, 50, 100, 200, 250, 500, 750, 1000, 2000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_FIRST_BLOOD("First Blood", 0, - new String[]{"Castle Siege.FirstBlood", "Castle Siege TDM.FirstBlood"}, + CASTLE_ASSAULT_FIRST_BLOOD("First Blood", 0, + new String[]{"Castle Assault.FirstBlood", "Castle Assault TDM.FirstBlood"}, new String[]{"Obtain the first kill in a Match"}, new int[][]{new int[]{0, 100, 100}, new int[]{0, 150, 200}, new int[]{0, 200, 300}, new int[]{0, 250, 400}, new int[]{0, 500, 500}}, new int[]{2, 5, 10, 25, 50}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_FIGHTER_KIT("Fighter", 0, - new String[]{"Castle Siege.FighterKitKills", "Castle Siege TDM.FighterKitKills"}, + CASTLE_ASSAULT_FIGHTER_KIT("Fighter", 0, + new String[]{"Castle Assault.FighterKitKills", "Castle Assault TDM.FighterKitKills"}, new String[]{"Kill opponents while wearing the Fighter Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_TANK_KIT("Tank", 0, - new String[]{"Castle Siege.TankKitKills", "Castle Siege TDM.TankKitKills"}, + CASTLE_ASSAULT_TANK_KIT("Tank", 0, + new String[]{"Castle Assault.TankKitKills", "Castle Assault TDM.TankKitKills"}, new String[]{"Kill opponents while wearing the Tank Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_ARCHER_KIT("Archer", 0, - new String[]{"Castle Siege.ArcherKitKills", "Castle Siege TDM.ArcherKitKills"}, + CASTLE_ASSAULT_ARCHER_KIT("Archer", 0, + new String[]{"Castle Assault.ArcherKitKills", "Castle Assault TDM.ArcherKitKills"}, new String[]{"Kill opponents while wearing the Archer Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_DEMOLITIONIST_KIT("Demolitionist", 0, - new String[]{"Castle Siege.DemolitionistKitKills", "Castle Siege TDM.DemolitionistKitKills"}, + CASTLE_ASSAULT_DEMOLITIONIST_KIT("Demolitionist", 0, + new String[]{"Castle Assault.DemolitionistKitKills", "Castle Assault TDM.DemolitionistKitKills"}, new String[]{"Kill opponents while wearing the Demolitionist Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), - CASTLE_SIEGE_WINNER("Siege", 0, - new String[]{"Castle Siege.Wins", "Castle Siege TDM.Wins"}, - new String[]{"Win games of Castle Siege"}, + CASTLE_ASSAULT_WINNER("Assault", 0, + new String[]{"Castle Assault.Wins", "Castle Assault TDM.Wins"}, + new String[]{"Win games of Castle Assault"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{2, 5, 25, 50, 100, 150, 250, 500, 1000, 2000}, "Novice I", new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), - - CASTLE_SIEGE_MEDALIST("Medalist", 0, - new String[]{"Castle Siege.MedalsEarned", "Castle Siege TDM.MedalsEarned"}, - new String[]{"Earn Bronze, Silver, or Gold Medals in Castle Siege Matches"}, - new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, - new int[]{2, 50, 150, 250, 500, 1000, 1500, 2500, 5000, 10000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, - AchievementCategory.CASTLE_SIEGE), + AchievementCategory.CASTLE_ASSAULT), //Champions CHAMPIONS_WINS("Champion", 600, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 63cdf68c0..3a2d752df 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -84,10 +84,15 @@ public enum AchievementCategory WIZARDS("Wizards", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, Material.BLAZE_ROD, 0, GameCategory.SURVIVAL, "Witch Doctor Kit", false, GameDisplay.Wizards.getGameId()), - - CASTLE_SIEGE("Castle Siege", new String[] {"Castle Siege", "Castle Siege TDM"}, + + CASTLE_ASSAULT("Castle Assault", new String[] {"Castle Assault", "Castle Assault TDM"}, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.CROWNS_EARNED }, - Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiege.getGameId(), GameDisplay.CastleSiegeTDM.getGameId()), + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleAssault.getGameId(), GameDisplay.CastleAssaultTDM.getGameId()), + + CASTLE_SIEGE("Castle Siege", null, + new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, new StatDisplay("Kills as Defenders"), new StatDisplay("Deaths as Defenders"), + new StatDisplay("Kills as Undead"), new StatDisplay("Deaths as Undead"), StatDisplay.GEMS_EARNED }, + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleSiege.getGameId()), BAWK_BAWK_BATTLES("Bawk Bawk Battles", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index 5a63e6100..8de5d53a7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -14,8 +14,9 @@ public enum GameDisplay Barbarians("A Barbarians Life", Material.WOOD_AXE, (byte)0, GameCategory.EXTRA, 2, false), BossBattles("Boss Battles", Material.SKULL_ITEM, (byte) 0, GameCategory.EVENT, 55, false), Bridge("The Bridges", Material.IRON_PICKAXE, (byte)0, GameCategory.SURVIVAL, 3, true), - CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), - CastleSiegeTDM("Castle Siege TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, false), + CastleAssault("Castle Assault", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), + CastleAssaultTDM("Castle Assault TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, false), + CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 4, true), ChampionsDominate("Champions Domination", "Champions", Material.BEACON, (byte)0, GameCategory.CHAMPIONS, 6, true), ChampionsTDM("Champions TDM", "Champions", Material.GOLD_SWORD, (byte)0, GameCategory.CHAMPIONS, 5, true), Christmas("Christmas Chaos", Material.SNOW_BALL, (byte)0, GameCategory.CLASSICS, 8, false), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java index 29087eb56..7b717f6ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -8,23 +8,25 @@ import java.util.Map.Entry; import org.bukkit.Location; import mineplex.core.Managers; +import mineplex.core.common.Pair; import mineplex.core.common.util.C; import mineplex.core.hologram.Hologram; import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; public class Leaderboard { - private String _display, _statDisplay; + private String _display; + private Pair _statDisplay; private String[] _statIds; private int _size; private LeaderboardSQLType _type; private Location _loc; private Hologram _holo; - public Leaderboard(String display, String statDisplayName, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) + public Leaderboard(String display, Pair statDisplayNames, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) { _display = display; - _statDisplay = statDisplayName; + _statDisplay = statDisplayNames; _statIds = statIds; _type = type; _size = size; @@ -57,7 +59,14 @@ public class Leaderboard int place = 1; for (Entry entry : names.entrySet()) { - display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay); + if (entry.getValue() == 1) + { + display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay.getLeft()); + } + else + { + display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay.getRight()); + } place++; } _holo = new Hologram(Managers.get(LeaderboardManager.class).getHologramManager(), _loc, display.toArray(new String[display.size()])).start(); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java index ab07a6d8f..d8ee17525 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java @@ -30,7 +30,7 @@ public class PreferenceMainMenu extends Menu protected Button[] setUp(Player player) { Rank rank = getPlugin().getClientManager().Get(player).GetRank(); - boolean exclusive = rank.has(Rank.HELPER) || rank == Rank.YOUTUBE_SMALL || rank == Rank.YOUTUBE || rank == Rank.TWITCH; + boolean exclusive = rank.has(Rank.MAPDEV) || rank == Rank.YOUTUBE_SMALL || rank == Rank.YOUTUBE || rank == Rank.TWITCH; Button[] buttons = new Button[exclusive ? INV_SIZE_MAX : INV_SIZE_MIN]; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 76e5c38bf..dd64be771 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -24,7 +24,8 @@ import nautilus.game.arcade.game.games.build.modes.DukesOfDecoration; import nautilus.game.arcade.game.games.build.modes.TeamBuild; import nautilus.game.arcade.game.games.buildmavericks.BuildMavericks; import nautilus.game.arcade.game.games.cards.Cards; -import nautilus.game.arcade.game.games.castlesiege.CastleSiegeTDM; +import nautilus.game.arcade.game.games.castleassault.CastleAssault; +import nautilus.game.arcade.game.games.castleassault.CastleAssaultTDM; import nautilus.game.arcade.game.games.castlesiege.CastleSiege; import nautilus.game.arcade.game.games.champions.ChampionsCTF; import nautilus.game.arcade.game.games.champions.ChampionsDominate; @@ -130,8 +131,9 @@ public enum GameType Basketball(Basketball.class, GameDisplay.Basketball), BossBattles(BossBattles.class, GameDisplay.BossBattles), Bridge(Bridge.class, GameDisplay.Bridge), + CastleAssault(CastleAssault.class, GameDisplay.CastleAssault), + CastleAssaultTDM(CastleAssaultTDM.class, GameDisplay.CastleAssaultTDM), CastleSiege(CastleSiege.class, GameDisplay.CastleSiege), - CastleSiegeTDM(CastleSiegeTDM.class, GameDisplay.CastleSiegeTDM), ChampionsCTF(ChampionsCTF.class, GameDisplay.ChampionsCTF), ChampionsDominate(ChampionsDominate.class, GameDisplay.ChampionsDominate), ChampionsTDM(ChampionsTDM.class, GameDisplay.ChampionsTDM), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java new file mode 100644 index 000000000..d327f19d4 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -0,0 +1,1446 @@ +package nautilus.game.arcade.game.games.castleassault; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.util.Vector; + +import mineplex.core.Managers; +import mineplex.core.common.Pair; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextBottom; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.loot.ChestLoot; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castleassault.data.KillStreakData; +import nautilus.game.arcade.game.games.castleassault.data.ObjectiveTNTSpawner; +import nautilus.game.arcade.game.games.castleassault.data.TeamCrystal; +import nautilus.game.arcade.game.games.castleassault.data.TeamKing; +import nautilus.game.arcade.game.games.castleassault.kits.KitArcher; +import nautilus.game.arcade.game.games.castleassault.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castleassault.kits.KitFighter; +import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; +import nautilus.game.arcade.game.games.castleassault.kits.KitTank; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; + +public class CastleAssault extends TeamGame +{ + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + private ItemBuilder _wearableTnt; + + private Map _streakData = new WeakHashMap<>(); + private Map> _crystals = new HashMap<>(); + private Map _kings = new HashMap<>(); + private List _tntCarry = new ArrayList<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _diamondGearCommon = new ChestLoot(true); + private ChestLoot _diamondGearRare = new ChestLoot(true); + private ChestLoot _weaponGearCommon = new ChestLoot(true); + private ChestLoot _weaponGearRare = new ChestLoot(true); + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + private ChestLoot _enchantGearCommon = new ChestLoot(true); + private ChestLoot _enchantGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private ObjectiveTNTSpawner _tntSpawner; + + private boolean _writeScoreboard = true; + + @SuppressWarnings("deprecation") + public CastleAssault(ArcadeManager manager) + { + super(manager, GameType.CastleAssault, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] + { + "Destroy enemy sentry crystals with running TNT", + "After the crystals are destroyed you must slay their king", + "First team to kill the enemy king wins", + "Chests refill every 2 minutes", + "TNT Respawns every 1 minute" + } + ); + + _help = new String[] + { + "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", + "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; + + this.StrictAntiHack = true; + this.HungerSet = 20; + this.DeathOut = false; + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.Leaderboards = true; + this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); + generateLoot(); + + if (manager.IsRewardStats()) + { + if (manager.GetLobby() instanceof NewGameLobbyManager) + { + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + } + } + } + } + + private void generateLoot() + { + { + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); + _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); + } + { + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); + } + { + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); + _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); + } + { + _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); + } + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + { + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); + _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); + _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); + } + { + _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); + } + } + + private void fillChest(Block block) + { + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) + { + return; + } + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) + { + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); + + ChestLoot loot = _miscGear; + if (chance <= 0.6) + { + loot = _rodsAndGaps; + } + if (chance <= 0.5) + { + loot = _potionGearCommon; + if (subChance <= 0.45) + { + loot = _potionGearRare; + } + } + if (chance <= 0.3) + { + loot = _rangedGear; + } + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; + } + Scoreboard.reset(); + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) + { + refillTime = TIME_TILL_REFILL; + } + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "TNT Spawn"); + long tntTime = _tntSpawner.getNextTNT(); + if (!IsLive()) + { + tntTime = 60000; + } + if (_tntSpawner.isSpawned()) + { + Scoreboard.write("Spawned"); + } + else + { + Scoreboard.write(UtilTime.MakeStr(tntTime)); + } + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); + GameTeam blue = GetTeam(ChatColor.AQUA); + long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); + if (redCrystals > 0) + { + Scoreboard.write(_kings.get(red).getName(true)); + Scoreboard.write(redCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(red).getName(true) + " Health"); + Scoreboard.write(_kings.get(red).getHealth() + ""); + } + Scoreboard.writeNewLine(); + if (blueCrystals > 0) + { + Scoreboard.write(_kings.get(blue).getName(true)); + Scoreboard.write(blueCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(blue).getName(true) + " Health"); + Scoreboard.write(_kings.get(blue).getHealth() + ""); + } + Scoreboard.draw(); + } + + public void writeFinalScoreboard(String deadKing, String winKing, String warrior) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); + Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); + Scoreboard.write(warrior + C.cWhite + "!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Location redKing = WorldData.GetDataLocs("RED").get(0); + Location blueKing = WorldData.GetDataLocs("BLUE").get(0); + Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); + Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); + redKing.setPitch(UtilAlg.GetPitch(redBlue)); + redKing.setYaw(UtilAlg.GetYaw(redBlue)); + blueKing.setPitch(UtilAlg.GetPitch(blueRed)); + blueKing.setYaw(UtilAlg.GetYaw(blueRed)); + _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); + _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); + this.CreatureAllowOverride = true; + _kings.put(red, new TeamKing(red, "King Jon", redKing)); + _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); + int kitIndex = 0; + for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + { + if (kitIndex >= GetKits().length) + { + kitIndex = 0; + } + Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); + Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); + kitIndex++; + } + this.CreatureAllowOverride = false; + _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) + { + if (team.GetPlayers(true).size() > 0) + { + teamsAlive.add(team); + } + } + + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) + { + GameTeam winner = teamsAlive.get(0); + TeamKing king = _kings.get(winner); + TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); + AnnounceEnd(winner); + writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + + if (GetKit(player) != null) + { + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + { + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + } + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + TeamKing redKing = _kings.get(red); + TeamKing blueKing = _kings.get(blue); + redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); + if (redKing.isDead()) + { + AnnounceEnd(blue); + writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(redKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); + if (blueKing.isDead()) + { + AnnounceEnd(red); + writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(blueKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak > 0) + { + AddGems(player, streak, streak + " Player Kill Streak", false, false); + } + + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) + { + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); + } + } + } + SetState(GameState.End); + return; + } + + _tntSpawner.update(); + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + _tntSpawner.onStart(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_KILLS"); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + + if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) + { + crystal.destroy(); + AddGems(player, 40, "Crystal Destruction", false, true); + long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); + if (remaining > 0) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); + } + } + } + for (TeamKing king : _kings.values()) + { + if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) + { + king.handleDamage(player.getName(), 50); + } + } + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + if (_tntCarry.contains(shooter)) + { + return; + } + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (event.getEntity() instanceof EnderCrystal) + { + event.setCancelled(true); + return; + } + if (event.getEntity() instanceof Zombie) + { + event.setCancelled(true); + if (event instanceof EntityDamageByEntityEvent) + { + GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; + if (e.getDamager() instanceof Player) + { + Player p = (Player) e.getDamager(); + if (UtilPlayer.isSpectator(p)) + { + return; + } + if (owner.HasPlayer(p)) + { + return; + } + if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) + { + UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); + return; + } + TeamKing king = _kings.get(owner); + if (king.handleDamage(p.getName(), e.getDamage())) + { + for (Player alert : owner.GetPlayers(true)) + { + if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) + { + alert.sendMessage(king.getName(true) + " is under attack!"); + } + } + } + } + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + if (current == null || !current.hasItemMeta()) + { + return; + } + if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) + { + event.setCancelled(true); + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned()) + { + if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) + { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPickup(PlayerPickupItemEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) + { + event.setCancelled(true); + if (!_tntCarry.contains(event.getPlayer())) + { + _tntSpawner.pickup(); + _tntCarry.add(event.getPlayer()); + event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); + event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); + event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void TNTUse(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!_tntCarry.contains(player)) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + event.setCancelled(true); + + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler + public void TNTExpire(UpdateEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getType() != UpdateType.FASTER) + { + return; + } + + Iterator tntIterator = _tntCarry.iterator(); + + while (tntIterator.hasNext()) + { + Player player = tntIterator.next(); + + if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + continue; + } + + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + } + } + + UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); + UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + _streakData.getOrDefault(player, new KillStreakData()).reset(); + + if (!_tntCarry.contains(player)) + { + return; + } + + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) + { + if (!_tntSpawner.canPlaceFireAt(event.getBlock())) + { + event.setCancelled(true); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index 50e9a7d65..a64fff374 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege; +package nautilus.game.arcade.game.games.castleassault; import java.util.ArrayList; import java.util.HashMap; @@ -72,19 +72,19 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.GemData; import nautilus.game.arcade.game.TeamGame; -import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalData.MedalLevel; -import nautilus.game.arcade.game.games.castlesiege.kits.KitArcher; -import nautilus.game.arcade.game.games.castlesiege.kits.KitDemolitionist; -import nautilus.game.arcade.game.games.castlesiege.kits.KitFighter; -import nautilus.game.arcade.game.games.castlesiege.kits.KitPlayer; -import nautilus.game.arcade.game.games.castlesiege.kits.KitTank; -import nautilus.game.arcade.game.games.castlesiege.data.medals.MedalType; +import nautilus.game.arcade.game.games.castleassault.data.KillStreakData; +import nautilus.game.arcade.game.games.castleassault.data.medals.MedalData; +import nautilus.game.arcade.game.games.castleassault.data.medals.MedalData.MedalLevel; +import nautilus.game.arcade.game.games.castleassault.data.medals.MedalType; +import nautilus.game.arcade.game.games.castleassault.kits.KitArcher; +import nautilus.game.arcade.game.games.castleassault.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castleassault.kits.KitFighter; +import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; +import nautilus.game.arcade.game.games.castleassault.kits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; -public class CastleSiegeTDM extends TeamGame +public class CastleAssaultTDM extends TeamGame { private static final int MAX_FLINT_AND_STEEL_USES = 4; private static final int ITEMS_PER_CHEST = 5; @@ -116,9 +116,9 @@ public class CastleSiegeTDM extends TeamGame private boolean _writeScoreboard = true; @SuppressWarnings("deprecation") - public CastleSiegeTDM(ArcadeManager manager) + public CastleAssaultTDM(ArcadeManager manager) { - super(manager, GameType.CastleSiegeTDM, + super(manager, GameType.CastleAssaultTDM, new Kit[] { //new KitAlchemist(manager), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java similarity index 90% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java index 3952467e6..43709f165 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/CapturePoint.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java @@ -1,71 +1,71 @@ -package nautilus.game.arcade.game.games.castlesiege.data; - -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import nautilus.game.arcade.game.GameTeam; - -public class CapturePoint -{ - private static final int POINTS_TO_CAPTURE = 100; - private static final long TIME_PER_POINT = 1000; - private static final int POINTS_PER_TICK = 1; - - private Location _loc; - - private long _lastCap; - private int _points = 0; - private GameTeam _owner = null; - - public CapturePoint(GameTeam owner, Location loc) - { - _owner = owner; - - _loc = loc; - } - - public int getMaxPoints() - { - return POINTS_TO_CAPTURE; - } - - public int getPoints() - { - return _points; - } - - public boolean isCaptured() - { - return _points >= POINTS_TO_CAPTURE; - } - - public void update() - { - if (!UtilTime.elapsed(_lastCap, TIME_PER_POINT)) - { - return; - } - - int capping = 0; - for (Player player : UtilPlayer.getInRadius(_loc, 3.5).keySet()) - { - if (UtilPlayer.isSpectator(player)) - { - continue; - } - if (_owner.HasPlayer(player)) - { - continue; - } - capping++; - } - - if (capping > 0 && _points < POINTS_TO_CAPTURE) - { - _lastCap = System.currentTimeMillis(); - _points += POINTS_PER_TICK; - } - } +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import nautilus.game.arcade.game.GameTeam; + +public class CapturePoint +{ + private static final int POINTS_TO_CAPTURE = 100; + private static final long TIME_PER_POINT = 1000; + private static final int POINTS_PER_TICK = 1; + + private Location _loc; + + private long _lastCap; + private int _points = 0; + private GameTeam _owner = null; + + public CapturePoint(GameTeam owner, Location loc) + { + _owner = owner; + + _loc = loc; + } + + public int getMaxPoints() + { + return POINTS_TO_CAPTURE; + } + + public int getPoints() + { + return _points; + } + + public boolean isCaptured() + { + return _points >= POINTS_TO_CAPTURE; + } + + public void update() + { + if (!UtilTime.elapsed(_lastCap, TIME_PER_POINT)) + { + return; + } + + int capping = 0; + for (Player player : UtilPlayer.getInRadius(_loc, 3.5).keySet()) + { + if (UtilPlayer.isSpectator(player)) + { + continue; + } + if (_owner.HasPlayer(player)) + { + continue; + } + capping++; + } + + if (capping > 0 && _points < POINTS_TO_CAPTURE) + { + _lastCap = System.currentTimeMillis(); + _points += POINTS_PER_TICK; + } + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java similarity index 85% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java index 2735f5026..1e86d8266 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/KillStreakData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java @@ -1,47 +1,47 @@ -package nautilus.game.arcade.game.games.castlesiege.data; - -public class KillStreakData -{ - private static final int[] REWARDED_STREAKS = {2, 4, 6, 8}; - private int _kills; - private int _bestStreak; - - public KillStreakData() - { - _kills = 0; - _bestStreak = 0; - } - - public int getKills() - { - return _kills; - } - - public int getBestStreak() - { - return Math.max(_bestStreak, _kills); - } - - public boolean addKill(boolean hardLine) - { - _kills++; - for (int streak : REWARDED_STREAKS) - { - if ((_kills + (hardLine ? 1 : 0)) == streak) - { - return true; - } - } - - return false; - } - - public void reset() - { - if (_kills > _bestStreak) - { - _bestStreak = _kills; - } - _kills = 0; - } +package nautilus.game.arcade.game.games.castleassault.data; + +public class KillStreakData +{ + private static final int[] REWARDED_STREAKS = {2, 4, 6, 8}; + private int _kills; + private int _bestStreak; + + public KillStreakData() + { + _kills = 0; + _bestStreak = 0; + } + + public int getKills() + { + return _kills; + } + + public int getBestStreak() + { + return Math.max(_bestStreak, _kills); + } + + public boolean addKill(boolean hardLine) + { + _kills++; + for (int streak : REWARDED_STREAKS) + { + if ((_kills + (hardLine ? 1 : 0)) == streak) + { + return true; + } + } + + return false; + } + + public void reset() + { + if (_kills > _bestStreak) + { + _bestStreak = _kills; + } + _kills = 0; + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java similarity index 87% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java index 18cb00cf5..076913cf1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/ObjectiveTNTSpawner.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java @@ -1,97 +1,100 @@ -package nautilus.game.arcade.game.games.castlesiege.data; - -import java.util.List; - -import org.bukkit.Color; -import org.bukkit.FireworkEffect.Type; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Item; -import org.bukkit.inventory.ItemStack; - -import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilTime; - -public class ObjectiveTNTSpawner -{ - private static final long TNT_SPAWN_DELAY = 60000; - private List _locs; - private Location _lastSpawnLoc; - private Item _entity; - private long _lastPickedUp; - - public ObjectiveTNTSpawner(List locs) - { - _locs = locs; - _lastSpawnLoc = null; - _entity = null; - _lastPickedUp = System.currentTimeMillis(); - } - - public Item getItem() - { - return _entity; - } - - public boolean isSpawned() - { - return _entity != null; - } - - public boolean canPlaceFireAt(Block block) - { - if (!isSpawned()) - { - return false; - } - - return UtilMath.offsetSquared(_lastSpawnLoc, block.getLocation()) <= 9; - } - - public long getNextTNT() - { - return (_lastPickedUp + TNT_SPAWN_DELAY) - System.currentTimeMillis(); - } - - public void spawn() - { - Location spawn = _locs.get(UtilMath.r(_locs.size())); - spawn.getBlock().getRelative(BlockFace.DOWN).setType(Material.REDSTONE_BLOCK); - _lastSpawnLoc = spawn.clone(); - _entity = spawn.getWorld().dropItem(spawn, new ItemStack(Material.TNT)); - UtilFirework.playFirework(spawn, Type.BURST, Color.RED, false, false); - } - - public void pickup() - { - _entity.getLocation().getBlock().getRelative(BlockFace.DOWN).setType(Material.IRON_BLOCK); - _entity.remove(); - _entity = null; - _lastSpawnLoc = null; - _lastPickedUp = System.currentTimeMillis(); - } - - public void update() - { - if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, TNT_SPAWN_DELAY)) - { - spawn(); - } - else if (isSpawned()) - { - _entity.teleport(_lastSpawnLoc); - if (!_entity.isValid() || _entity.isDead()) - { - _entity = _lastSpawnLoc.getWorld().dropItem(_lastSpawnLoc, new ItemStack(Material.TNT)); - } - } - } - - public void onStart() - { - _lastPickedUp = System.currentTimeMillis(); - } +package nautilus.game.arcade.game.games.castleassault.data; + +import java.util.List; + +import org.bukkit.Color; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTime; + +public class ObjectiveTNTSpawner +{ + private static final long TNT_SPAWN_DELAY = 60000; + private List _locs; + private Location _lastSpawnLoc; + private Item _entity; + private long _lastPickedUp; + + public ObjectiveTNTSpawner(List locs) + { + _locs = locs; + _lastSpawnLoc = null; + _entity = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public Item getItem() + { + return _entity; + } + + public boolean isSpawned() + { + return _entity != null; + } + + public boolean canPlaceFireAt(Block block) + { + for (Location loc : _locs) + { + if (UtilMath.offsetSquared(loc, block.getLocation()) <= 9) + { + return false; + } + } + + return true; + } + + public long getNextTNT() + { + return (_lastPickedUp + TNT_SPAWN_DELAY) - System.currentTimeMillis(); + } + + public void spawn() + { + Location spawn = _locs.get(UtilMath.r(_locs.size())); + spawn.getBlock().getRelative(BlockFace.DOWN).setType(Material.REDSTONE_BLOCK); + _lastSpawnLoc = spawn.clone(); + _entity = spawn.getWorld().dropItem(spawn, new ItemStack(Material.TNT)); + UtilFirework.playFirework(spawn, Type.BURST, Color.RED, false, false); + } + + public void pickup() + { + _entity.getLocation().getBlock().getRelative(BlockFace.DOWN).setType(Material.IRON_BLOCK); + _entity.remove(); + _entity = null; + _lastSpawnLoc = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public void update() + { + if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, TNT_SPAWN_DELAY)) + { + spawn(); + } + else if (isSpawned()) + { + _entity.teleport(_lastSpawnLoc); + if (!_entity.isValid() || _entity.isDead()) + { + _entity = _lastSpawnLoc.getWorld().dropItem(_lastSpawnLoc, new ItemStack(Material.TNT)); + } + } + } + + public void onStart() + { + _lastPickedUp = System.currentTimeMillis(); + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java similarity index 89% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java index 8c2ebb0af..e44bc9e9a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamCrystal.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java @@ -1,54 +1,54 @@ -package nautilus.game.arcade.game.games.castlesiege.data; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.EnderCrystal; - -import nautilus.game.arcade.game.GameTeam; - -public class TeamCrystal -{ - private Location _loc; - private GameTeam _owner; - private EnderCrystal _crystal; - private boolean _destroyed; - - public TeamCrystal(GameTeam owner, Location loc) - { - _owner = owner; - _loc = loc; - - spawn(); - } - - public GameTeam getOwner() - { - return _owner; - } - - public Location getLocation() - { - return _loc; - } - - public boolean isActive() - { - return !_destroyed; - } - - public void spawn() - { - _destroyed = false; - _crystal = _loc.getWorld().spawn(_loc, EnderCrystal.class); - _loc.getBlock().getRelative(0, -2, 0).setType(Material.BEACON); - } - - public void destroy() - { - _destroyed = true; - _crystal.remove(); - _crystal = null; - _loc.getBlock().getRelative(0, -2, 0).setType(Material.SMOOTH_BRICK); - } +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EnderCrystal; + +import nautilus.game.arcade.game.GameTeam; + +public class TeamCrystal +{ + private Location _loc; + private GameTeam _owner; + private EnderCrystal _crystal; + private boolean _destroyed; + + public TeamCrystal(GameTeam owner, Location loc) + { + _owner = owner; + _loc = loc; + + spawn(); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public boolean isActive() + { + return !_destroyed; + } + + public void spawn() + { + _destroyed = false; + _crystal = _loc.getWorld().spawn(_loc, EnderCrystal.class); + _loc.getBlock().getRelative(0, -2, 0).setType(Material.BEACON); + } + + public void destroy() + { + _destroyed = true; + _crystal.remove(); + _crystal = null; + _loc.getBlock().getRelative(0, -2, 0).setType(Material.SMOOTH_BRICK); + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java similarity index 93% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java index a925064dd..af9fad64a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/TeamKing.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java @@ -1,122 +1,122 @@ -package nautilus.game.arcade.game.games.castlesiege.data; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Zombie; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.ItemBuilder; -import nautilus.game.arcade.game.GameTeam; - -public class TeamKing -{ - private static final int MAX_HEALTH = 600; - private Location _loc; - private String _name; - private GameTeam _owner; - private Zombie _entity; - private int _health; - private String _lastDamager; - private long _lastDamage; - - public TeamKing(GameTeam owner, String name, Location loc) - { - _owner = owner; - _loc = loc; - _name = name; - _health = MAX_HEALTH; - _entity = (Zombie) loc.getWorld().spawnEntity(loc, EntityType.ZOMBIE); - UtilEnt.vegetate(_entity, true); - _entity.getEquipment().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setUnbreakable(true).build()); - _entity.getEquipment().setChestplate(new ItemBuilder(Material.DIAMOND_CHESTPLATE).setUnbreakable(true).build()); - _entity.getEquipment().setLeggings(new ItemBuilder(Material.DIAMOND_LEGGINGS).setUnbreakable(true).build()); - _entity.getEquipment().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setUnbreakable(true).build()); - _entity.setRemoveWhenFarAway(false); - _entity.setCustomName(owner.GetColor() + name); - } - - public GameTeam getOwner() - { - return _owner; - } - - public Location getLocation() - { - return _loc; - } - - public String getName(boolean bold) - { - return _owner.GetColor() + (bold ? C.Bold : "") + _name; - } - - public String getLastDamager() - { - return _lastDamager; - } - - public int getHealth() - { - return Math.max(_health, 0); - } - - public boolean isDead() - { - return getHealth() <= 0; - } - - public void update(boolean beaconsAlive) - { - _entity.teleport(_loc); - for (int y = 0; y <= 4; y++) - { - for (int x = -4; x <= 4; x++) - { - for (int z = -4; z <= 4; z++) - { - Block block = _loc.clone().add(x, y, z).getBlock(); - if ((block.getType() != Material.IRON_FENCE && block.getType() != Material.IRON_BLOCK) || !beaconsAlive) - { - block.setType(Material.AIR); - } - if (beaconsAlive) - { - if (x == -4 || x == 4 || z == -4 || z == 4) - { - if (y != 4) - { - block.setType(Material.IRON_FENCE); - } - } - if (y == 4) - { - block.setType(Material.IRON_BLOCK); - } - } - } - } - } - } - - public boolean handleDamage(String player, double damage) - { - if (!UtilTime.elapsed(_lastDamage, 400)) - { - return false; - } - _lastDamager = player; - _lastDamage = System.currentTimeMillis(); - - int dmg = (int)Math.ceil(damage); - - _health -= dmg; - - UtilEnt.PlayDamageSound(_entity); - - return true; - } +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Zombie; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.game.GameTeam; + +public class TeamKing +{ + private static final int MAX_HEALTH = 600; + private Location _loc; + private String _name; + private GameTeam _owner; + private Zombie _entity; + private int _health; + private String _lastDamager; + private long _lastDamage; + + public TeamKing(GameTeam owner, String name, Location loc) + { + _owner = owner; + _loc = loc; + _name = name; + _health = MAX_HEALTH; + _entity = (Zombie) loc.getWorld().spawnEntity(loc, EntityType.ZOMBIE); + UtilEnt.vegetate(_entity, true); + _entity.getEquipment().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setUnbreakable(true).build()); + _entity.getEquipment().setChestplate(new ItemBuilder(Material.DIAMOND_CHESTPLATE).setUnbreakable(true).build()); + _entity.getEquipment().setLeggings(new ItemBuilder(Material.DIAMOND_LEGGINGS).setUnbreakable(true).build()); + _entity.getEquipment().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setUnbreakable(true).build()); + _entity.setRemoveWhenFarAway(false); + _entity.setCustomName(owner.GetColor() + name); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public String getName(boolean bold) + { + return _owner.GetColor() + (bold ? C.Bold : "") + _name; + } + + public String getLastDamager() + { + return _lastDamager; + } + + public int getHealth() + { + return Math.max(_health, 0); + } + + public boolean isDead() + { + return getHealth() <= 0; + } + + public void update(boolean beaconsAlive) + { + _entity.teleport(_loc); + for (int y = 0; y <= 4; y++) + { + for (int x = -4; x <= 4; x++) + { + for (int z = -4; z <= 4; z++) + { + Block block = _loc.clone().add(x, y, z).getBlock(); + if ((block.getType() != Material.IRON_FENCE && block.getType() != Material.IRON_BLOCK) || !beaconsAlive) + { + block.setType(Material.AIR); + } + if (beaconsAlive) + { + if (x == -4 || x == 4 || z == -4 || z == 4) + { + if (y != 4) + { + block.setType(Material.IRON_FENCE); + } + } + if (y == 4) + { + block.setType(Material.IRON_BLOCK); + } + } + } + } + } + } + + public boolean handleDamage(String player, double damage) + { + if (!UtilTime.elapsed(_lastDamage, 400)) + { + return false; + } + _lastDamager = player; + _lastDamage = System.currentTimeMillis(); + + int dmg = (int)Math.ceil(damage); + + _health -= dmg; + + UtilEnt.PlayDamageSound(_entity); + + return true; + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java similarity index 93% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java index 2943d761a..a64e7f68c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.data.medals; +package nautilus.game.arcade.game.games.castleassault.data.medals; import java.util.HashMap; import java.util.Map; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java similarity index 78% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java index e12f1bb36..47abb13c9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/data/medals/MedalType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.data.medals; +package nautilus.game.arcade.game.games.castleassault.data.medals; public enum MedalType { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java index 50c4f443d..d42c40ae0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitAlchemist.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java similarity index 91% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java index 9638a2a60..94efc77d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitArcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; @@ -120,8 +120,8 @@ public class KitArcher extends KitPlayer } else if (streak == 4) { - player.sendMessage(C.cRedB + "You have received a Power I book as a Kill Streak Reward!"); - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); + player.sendMessage(C.cRedB + "You have received 12 Arrows as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(12).setTitle(F.item("Fletched Arrow")).build()); } else if (streak == 6) { @@ -130,8 +130,8 @@ public class KitArcher extends KitPlayer } else if (streak == 8) { - player.sendMessage(C.cRedB + "You have received a Power I book as a Kill Streak Reward!"); - player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build()); + player.sendMessage(C.cRedB + "You have received 32 Arrows as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); } } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java index 67d2c8872..9e3134e75 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitBuilder.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java similarity index 98% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java index 16588ff54..5af012192 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitDemolitionist.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java index d92d12c30..fc15f48ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitEnchanter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java similarity index 99% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java index abf6ad397..d5b49974d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitFighter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java similarity index 94% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java index 9154b7a45..7cb59e5f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHardline.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java index 898091c80..acb2f4590 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitNinja.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java similarity index 88% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java index 53cc7b7e1..c9fdaf1c6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -9,7 +9,7 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.game.games.castlesiege.CastleSiege; +import nautilus.game.arcade.game.games.castleassault.CastleAssault; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.ProgressingKit; @@ -32,9 +32,9 @@ public abstract class KitPlayer extends ProgressingKit public abstract void awardKillStreak(Player player, int streak); - protected CastleSiege getGame() + protected CastleAssault getGame() { - return (CastleSiege) Manager.GetGame(); + return (CastleAssault) Manager.GetGame(); } protected void giveRegeneration(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java similarity index 99% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java index 3549ffb12..710781ebc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitTank.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java similarity index 95% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java index e3359c66d..0cb37d4e1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitWorkman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java index 8c9c84484..9dc21c017 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/PerkBloodlust.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.kits; +package nautilus.game.arcade.game.games.castleassault.kits; import java.util.Map; import java.util.WeakHashMap; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java index e4e1f4620..a5a67d2d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java @@ -1,1445 +1,973 @@ package nautilus.game.arcade.game.games.castlesiege; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; +import org.bukkit.Effect; +import org.bukkit.EntityEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Chest; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.EnderCrystal; -import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; -import org.bukkit.entity.ItemFrame; -import org.bukkit.entity.Painting; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Style; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; -import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockDispenseEvent; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.inventory.PrepareItemCraftEvent; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerBucketFillEvent; -import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Dispenser; -import org.bukkit.material.MaterialData; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.util.Vector; -import mineplex.core.Managers; import mineplex.core.common.util.C; import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.EnchantedBookBuilder; -import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.leaderboard.Leaderboard; -import mineplex.core.leaderboard.LeaderboardManager; -import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; -import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.DeathMessageType; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; + import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.FirstBloodEvent; import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerGameRespawnEvent; import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.GemData; import nautilus.game.arcade.game.TeamGame; -import nautilus.game.arcade.game.games.castlesiege.data.KillStreakData; -import nautilus.game.arcade.game.games.castlesiege.data.ObjectiveTNTSpawner; -import nautilus.game.arcade.game.games.castlesiege.data.TeamCrystal; -import nautilus.game.arcade.game.games.castlesiege.data.TeamKing; -import nautilus.game.arcade.game.games.castlesiege.kits.KitArcher; -import nautilus.game.arcade.game.games.castlesiege.kits.KitDemolitionist; -import nautilus.game.arcade.game.games.castlesiege.kits.KitFighter; -import nautilus.game.arcade.game.games.castlesiege.kits.KitPlayer; -import nautilus.game.arcade.game.games.castlesiege.kits.KitTank; +import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanKnight; +import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanMarksman; +import nautilus.game.arcade.game.games.castlesiege.kits.KitHumanPeasant; +import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadArcher; +import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadGhoul; +import nautilus.game.arcade.game.games.castlesiege.kits.KitUndeadZombie; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; +import nautilus.game.arcade.kit.NullKit; +import nautilus.game.arcade.stats.BloodThirstyStatTracker; +import nautilus.game.arcade.stats.KingDamageStatTracker; +import nautilus.game.arcade.stats.KingSlayerStatTracker; +import nautilus.game.arcade.stats.TeamDeathsStatTracker; +import nautilus.game.arcade.stats.TeamKillsStatTracker; +import nautilus.game.arcade.stats.WinAsTeamStatTracker; public class CastleSiege extends TeamGame { - private static final int MAX_FLINT_AND_STEEL_USES = 4; - private static final int ITEMS_PER_CHEST = 5; - private static final long TIME_TILL_REFILL = 2 * 60 * 1000; - - private long _lastRefill; - - private ItemBuilder _flintAndSteel; - private ItemBuilder _wearableTnt; - - private Map _streakData = new WeakHashMap<>(); - private Map> _crystals = new HashMap<>(); - private Map _kings = new HashMap<>(); - private List _tntCarry = new ArrayList<>(); - - private List _chests = new ArrayList<>(); - - private ChestLoot _diamondGearCommon = new ChestLoot(true); - private ChestLoot _diamondGearRare = new ChestLoot(true); - private ChestLoot _weaponGearCommon = new ChestLoot(true); - private ChestLoot _weaponGearRare = new ChestLoot(true); - private ChestLoot _rangedGear = new ChestLoot(true); - private ChestLoot _rodsAndGaps = new ChestLoot(true); - private ChestLoot _potionGearCommon = new ChestLoot(true); - private ChestLoot _potionGearRare = new ChestLoot(true); - private ChestLoot _enchantGearCommon = new ChestLoot(true); - private ChestLoot _enchantGearRare = new ChestLoot(true); - private ChestLoot _miscGear = new ChestLoot(); - - private ObjectiveTNTSpawner _tntSpawner; - - private boolean _writeScoreboard = true; - - @SuppressWarnings("deprecation") + public static class KingDamageEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } + + private final double _damage; + + public KingDamageEvent(Player who, double damage) + { + super(who); + + _damage = damage; + } + + public double getDamage() + { + return _damage; + } + } + + public static class KingSlaughterEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } + + public KingSlaughterEvent(Player who) + { + super(who); + } + } + + private ArrayList _lastScoreboard = new ArrayList(); + + private long _tntSpawn = 0; + private ArrayList _tntSpawns = new ArrayList(); + private ArrayList _tntWeakness = new ArrayList(); + + private HashMap _tntCarry = new HashMap(); + private HashSet _tntCarryEnd = new HashSet(); + + private ArrayList _kingLocs; + private Creature _king; + private Location _kingLoc; + private String _kingName; + private Player _kingDamager = null; + private int _kingHealth = 40; + + private ArrayList _peasantSpawns; + private ArrayList _horseSpawns; + public CastleSiege(ArcadeManager manager) { super(manager, GameType.CastleSiege, - new Kit[] - { - //new KitAlchemist(manager), - new KitArcher(manager), - new KitDemolitionist(manager), - //new KitEnchanter(manager), - new KitFighter(manager), - //new KitHardline(manager), - //new KitNinja(manager), - new KitTank(manager) - }, - new String[] - { - "Destroy enemy sentry crystals with running TNT", - "After the enemy crystals are destroyed you must slay their king", - "First team to kill the enemy king wins", - "Chests refill every 2 minutes", - "TNT Respawns every 1 minute" - } - ); - + + new Kit[] + { + new KitHumanMarksman(manager), + new KitHumanKnight(manager), + //new KitHumanBrawler(manager), + //new KitHumanAssassin(manager), + new NullKit(manager), + new KitHumanPeasant(manager), + new NullKit(manager), + new KitUndeadGhoul(manager), + new KitUndeadArcher(manager), + new KitUndeadZombie(manager), + }, + + new String[] + { + F.elem(C.cAqua + "Defenders") + C.cWhite + " must defend the King.", + F.elem(C.cAqua + "Defenders") + C.cWhite + " win when the sun rises.", + F.elem(C.cAqua + "Defenders") + C.cWhite + " respawn as wolves.", + "", + F.elem(C.cRed + "Undead") + C.cWhite + " must kill the King.", + F.elem(C.cRed + "Undead") + C.cWhite + " lose when the sun rises.", + + }); + _help = new String[] - { - "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", - "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", - "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", - "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" - }; - + { + "Marksmen are extremely important to defence!", + "It's recommended 50%+ of defence are Marksmen.", + "Use Barricades to block the Undeads path.", + "Use TNT to destroy weak points in walls.", + "Weak points are marked by cracked stone brick.", + "Undead can break fences with their axes.", + "Undead Archers must pick up arrows from the ground.", + + }; + this.StrictAntiHack = true; + this.HungerSet = 20; this.DeathOut = false; - this.DeathSpectateSecs = 5; - this.CreatureAllow = false; - this.DeathDropItems = false; - this.WorldWeatherEnabled = false; - this.AllowParticles = false; - this.SoupEnabled = false; - this.InventoryClick = true; - this.InventoryOpenChest = true; - this.InventoryOpenBlock = true; - this.ItemDrop = true; - this.ItemPickup = true; - this.AllowFlintAndSteel = true; - this.BlockPlaceAllow.add(Material.FIRE.getId()); - this.CrownsEnabled = true; - this.Leaderboards = true; - this.FirstKillReward = 20; - this.GemKillDeathRespawn = 1; - + this.WorldTimeSet = 14000; //14000 + this.BlockPlaceAllow.add(85); + + _kingName = C.cYellow + C.Bold + "King Sparklez"; + + GameTeam notRedTeam = null; + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() != ChatColor.RED) + { + notRedTeam = team; + break; + } + } + + registerStatTrackers( + new KingSlayerStatTracker(this), + new BloodThirstyStatTracker(this), + new KingDamageStatTracker(this), + + new TeamDeathsStatTracker(this), + new TeamKillsStatTracker(this) + ); + + registerChatStats( + Kills, + Deaths, + KDRatio, + BlankLine, + Assists, + DamageDealt, + DamageTaken + ); + + registerChatStats(); + new CompassModule() - .setGiveCompass(true) - .setGiveCompassToSpecs(true) - .setGiveCompassToAlive(false) - .register(this); - - _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); - _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); - generateLoot(); - - if (manager.IsRewardStats()) - { - if (manager.GetLobby() instanceof NewGameLobbyManager) - { - Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); - if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_WINS", new Leaderboard("Top Daily Wins", "Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS", new Leaderboard("Top Daily Kills", "Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_WINS", new Leaderboard("Top Wins", "Wins", new String[] {"Castle Siege.Wins"}, LeaderboardSQLType.ALL, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLESIEGE_KILLS", new Leaderboard("Top Kills", "Kills", new String[] {"Castle Siege.Kills"}, LeaderboardSQLType.ALL, loc, 10)); - } - } - } + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); } - - private void generateLoot() - { - { - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - } - { - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - } - { - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); - } - { - _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); - } - { - _rangedGear.addLoot(new ItemStack(Material.BOW), 3); - _rangedGear.addLoot(Material.ARROW, 3, 8, 16); - } - { - _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); - _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); - } - { - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); - } - { - _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); - _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); - } - { - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); - _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); - } - { - _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); - } - { - _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); - _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); - _miscGear.addLoot(_flintAndSteel.build(), 2); - _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); - } - } - - private void fillChest(Block block) - { - if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) - { - return; - } - Chest chest = (Chest) block.getState(); - - chest.getBlockInventory().clear(); - int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); - - for (int slot : slots) - { - double chance = UtilMath.random.nextDouble(); - double subChance = UtilMath.random.nextDouble(); - - ChestLoot loot = _miscGear; - if (chance <= 0.6) - { - loot = _rodsAndGaps; - } - if (chance <= 0.5) - { - loot = _potionGearCommon; - if (subChance <= 0.45) - { - loot = _potionGearRare; - } - } - if (chance <= 0.3) - { - loot = _rangedGear; - } - chest.getBlockInventory().setItem(slot, loot.getLoot()); - } - } - - public ItemStack getNewFlintAndSteel(boolean kitItem) - { - if (kitItem) - { - return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); - } - return _flintAndSteel.build(); - } - - public void writeScoreboard() - { - if (!_writeScoreboard) - { - return; - } - Scoreboard.reset(); - Scoreboard.write(C.cDRedB + GetName()); - Scoreboard.writeNewLine(); - Scoreboard.write(C.cGreenB + "Chest Refill"); - long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); - if (!IsLive()) - { - refillTime = TIME_TILL_REFILL; - } - Scoreboard.write(UtilTime.MakeStr(refillTime)); - Scoreboard.writeNewLine(); - Scoreboard.write(C.cGreenB + "TNT Spawn"); - long tntTime = _tntSpawner.getNextTNT(); - if (!IsLive()) - { - tntTime = 60000; - } - if (_tntSpawner.isSpawned()) - { - Scoreboard.write("Spawned"); - } - else - { - Scoreboard.write(UtilTime.MakeStr(tntTime)); - } - Scoreboard.writeNewLine(); - GameTeam red = GetTeam(ChatColor.RED); - long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); - GameTeam blue = GetTeam(ChatColor.AQUA); - long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); - if (redCrystals > 0) - { - Scoreboard.write(_kings.get(red).getName(true)); - Scoreboard.write(redCrystals + "/2 Crystals Active"); - } - else - { - Scoreboard.write(_kings.get(red).getName(true) + " Health"); - Scoreboard.write(_kings.get(red).getHealth() + ""); - } - Scoreboard.writeNewLine(); - if (blueCrystals > 0) - { - Scoreboard.write(_kings.get(blue).getName(true)); - Scoreboard.write(blueCrystals + "/2 Crystals Active"); - } - else - { - Scoreboard.write(_kings.get(blue).getName(true) + " Health"); - Scoreboard.write(_kings.get(blue).getHealth() + ""); - } - Scoreboard.draw(); - } - - public void writeFinalScoreboard(String deadKing, String winKing, String warrior) - { - _writeScoreboard = false; - Scoreboard.reset(); - Scoreboard.writeNewLine(); - Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); - Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); - Scoreboard.write(warrior + C.cWhite + "!"); - Scoreboard.writeNewLine(); - - Scoreboard.draw(); - } - + @Override public void ParseData() { - for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + _tntSpawns = WorldData.GetDataLocs("RED"); + _tntWeakness = WorldData.GetDataLocs("BLACK"); + + _kingLocs = WorldData.GetDataLocs("YELLOW"); + + _peasantSpawns = WorldData.GetDataLocs("GREEN"); + _horseSpawns = WorldData.GetDataLocs("BROWN"); + } + + @Override + public void RestrictKits() + { + for (Kit kit : GetKits()) { - Block block = chestLoc.getBlock(); - block.setType(Material.CHEST); - fillChest(block); - _chests.add(block); - } - GameTeam red = GetTeam(ChatColor.RED); - GameTeam blue = GetTeam(ChatColor.AQUA); - Location redKing = WorldData.GetDataLocs("RED").get(0); - Location blueKing = WorldData.GetDataLocs("BLUE").get(0); - Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); - Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); - redKing.setPitch(UtilAlg.GetPitch(redBlue)); - redKing.setYaw(UtilAlg.GetYaw(redBlue)); - blueKing.setPitch(UtilAlg.GetPitch(blueRed)); - blueKing.setYaw(UtilAlg.GetYaw(blueRed)); - _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); - _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); - this.CreatureAllowOverride = true; - _kings.put(red, new TeamKing(red, "King Jon", redKing)); - _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); - int kitIndex = 0; - for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) - { - if (kitIndex >= GetKits().length) + for (GameTeam team : GetTeamList()) { - kitIndex = 0; + if (team.GetColor() == ChatColor.RED) + { + if (kit.GetName().contains("Castle")) + team.GetRestrictedKits().add(kit); + + team.SetName("Undead"); + } + else + { + if (kit.GetName().contains("Undead")) + team.GetRestrictedKits().add(kit); + + team.SetRespawnTime(8); + + team.SetName("Defenders"); + } + } + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void registerTeamTracker(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Recruit) + { + GameTeam notRed = null; + + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() == ChatColor.RED) + continue; + + notRed = team; + break; + } + + if (notRed != null) + { + registerStatTrackers(new WinAsTeamStatTracker(this, notRed, "ForTheKing")); + System.out.println("Successfully registered For the King StatTrak"); } - Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); - Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); - kitIndex++; } - this.CreatureAllowOverride = false; - _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); } + @EventHandler + public void MoveKits(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + for (int i = 0; i < WorldData.GetDataLocs("PINK").size() && i < 3; i++) + { + if (GetKits().length <= 5 + i) + continue; + + this.CreatureAllowOverride = true; + Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("PINK").get(i)); + this.CreatureAllowOverride = false; + + Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("PINK").get(i)); + } + } + + @EventHandler + public void HorseSpawn(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + for (Location loc : _horseSpawns) + { + this.CreatureAllowOverride = true; + Horse horse = loc.getWorld().spawn(loc, Horse.class); + this.CreatureAllowOverride = false; + + horse.setAdult(); + horse.setAgeLock(true); + horse.setColor(org.bukkit.entity.Horse.Color.BLACK); + horse.setStyle(Style.BLACK_DOTS); + horse.setMaxDomestication(1); + horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); + horse.getInventory().setArmor(new ItemStack(Material.IRON_BARDING)); + + horse.setMaxHealth(60); + horse.setHealth(horse.getMaxHealth()); + + horse.setCustomName("War Horse"); + } + } + + @EventHandler + public void HorseInteract(PlayerInteractEntityEvent event) + { + if (!(event.getRightClicked() instanceof Horse)) + return; + + Player player = event.getPlayer(); + GameTeam team = GetTeam(player); + + if (team == null || team.GetColor() == ChatColor.RED || !IsAlive(player)) + { + event.setCancelled(true); + } + } + + @EventHandler + public void HorseDamageCancel(CustomDamageEvent event) + { + if (!(event.GetDamageeEntity() instanceof Horse)) + return; + + Player player = event.GetDamagerPlayer(true); + if (player == null) + return; + + if (!IsAlive(player)) + return; + + if (GetTeam(player) == null) + return; + + if (GetTeam(player).GetColor() == ChatColor.RED) + return; + + event.SetCancelled("Horse Team Damage"); + } + + @EventHandler(priority = EventPriority.HIGH) + public void GameStateChange(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + //Spawn King + this.CreatureAllowOverride = true; + + _kingLoc = _kingLocs.get(UtilMath.r(_kingLocs.size())); + + _king = (Creature) _kingLoc.getWorld().spawnEntity(_kingLoc, EntityType.ZOMBIE); + + _king.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + _king.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + _king.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + _king.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + _king.getEquipment().setItemInHand(new ItemStack(Material.DIAMOND_SWORD)); + + _king.setCustomName(_kingName); + _king.setCustomNameVisible(true); + + _king.setRemoveWhenFarAway(false); + + this.CreatureAllowOverride = false; + } + + @EventHandler(priority = EventPriority.HIGH) + public void SetDefenderRespawn(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + return; + + //Change to Peasant Spawns + this.GetTeam(ChatColor.AQUA).SetSpawns(_peasantSpawns); + } + + + @EventHandler + public void KingTarget(EntityTargetEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void KingDamage(CustomDamageEvent event) + { + if (_king == null || !_king.isValid()) + return; + + if (!event.GetDamageeEntity().equals(_king)) + return; + + event.SetCancelled("King Damage"); + + Player damager = event.GetDamagerPlayer(true); + if (damager == null) return; + + GameTeam team = GetTeam(damager); + + if (team != null && team.GetColor() == ChatColor.RED) + { + if (!Recharge.Instance.use(damager, "Damage King", 400, false, false)) + return; + + if (!IsAlive(damager)) + { + return; + } + + _king.playEffect(EntityEffect.HURT); + + _kingDamager = damager; + _kingHealth--; + + Bukkit.getPluginManager().callEvent(new KingDamageEvent(damager, 1)); + + if (_kingHealth < 0) + _kingHealth = 0; + + WriteScoreboard(); + + if (_kingHealth <= 0) + _king.damage(500); + + EndCheck(); + } + } + + @EventHandler + public void KingUpdate(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.SEC) + return; + + if (_king == null) + return; + + if (UtilMath.offset(_king.getLocation(), _kingLoc) > 6) + { + _king.teleport(_kingLoc); + } + else + { + UtilEnt.CreatureMove(_king, _kingLoc, 1f); + } + } + + @EventHandler + public void PlayerDeath(PlayerGameRespawnEvent event) + { + if (GetTeam(ChatColor.AQUA).HasPlayer(event.GetPlayer())) + SetKit(event.GetPlayer(), GetKits()[3], true); + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + WriteScoreboard(); + } + + public void WriteScoreboard() + { + //Get Values + HashMap _scoreGroup = new HashMap(); + _scoreGroup.put(C.cAqua + "Defenders", 0); + _scoreGroup.put(C.cDAqua + "Wolves", 0); + _scoreGroup.put(C.cRed + "Undead", 0); + + for (Player player : UtilServer.getPlayers()) + { + if (!IsAlive(player)) + continue; + + Kit kit = GetKit(player); + if (kit == null) continue; + + if (kit.GetName().contains("Castle")) + { + if (kit.GetName().contains("Wolf")) + { + _scoreGroup.put(C.cDAqua + "Wolves", 1 + _scoreGroup.get(C.cDAqua + "Wolves")); + } + else + { + _scoreGroup.put(C.cAqua + "Defenders", 1 + _scoreGroup.get(C.cAqua + "Defenders")); + } + } + else if (kit.GetName().contains("Undead")) + { + _scoreGroup.put(C.cRed + "Undead", 1 + _scoreGroup.get(C.cRed + "Undead")); + } + } + + //Wipe Last + Scoreboard.reset(); + + //Teams + for (String group : _scoreGroup.keySet()) + { + Scoreboard.writeNewLine(); + Scoreboard.write(group); + Scoreboard.write(ChatColor.getLastColors(group) + _scoreGroup.get(group) + " Players"); + } + + //King + if (_king != null && _king.isValid()) + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "King"); + Scoreboard.write(_kingHealth + " Health"); + } + + long timeLeft = 24000 - WorldTimeSet; + timeLeft = timeLeft / 20 * 1000; + + + if (timeLeft > 0) + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); + Scoreboard.write(UtilTime.MakeStr(timeLeft, 0)); + } + else + { + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); + Scoreboard.write("Undead Burning!"); + + for (Player player : GetTeam(ChatColor.RED).GetPlayers(true)) + Manager.GetCondition().Factory().Ignite("Sun Damage", player, player, 5, false, false); + } + + Scoreboard.draw(); + } + @Override public void EndCheck() { if (!IsLive()) - { return; - } - List teamsAlive = new ArrayList<>(); - - for (GameTeam team : GetTeamList()) + if (this.WorldTimeSet > 24100 || GetTeam(ChatColor.RED).GetSize() == 0) { - if (team.GetPlayers(true).size() > 0) - { - teamsAlive.add(team); - } - } + SetCustomWinLine(_kingName + ChatColor.RESET + " has survived the siege!"); - if (teamsAlive.size() <= 1) - { - //Announce - if (teamsAlive.size() > 0) + AnnounceEnd(GetTeam(ChatColor.AQUA)); + + for (GameTeam team : GetTeamList()) { - GameTeam winner = teamsAlive.get(0); - TeamKing king = _kings.get(winner); - TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); - AnnounceEnd(winner); - writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); - for (GameTeam team : GetTeamList()) + if (WinnerTeam != null && team.equals(WinnerTeam)) { - for (Player player : team.GetPlayers(true)) + for (Player player : team.GetPlayers(false)) { - if (team.GetColor() == winner.GetColor()) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak >= 2 && streak < 4) - { - AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 4 && streak < 6) - { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 6 && streak < 8) - { - AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); - } - else if (streak >= 8) - { - AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); - } - } - - if (GetKit(player) != null) - { - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } + AddGems(player, 10, "Winning Team", false, false); } } - SetState(GameState.End); - return; + + for (Player player : team.GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); } + + SetState(GameState.End); } - } - - @Override - @EventHandler - public void ScoreboardUpdate(UpdateEvent event) {}; - - @EventHandler - public void onUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) + + if (!_king.isValid() || GetTeam(ChatColor.AQUA).GetSize() == 0) { - return; - } - if (IsLive()) - { - if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + if (_kingDamager != null) { - _lastRefill = System.currentTimeMillis(); - _chests.forEach(this::fillChest); - Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + SetCustomWinLine(C.cRed + _kingDamager.getName() + C.cWhite + " slaughtered " + _kingName + ChatColor.RESET + "!"); + AddGems(_kingDamager, 20, "King Slayer", false, false); + + Bukkit.getPluginManager().callEvent(new KingSlaughterEvent(_kingDamager)); } - - GameTeam red = GetTeam(ChatColor.RED); - GameTeam blue = GetTeam(ChatColor.AQUA); - TeamKing redKing = _kings.get(red); - TeamKing blueKing = _kings.get(blue); - redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); - if (redKing.isDead()) + else + SetCustomWinLine(_kingName + ChatColor.RESET + " has died!"); + + AnnounceEnd(GetTeam(ChatColor.RED)); + + for (GameTeam team : GetTeamList()) { - AnnounceEnd(blue); - writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); - for (GameTeam team : GetTeamList()) + if (WinnerTeam != null && team.equals(WinnerTeam)) { - for (Player player : team.GetPlayers(true)) + for (Player player : team.GetPlayers(false)) { - if (player.getName().equals(redKing.getLastDamager())) - { - AddGems(player, 20, "King Slayer", false, false); - } - if (team.GetColor() == ChatColor.AQUA) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) - { - AddGems(player, streak, streak + " Player Kill Streak", false, false); - } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } + AddGems(player, 10, "Winning Team", false, false); } } - SetState(GameState.End); - return; + + for (Player player : team.GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); } - blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); - if (blueKing.isDead()) - { - AnnounceEnd(red); - writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); - for (GameTeam team : GetTeamList()) - { - for (Player player : team.GetPlayers(true)) - { - if (player.getName().equals(blueKing.getLastDamager())) - { - AddGems(player, 20, "King Slayer", false, false); - } - if (team.GetColor() == ChatColor.RED) - { - AddGems(player, 100, "Winning Team", false, false); - } - else - { - AddGems(player, 50, "Losing Team", false, false); - } - if (player.isOnline()) - { - AddGems(player, 10, "Participation", false, false); - } - - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) - { - AddGems(player, streak, streak + " Player Kill Streak", false, false); - } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } - } - SetState(GameState.End); - return; - } - - _tntSpawner.update(); - } - if (InProgress()) - { - writeScoreboard(); + + SetState(GameState.End); } } - + @EventHandler - public void onEditSettings(GameStateChangeEvent event) + public void TNTSpawn(UpdateEvent event) { - if (event.GetGame() != this) - { + if (GetState() != GameState.Live) return; - } - - if (event.GetState() == GameState.Live) - { - _lastRefill = System.currentTimeMillis(); - _tntSpawner.onStart(); - Manager.GetDamage().SetEnabled(false); - Manager.GetExplosion().setEnabled(false); - Manager.GetCreature().SetDisableCustomDrops(true); - } - - if (event.GetState() == GameState.End) - { - Manager.GetDamage().SetEnabled(true); - Manager.GetExplosion().setEnabled(true); - Manager.GetCreature().SetDisableCustomDrops(false); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_DAILY_KILLS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLESIEGE_KILLS"); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void handleDeath(CombatDeathEvent event) - { - if (!IsLive()) - { + + if (event.getType() != UpdateType.SEC) return; - } - - event.SetBroadcastType(DeathMessageType.Detailed); + + if (!UtilTime.elapsed(this.GetStateTime(), 20000)) + return; + + if (!UtilTime.elapsed(_tntSpawn, 25000)) + return; + + if (_tntSpawns.isEmpty()) + return; + + Location loc = _tntSpawns.get(UtilMath.r(_tntSpawns.size())); + + if (loc.getBlock().getTypeId() == 46) + return; + + loc.getBlock().setTypeId(46); + _tntSpawn = System.currentTimeMillis(); } - - @EventHandler - public void disableDamageLevel(CustomDamageEvent event) - { - event.SetDamageToLevel(false); - } - - @EventHandler - public void BlockFade(BlockFadeEvent event) + + @EventHandler(priority = EventPriority.LOW) + public void TNTPickup(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_BLOCK) + return; + + if (event.getClickedBlock().getTypeId() != 46) + return; + event.setCancelled(true); - } - - @EventHandler - public void BlockBurn(BlockBurnEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void BlockDecay(LeavesDecayEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void hangingBreak(HangingBreakEvent event) - { - if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) - { - event.setCancelled(true); - } - } - - @EventHandler - public void noFlow(BlockFromToEvent event) - { - if (!IsLive()) - { - return; - } - - Block block = event.getBlock(); - if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) - { - event.setCancelled(true); - } - if (event.getToBlock().getType() == Material.ICE) - { - event.setCancelled(true); - } - } - - @EventHandler - public void onBlockChange(BlockFormEvent e) - { - if (!IsLive()) - { - return; - } - if (e.getNewState().getType() == Material.ICE) - { - e.setCancelled(true); - } - } - - @SuppressWarnings("deprecation") - @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) - { - if (!IsLive()) - { - return; - } - - Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.WATER_BUCKET) - { - player.getItemInHand().setType(Material.BUCKET); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - return; - } - for (BlockFace bf : BlockFace.values()) - { - Block relative = block.getRelative(bf); - if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - } - else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) - { - event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - - @SuppressWarnings("deprecation") - @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketFillEvent event) - { - if (!IsLive()) - { - return; - } - - Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.LAVA_BUCKET) - { - event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); - } - } - - @EventHandler(ignoreCancelled=true) - public void onBlockDispense(BlockDispenseEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getItem().getType() == Material.WATER_BUCKET) - { - Block dispenser = event.getBlock(); - - MaterialData mat = dispenser.getState().getData(); - Dispenser disp_mat = (Dispenser)mat; - BlockFace face = disp_mat.getFacing(); - Block block = dispenser.getRelative(face); - if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - return; - } - for (BlockFace bf : BlockFace.values()) - { - if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) - { - event.setCancelled(true); - } - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void onCombatDeath(CombatDeathEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.GetLog().GetKiller() == null) - { - return; - } - - if (!event.GetLog().GetKiller().IsPlayer()) - { - return; - } - - Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); - if (player == null) - { - return; - } - - AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); - - if (UtilPlayer.isSpectator(player)) - { - return; - } - - player.setLevel(player.getLevel() + 1); - player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); - KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); - boolean hardLine = GetKit(player).GetName().equals("Hardline"); - if (data.addKill(hardLine)) - { - AddStat(player, "KillStreak", 1, false, false); - ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); - } - if (UtilMath.isEven(data.getKills())) - { - Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); - } - } - - @EventHandler - public void TNTExplosion(ExplosionPrimeEvent event) - { - if (!event.getEntity().hasMetadata("THROWER")) - { - return; - } - float radius = event.getRadius(); - event.setRadius(0f); - - Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); - if (player == null) - { - return; - } - if (GetTeam(player) == null) - { - return; - } - if (GetKit(player).GetName().equals("Demolitionist")) - { - radius += 3; - } - - Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); - for (Player near : nearby.keySet()) - { - if (UtilPlayer.isSpectator(near)) - { - continue; - } - if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) - { - continue; - } - if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) - { - continue; - } - - double mult = nearby.get(near); - - int highestBlastProt = 0; - int blastProtEPF = 0; - for (ItemStack item : near.getInventory().getArmorContents()) - { - if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) - { - blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); - if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) - { - highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); - } - } - } - blastProtEPF = Math.min(blastProtEPF, 20); - - double damage = 8 * mult; - damage = damage * (1 - (blastProtEPF / 25)); - - double knockbackReduction = 1 - (highestBlastProt * 0.15); - - near.damage(damage, event.getEntity()); - UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); - } - - if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) - { - List crystals = new ArrayList<>(); - - for (List c : _crystals.values()) - { - crystals.addAll(c); - } - for (TeamCrystal crystal : crystals) - { - if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) - { - crystal.destroy(); - AddGems(player, 40, "Crystal Destruction", false, true); - long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); - if (remaining > 0) - { - Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); - } - else - { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); - } - } - } - for (TeamKing king : _kings.values()) - { - if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) - { - king.handleDamage(player.getName(), 50); - } - } - } - } - - @EventHandler - public void TNTThrow(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (!UtilEvent.isAction(event, ActionType.L)) - { - return; - } Player player = event.getPlayer(); - if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) - { - return; - } - if (!IsAlive(player)) - { return; - } - event.setCancelled(true); + if (!GetTeam(ChatColor.RED).HasPlayer(player)) + return; - if (!Manager.GetGame().CanThrowTNT(player.getLocation())) - { - // Inform - UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + if (_tntCarry.containsKey(player)) return; - } - UtilInv.remove(player, Material.TNT, (byte) 0, 1); - UtilInv.Update(player); + event.getClickedBlock().setTypeId(0); - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + FallingBlock tnt = player.getWorld().spawnFallingBlock(player.getEyeLocation(), 46, (byte) 0); - tnt.setFuseTicks(60); - - double throwMult = 1; - - if (GetKit(player).GetName().equals("Demolitionist")) - { - throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); - } - - UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); - - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - } - - @EventHandler - public void onLaunch(ProjectileHitEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) - { - Entity shooter = (Entity) event.getEntity().getShooter(); - if (_tntCarry.contains(shooter)) - { - return; - } - Location teleport = event.getEntity().getLocation(); - teleport.setPitch(shooter.getLocation().getPitch()); - teleport.setYaw(shooter.getLocation().getYaw()); - shooter.teleport(teleport); - } - if (event.getEntity() instanceof Arrow) - { - Manager.runSyncLater(event.getEntity()::remove, 1L); - } - } - - @EventHandler - public void onOpenChest(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) - { - if (UtilPlayer.isSpectator(event.getPlayer())) - { - event.setCancelled(true); - } - } - } - - @EventHandler(ignoreCancelled = true) - public void onDamage(EntityDamageEvent event) - { - if (!IsLive()) - { - return; - } - if (event.getEntity() instanceof EnderCrystal) - { - event.setCancelled(true); - return; - } - if (event.getEntity() instanceof Zombie) - { - event.setCancelled(true); - if (event instanceof EntityDamageByEntityEvent) - { - GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); - EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; - if (e.getDamager() instanceof Player) - { - Player p = (Player) e.getDamager(); - if (UtilPlayer.isSpectator(p)) - { - return; - } - if (owner.HasPlayer(p)) - { - return; - } - if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) - { - UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); - return; - } - TeamKing king = _kings.get(owner); - if (king.handleDamage(p.getName(), e.getDamage())) - { - for (Player alert : owner.GetPlayers(true)) - { - if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) - { - alert.sendMessage(king.getName(true) + " is under attack!"); - } - } - } - } - } - } - } - - @EventHandler - public void onDrop(PlayerDropItemEvent event) - { - if (!IsLive()) - { - return; - } - - ItemStack drop = event.getItemDrop().getItemStack(); - if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) - { - event.setCancelled(true); - return; - } - - event.getItemDrop().remove(); - } - - @EventHandler - public void craftItem(PrepareItemCraftEvent event) - { - if (!IsLive()) - { - return; - } - - if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) - { - event.getInventory().setResult(_flintAndSteel.build()); - } - } - - @EventHandler - public void onInvClick(InventoryClickEvent event) - { - if (!IsLive()) - { - return; - } - ItemStack current = event.getCurrentItem(); - if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) - { - current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); - } - if (current == null || !current.hasItemMeta()) - { - return; - } - if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) - { - event.setCancelled(true); - return; - } - if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) - { - if (current.getItemMeta().hasLore()) - { - for (String lore : current.getItemMeta().getLore()) - { - if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) - { - event.setCancelled(true); - break; - } - } - } + player.eject(); + player.setPassenger(tnt); - } + _tntCarry.put(player, tnt); + + UtilPlayer.message(player, F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(player, F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); } - - @EventHandler - public void onFirstBlood(FirstBloodEvent event) - { - if (!IsLive()) - { - return; - } - - AddStat(event.getPlayer(), "FirstBlood", 1, true, false); - } - - @EventHandler - public void onPearl(PlayerInteractEvent event) - { - if (!IsLive()) - { - return; - } - - if (!UtilEvent.isAction(event, ActionType.R)) - { - return; - } - - if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) - { - Player player = (Player) event.getPlayer(); - if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) - { - event.setCancelled(true); - player.updateInventory(); - } - } - } - - @EventHandler - public void onItemDespawn(ItemDespawnEvent event) - { - if (!IsLive()) - { - return; - } - - if (_tntSpawner.isSpawned()) - { - if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) - { - event.setCancelled(true); - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onPickup(PlayerPickupItemEvent event) - { - if (!IsLive()) - { - return; - } - - if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) - { - event.setCancelled(true); - if (!_tntCarry.contains(event.getPlayer())) - { - _tntSpawner.pickup(); - _tntCarry.add(event.getPlayer()); - event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); - event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); - event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); - UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); - UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); - } - } - } - - @EventHandler(ignoreCancelled = true) + + @EventHandler(priority = EventPriority.NORMAL) public void TNTUse(PlayerInteractEvent event) { + if (event.isCancelled()) + return; + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) + return; + Player player = event.getPlayer(); - - if (!_tntCarry.contains(player)) - { + + if (!_tntCarry.containsKey(player)) return; - } - - if (!UtilEvent.isAction(event, ActionType.R)) - { - return; - } - + event.setCancelled(true); - - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - _tntCarry.remove(player); + + for (Location loc : _tntSpawns) + { + if (UtilMath.offset(player.getLocation(), loc) < 16) + { + UtilPlayer.message(player, F.main("Game", "You cannot " + F.skill("Detonate") + " so far from the Castle.")); + return; + } + } + + _tntCarry.remove(player).remove(); TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); tnt.setFuseTicks(0); UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); } - + + @EventHandler(priority = EventPriority.LOWEST) + public void TNTDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + if (!_tntCarry.containsKey(player)) + return; + + //Remove the TNT + _tntCarry.get(player).remove(); + + //Flag for Removal + _tntCarryEnd.add(player); + + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void TNTDamageDivert(ProjectileHitEvent event) + { + Iterator playerIterator = _tntCarry.keySet().iterator(); + + while (playerIterator.hasNext()) + { + Player player = playerIterator.next(); + + if (player.getPassenger() == null) + continue; + + double dist = UtilMath.offset(player.getPassenger().getLocation(), event.getEntity().getLocation().add(event.getEntity().getVelocity())); + + if (dist < 2) + { + int damage = (int) (5 * (event.getEntity().getVelocity().length() / 3d)); + + //Damage Event + Manager.GetDamage().NewDamageEvent(player, (LivingEntity)event.getEntity().getShooter(), event.getEntity(), + DamageCause.CUSTOM, damage, true, false, false, + null, GetName()); + + event.getEntity().remove(); + } + + if (_tntCarryEnd.contains(player)) + { + playerIterator.remove(); + } + } + + _tntCarryEnd.clear(); + } + + @EventHandler public void TNTExpire(UpdateEvent event) { - if (!IsLive()) - { - return; - } - if (event.getType() != UpdateType.FASTER) - { return; - } - Iterator tntIterator = _tntCarry.iterator(); + Iterator tntIterator = _tntCarry.keySet().iterator(); while (tntIterator.hasNext()) { Player player = tntIterator.next(); - - if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) + FallingBlock block = _tntCarry.get(player); + + if (player.isDead() || !block.isValid() || block.getTicksLived() > 1500) { + player.eject(); + block.remove(); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); tnt.setFuseTicks(0); - - if (!player.isDead()) - { - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - } - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - + tntIterator.remove(); continue; } - - List crystals = new ArrayList<>(); - - for (List c : _crystals.values()) - { - crystals.addAll(c); - } - for (TeamCrystal crystal : crystals) - { - if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) - { - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - - if (!player.isDead()) - { - player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); - } - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - - tntIterator.remove(); - } - } - - UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); + + //Firework UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); } } - + @EventHandler - public void onDeath(PlayerDeathEvent event) + public void TNTWeakness(ExplosionPrimeEvent event) { - Player player = event.getEntity(); - - _streakData.getOrDefault(player, new KillStreakData()).reset(); - - if (!_tntCarry.contains(player)) + Location weakness = null; + for (Location loc : _tntWeakness) { - return; + if (UtilMath.offset(loc, event.getEntity().getLocation()) < 4) + { + weakness = loc; + break; + } } - - player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); - player.removeMetadata("TNT_START", UtilServer.getPlugin()); - _tntCarry.remove(player); - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); - UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + + if (weakness == null) + return; + + _tntWeakness.remove(weakness); + + final Location extra = weakness; + + for (int i = 0; i < 10; i++) + { + Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() + { + public void run() + { + TNTPrimed tnt = extra.getWorld().spawn(extra.clone().add(3 - UtilMath.r(6), 5 + UtilMath.r(2), 3 - UtilMath.r(6)), TNTPrimed.class); + tnt.setFuseTicks(0); + tnt.setIsIncendiary(true); + } + }, i * 3); + } + + weakness.getWorld().playSound(weakness, Sound.EXPLODE, 16f, 0.8f); } - - @EventHandler - public void onBlockPlace(BlockPlaceEvent event) + + @EventHandler(priority = EventPriority.HIGH) + public void AttackerBlockBreak(org.bukkit.event.block.BlockBreakEvent event) { - if (_tntSpawner.canPlaceFireAt(event.getBlock())) + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.RED) + return; + + if (event.getBlock().getTypeId() == 85) + event.setCancelled(false); + } + + @EventHandler + public void DefenderBlockPlace(org.bukkit.event.block.BlockPlaceEvent event) + { + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.AQUA) + return; + + if (event.getBlock().getTypeId() != 85) + return; + + for (Block block : UtilBlock.getSurrounding(event.getBlock(), false)) + { + if (block.isLiquid()) + { + event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " in water.")); + } + } + + if (event.getBlockAgainst().getTypeId() == 85) { event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " on each other.")); + } + + if (_king != null && UtilMath.offset(_king.getLocation(), event.getBlock().getLocation().add(0.5, 0.5, 0.5)) < 4) + { + event.setCancelled(true); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " near " + F.elem(C.cAqua + _kingName) + ".")); } } -} \ No newline at end of file + + @EventHandler + public void DefenderBlockInteract(PlayerInteractEvent event) + { + if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) + return; + + GameTeam team = GetTeam(event.getPlayer()); + if (team == null) + return; + + if (team.GetColor() != ChatColor.AQUA) + return; + + if (event.getClickedBlock() == null || event.getClickedBlock().getTypeId() != 85) + return; + + UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, event.getClickedBlock().getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0, 1, + ViewDist.LONG, UtilServer.getPlayers()); + event.getClickedBlock().getWorld().playSound(event.getClickedBlock().getLocation(), Sound.NOTE_STICKS, 2f, 1f); + Manager.GetBlockRestore().add(event.getClickedBlock(), 0, (byte) 0, 1000); + } + + @EventHandler + public void DayTimer(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.TICK) + return; + + WorldTimeSet = (WorldTimeSet + 1); + } + + @EventHandler + public void SnowDamage(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.FAST) + return; + + for (Player player : GetPlayers(true)) + if (player.getLocation().getBlock().getTypeId() == 78) + { + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, + DamageCause.DROWNING, 2, false, true, false, + "Snow", "Snow Damage"); + + player.getWorld().playEffect(player.getLocation(), Effect.STEP_SOUND, 80); + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java deleted file mode 100644 index 76e0d0f7c..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiegeClassic.java +++ /dev/null @@ -1,973 +0,0 @@ -package nautilus.game.arcade.game.games.castlesiege; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Effect; -import org.bukkit.EntityEffect; -import org.bukkit.FireworkEffect.Type; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.entity.Creature; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Horse; -import org.bukkit.entity.Horse.Style; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.player.PlayerEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; - -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.events.PlayerGameRespawnEvent; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.TeamGame; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanKnight; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanMarksman; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitHumanPeasant; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadArcher; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadGhoul; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndeadZombie; -import nautilus.game.arcade.game.modules.compass.CompassModule; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.NullKit; -import nautilus.game.arcade.stats.BloodThirstyStatTracker; -import nautilus.game.arcade.stats.KingDamageStatTracker; -import nautilus.game.arcade.stats.KingSlayerStatTracker; -import nautilus.game.arcade.stats.TeamDeathsStatTracker; -import nautilus.game.arcade.stats.TeamKillsStatTracker; -import nautilus.game.arcade.stats.WinAsTeamStatTracker; - -public class CastleSiegeClassic extends TeamGame -{ - public static class KingDamageEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlerList() - { - return handlers; - } - - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } - - private final double _damage; - - public KingDamageEvent(Player who, double damage) - { - super(who); - - _damage = damage; - } - - public double getDamage() - { - return _damage; - } - } - - public static class KingSlaughterEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlerList() - { - return handlers; - } - - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } - - public KingSlaughterEvent(Player who) - { - super(who); - } - } - - private ArrayList _lastScoreboard = new ArrayList(); - - private long _tntSpawn = 0; - private ArrayList _tntSpawns = new ArrayList(); - private ArrayList _tntWeakness = new ArrayList(); - - private HashMap _tntCarry = new HashMap(); - private HashSet _tntCarryEnd = new HashSet(); - - private ArrayList _kingLocs; - private Creature _king; - private Location _kingLoc; - private String _kingName; - private Player _kingDamager = null; - private int _kingHealth = 40; - - private ArrayList _peasantSpawns; - private ArrayList _horseSpawns; - - public CastleSiegeClassic(ArcadeManager manager) - { - super(manager, GameType.CastleSiege, - - new Kit[] - { - new KitHumanMarksman(manager), - new KitHumanKnight(manager), - //new KitHumanBrawler(manager), - //new KitHumanAssassin(manager), - new NullKit(manager), - new KitHumanPeasant(manager), - new NullKit(manager), - new KitUndeadGhoul(manager), - new KitUndeadArcher(manager), - new KitUndeadZombie(manager), - }, - - new String[] - { - F.elem(C.cAqua + "Defenders") + C.cWhite + " must defend the King.", - F.elem(C.cAqua + "Defenders") + C.cWhite + " win when the sun rises.", - F.elem(C.cAqua + "Defenders") + C.cWhite + " respawn as wolves.", - "", - F.elem(C.cRed + "Undead") + C.cWhite + " must kill the King.", - F.elem(C.cRed + "Undead") + C.cWhite + " lose when the sun rises.", - - }); - - _help = new String[] - { - "Marksmen are extremely important to defence!", - "It's recommended 50%+ of defence are Marksmen.", - "Use Barricades to block the Undeads path.", - "Use TNT to destroy weak points in walls.", - "Weak points are marked by cracked stone brick.", - "Undead can break fences with their axes.", - "Undead Archers must pick up arrows from the ground.", - - }; - - this.StrictAntiHack = true; - - this.HungerSet = 20; - this.DeathOut = false; - this.WorldTimeSet = 14000; //14000 - this.BlockPlaceAllow.add(85); - - _kingName = C.cYellow + C.Bold + "King Sparklez"; - - GameTeam notRedTeam = null; - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() != ChatColor.RED) - { - notRedTeam = team; - break; - } - } - - registerStatTrackers( - new KingSlayerStatTracker(this), - new BloodThirstyStatTracker(this), - new KingDamageStatTracker(this), - - new TeamDeathsStatTracker(this), - new TeamKillsStatTracker(this) - ); - - registerChatStats( - Kills, - Deaths, - KDRatio, - BlankLine, - Assists, - DamageDealt, - DamageTaken - ); - - registerChatStats(); - - new CompassModule() - .setGiveCompass(true) - .setGiveCompassToSpecs(true) - .setGiveCompassToAlive(false) - .register(this); - } - - @Override - public void ParseData() - { - _tntSpawns = WorldData.GetDataLocs("RED"); - _tntWeakness = WorldData.GetDataLocs("BLACK"); - - _kingLocs = WorldData.GetDataLocs("YELLOW"); - - _peasantSpawns = WorldData.GetDataLocs("GREEN"); - _horseSpawns = WorldData.GetDataLocs("BROWN"); - } - - @Override - public void RestrictKits() - { - for (Kit kit : GetKits()) - { - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() == ChatColor.RED) - { - if (kit.GetName().contains("Castle")) - team.GetRestrictedKits().add(kit); - - team.SetName("Undead"); - } - else - { - if (kit.GetName().contains("Undead")) - team.GetRestrictedKits().add(kit); - - team.SetRespawnTime(8); - - team.SetName("Defenders"); - } - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void registerTeamTracker(GameStateChangeEvent event) - { - if (event.GetState() == GameState.Recruit) - { - GameTeam notRed = null; - - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() == ChatColor.RED) - continue; - - notRed = team; - break; - } - - if (notRed != null) - { - registerStatTrackers(new WinAsTeamStatTracker(this, notRed, "ForTheKing")); - System.out.println("Successfully registered For the King StatTrak"); - } - } - } - - @EventHandler - public void MoveKits(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; - - for (int i = 0; i < WorldData.GetDataLocs("PINK").size() && i < 3; i++) - { - if (GetKits().length <= 5 + i) - continue; - - this.CreatureAllowOverride = true; - Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("PINK").get(i)); - this.CreatureAllowOverride = false; - - Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("PINK").get(i)); - } - } - - @EventHandler - public void HorseSpawn(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; - - for (Location loc : _horseSpawns) - { - this.CreatureAllowOverride = true; - Horse horse = loc.getWorld().spawn(loc, Horse.class); - this.CreatureAllowOverride = false; - - horse.setAdult(); - horse.setAgeLock(true); - horse.setColor(org.bukkit.entity.Horse.Color.BLACK); - horse.setStyle(Style.BLACK_DOTS); - horse.setMaxDomestication(1); - horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); - horse.getInventory().setArmor(new ItemStack(Material.IRON_BARDING)); - - horse.setMaxHealth(60); - horse.setHealth(horse.getMaxHealth()); - - horse.setCustomName("War Horse"); - } - } - - @EventHandler - public void HorseInteract(PlayerInteractEntityEvent event) - { - if (!(event.getRightClicked() instanceof Horse)) - return; - - Player player = event.getPlayer(); - GameTeam team = GetTeam(player); - - if (team == null || team.GetColor() == ChatColor.RED || !IsAlive(player)) - { - event.setCancelled(true); - } - } - - @EventHandler - public void HorseDamageCancel(CustomDamageEvent event) - { - if (!(event.GetDamageeEntity() instanceof Horse)) - return; - - Player player = event.GetDamagerPlayer(true); - if (player == null) - return; - - if (!IsAlive(player)) - return; - - if (GetTeam(player) == null) - return; - - if (GetTeam(player).GetColor() == ChatColor.RED) - return; - - event.SetCancelled("Horse Team Damage"); - } - - @EventHandler(priority = EventPriority.HIGH) - public void GameStateChange(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; - - //Spawn King - this.CreatureAllowOverride = true; - - _kingLoc = _kingLocs.get(UtilMath.r(_kingLocs.size())); - - _king = (Creature) _kingLoc.getWorld().spawnEntity(_kingLoc, EntityType.ZOMBIE); - - _king.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); - _king.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); - _king.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); - _king.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); - _king.getEquipment().setItemInHand(new ItemStack(Material.DIAMOND_SWORD)); - - _king.setCustomName(_kingName); - _king.setCustomNameVisible(true); - - _king.setRemoveWhenFarAway(false); - - this.CreatureAllowOverride = false; - } - - @EventHandler(priority = EventPriority.HIGH) - public void SetDefenderRespawn(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Live) - return; - - //Change to Peasant Spawns - this.GetTeam(ChatColor.AQUA).SetSpawns(_peasantSpawns); - } - - - @EventHandler - public void KingTarget(EntityTargetEvent event) - { - event.setCancelled(true); - } - - @EventHandler - public void KingDamage(CustomDamageEvent event) - { - if (_king == null || !_king.isValid()) - return; - - if (!event.GetDamageeEntity().equals(_king)) - return; - - event.SetCancelled("King Damage"); - - Player damager = event.GetDamagerPlayer(true); - if (damager == null) return; - - GameTeam team = GetTeam(damager); - - if (team != null && team.GetColor() == ChatColor.RED) - { - if (!Recharge.Instance.use(damager, "Damage King", 400, false, false)) - return; - - if (!IsAlive(damager)) - { - return; - } - - _king.playEffect(EntityEffect.HURT); - - _kingDamager = damager; - _kingHealth--; - - Bukkit.getPluginManager().callEvent(new KingDamageEvent(damager, 1)); - - if (_kingHealth < 0) - _kingHealth = 0; - - WriteScoreboard(); - - if (_kingHealth <= 0) - _king.damage(500); - - EndCheck(); - } - } - - @EventHandler - public void KingUpdate(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.SEC) - return; - - if (_king == null) - return; - - if (UtilMath.offset(_king.getLocation(), _kingLoc) > 6) - { - _king.teleport(_kingLoc); - } - else - { - UtilEnt.CreatureMove(_king, _kingLoc, 1f); - } - } - - @EventHandler - public void PlayerDeath(PlayerGameRespawnEvent event) - { - if (GetTeam(ChatColor.AQUA).HasPlayer(event.GetPlayer())) - SetKit(event.GetPlayer(), GetKits()[3], true); - } - - @Override - @EventHandler - public void ScoreboardUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - WriteScoreboard(); - } - - public void WriteScoreboard() - { - //Get Values - HashMap _scoreGroup = new HashMap(); - _scoreGroup.put(C.cAqua + "Defenders", 0); - _scoreGroup.put(C.cDAqua + "Wolves", 0); - _scoreGroup.put(C.cRed + "Undead", 0); - - for (Player player : UtilServer.getPlayers()) - { - if (!IsAlive(player)) - continue; - - Kit kit = GetKit(player); - if (kit == null) continue; - - if (kit.GetName().contains("Castle")) - { - if (kit.GetName().contains("Wolf")) - { - _scoreGroup.put(C.cDAqua + "Wolves", 1 + _scoreGroup.get(C.cDAqua + "Wolves")); - } - else - { - _scoreGroup.put(C.cAqua + "Defenders", 1 + _scoreGroup.get(C.cAqua + "Defenders")); - } - } - else if (kit.GetName().contains("Undead")) - { - _scoreGroup.put(C.cRed + "Undead", 1 + _scoreGroup.get(C.cRed + "Undead")); - } - } - - //Wipe Last - Scoreboard.reset(); - - //Teams - for (String group : _scoreGroup.keySet()) - { - Scoreboard.writeNewLine(); - Scoreboard.write(group); - Scoreboard.write(ChatColor.getLastColors(group) + _scoreGroup.get(group) + " Players"); - } - - //King - if (_king != null && _king.isValid()) - { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "King"); - Scoreboard.write(_kingHealth + " Health"); - } - - long timeLeft = 24000 - WorldTimeSet; - timeLeft = timeLeft / 20 * 1000; - - - if (timeLeft > 0) - { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); - Scoreboard.write(UtilTime.MakeStr(timeLeft, 0)); - } - else - { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Sun Rise"); - Scoreboard.write("Undead Burning!"); - - for (Player player : GetTeam(ChatColor.RED).GetPlayers(true)) - Manager.GetCondition().Factory().Ignite("Sun Damage", player, player, 5, false, false); - } - - Scoreboard.draw(); - } - - @Override - public void EndCheck() - { - if (!IsLive()) - return; - - if (this.WorldTimeSet > 24100 || GetTeam(ChatColor.RED).GetSize() == 0) - { - SetCustomWinLine(_kingName + ChatColor.RESET + " has survived the siege!"); - - AnnounceEnd(GetTeam(ChatColor.AQUA)); - - for (GameTeam team : GetTeamList()) - { - if (WinnerTeam != null && team.equals(WinnerTeam)) - { - for (Player player : team.GetPlayers(false)) - { - AddGems(player, 10, "Winning Team", false, false); - } - } - - for (Player player : team.GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - } - - SetState(GameState.End); - } - - if (!_king.isValid() || GetTeam(ChatColor.AQUA).GetSize() == 0) - { - if (_kingDamager != null) - { - SetCustomWinLine(C.cRed + _kingDamager.getName() + C.cWhite + " slaughtered " + _kingName + ChatColor.RESET + "!"); - AddGems(_kingDamager, 20, "King Slayer", false, false); - - Bukkit.getPluginManager().callEvent(new KingSlaughterEvent(_kingDamager)); - } - else - SetCustomWinLine(_kingName + ChatColor.RESET + " has died!"); - - AnnounceEnd(GetTeam(ChatColor.RED)); - - for (GameTeam team : GetTeamList()) - { - if (WinnerTeam != null && team.equals(WinnerTeam)) - { - for (Player player : team.GetPlayers(false)) - { - AddGems(player, 10, "Winning Team", false, false); - } - } - - for (Player player : team.GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - } - - SetState(GameState.End); - } - } - - @EventHandler - public void TNTSpawn(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.SEC) - return; - - if (!UtilTime.elapsed(this.GetStateTime(), 20000)) - return; - - if (!UtilTime.elapsed(_tntSpawn, 25000)) - return; - - if (_tntSpawns.isEmpty()) - return; - - Location loc = _tntSpawns.get(UtilMath.r(_tntSpawns.size())); - - if (loc.getBlock().getTypeId() == 46) - return; - - loc.getBlock().setTypeId(46); - _tntSpawn = System.currentTimeMillis(); - } - - @EventHandler(priority = EventPriority.LOW) - public void TNTPickup(PlayerInteractEvent event) - { - if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_BLOCK) - return; - - if (event.getClickedBlock().getTypeId() != 46) - return; - - event.setCancelled(true); - - Player player = event.getPlayer(); - - if (!IsAlive(player)) - return; - - if (!GetTeam(ChatColor.RED).HasPlayer(player)) - return; - - if (_tntCarry.containsKey(player)) - return; - - event.getClickedBlock().setTypeId(0); - - FallingBlock tnt = player.getWorld().spawnFallingBlock(player.getEyeLocation(), 46, (byte) 0); - - player.eject(); - player.setPassenger(tnt); - - _tntCarry.put(player, tnt); - - UtilPlayer.message(player, F.main("Game", "You picked up " + F.skill("TNT") + ".")); - UtilPlayer.message(player, F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); - } - - @EventHandler(priority = EventPriority.NORMAL) - public void TNTUse(PlayerInteractEvent event) - { - if (event.isCancelled()) - return; - - if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) - return; - - Player player = event.getPlayer(); - - if (!_tntCarry.containsKey(player)) - return; - - event.setCancelled(true); - - for (Location loc : _tntSpawns) - { - if (UtilMath.offset(player.getLocation(), loc) < 16) - { - UtilPlayer.message(player, F.main("Game", "You cannot " + F.skill("Detonate") + " so far from the Castle.")); - return; - } - } - - _tntCarry.remove(player).remove(); - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void TNTDeath(PlayerDeathEvent event) - { - Player player = event.getEntity(); - - if (!_tntCarry.containsKey(player)) - return; - - //Remove the TNT - _tntCarry.get(player).remove(); - - //Flag for Removal - _tntCarryEnd.add(player); - - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - tnt.setFuseTicks(0); - UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void TNTDamageDivert(ProjectileHitEvent event) - { - Iterator playerIterator = _tntCarry.keySet().iterator(); - - while (playerIterator.hasNext()) - { - Player player = playerIterator.next(); - - if (player.getPassenger() == null) - continue; - - double dist = UtilMath.offset(player.getPassenger().getLocation(), event.getEntity().getLocation().add(event.getEntity().getVelocity())); - - if (dist < 2) - { - int damage = (int) (5 * (event.getEntity().getVelocity().length() / 3d)); - - //Damage Event - Manager.GetDamage().NewDamageEvent(player, (LivingEntity)event.getEntity().getShooter(), event.getEntity(), - DamageCause.CUSTOM, damage, true, false, false, - null, GetName()); - - event.getEntity().remove(); - } - - if (_tntCarryEnd.contains(player)) - { - playerIterator.remove(); - } - } - - _tntCarryEnd.clear(); - } - - - @EventHandler - public void TNTExpire(UpdateEvent event) - { - if (event.getType() != UpdateType.FASTER) - return; - - Iterator tntIterator = _tntCarry.keySet().iterator(); - - while (tntIterator.hasNext()) - { - Player player = tntIterator.next(); - FallingBlock block = _tntCarry.get(player); - - if (player.isDead() || !block.isValid() || block.getTicksLived() > 1500) - { - player.eject(); - block.remove(); - - TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); - tnt.setFuseTicks(0); - - tntIterator.remove(); - continue; - } - - //Firework - UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); - } - } - - @EventHandler - public void TNTWeakness(ExplosionPrimeEvent event) - { - Location weakness = null; - for (Location loc : _tntWeakness) - { - if (UtilMath.offset(loc, event.getEntity().getLocation()) < 4) - { - weakness = loc; - break; - } - } - - if (weakness == null) - return; - - _tntWeakness.remove(weakness); - - final Location extra = weakness; - - for (int i = 0; i < 10; i++) - { - Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() - { - public void run() - { - TNTPrimed tnt = extra.getWorld().spawn(extra.clone().add(3 - UtilMath.r(6), 5 + UtilMath.r(2), 3 - UtilMath.r(6)), TNTPrimed.class); - tnt.setFuseTicks(0); - tnt.setIsIncendiary(true); - } - }, i * 3); - } - - weakness.getWorld().playSound(weakness, Sound.EXPLODE, 16f, 0.8f); - } - - @EventHandler(priority = EventPriority.HIGH) - public void AttackerBlockBreak(org.bukkit.event.block.BlockBreakEvent event) - { - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - return; - - if (team.GetColor() != ChatColor.RED) - return; - - if (event.getBlock().getTypeId() == 85) - event.setCancelled(false); - } - - @EventHandler - public void DefenderBlockPlace(org.bukkit.event.block.BlockPlaceEvent event) - { - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - return; - - if (team.GetColor() != ChatColor.AQUA) - return; - - if (event.getBlock().getTypeId() != 85) - return; - - for (Block block : UtilBlock.getSurrounding(event.getBlock(), false)) - { - if (block.isLiquid()) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " in water.")); - } - } - - if (event.getBlockAgainst().getTypeId() == 85) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " on each other.")); - } - - if (_king != null && UtilMath.offset(_king.getLocation(), event.getBlock().getLocation().add(0.5, 0.5, 0.5)) < 4) - { - event.setCancelled(true); - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.elem("Barricade") + " near " + F.elem(C.cAqua + _kingName) + ".")); - } - } - - @EventHandler - public void DefenderBlockInteract(PlayerInteractEvent event) - { - if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) - return; - - GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - return; - - if (team.GetColor() != ChatColor.AQUA) - return; - - if (event.getClickedBlock() == null || event.getClickedBlock().getTypeId() != 85) - return; - - UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, event.getClickedBlock().getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0, 1, - ViewDist.LONG, UtilServer.getPlayers()); - event.getClickedBlock().getWorld().playSound(event.getClickedBlock().getLocation(), Sound.NOTE_STICKS, 2f, 1f); - Manager.GetBlockRestore().add(event.getClickedBlock(), 0, (byte) 0, 1000); - } - - @EventHandler - public void DayTimer(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.TICK) - return; - - WorldTimeSet = (WorldTimeSet + 1); - } - - @EventHandler - public void SnowDamage(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.FAST) - return; - - for (Player player : GetPlayers(true)) - if (player.getLocation().getBlock().getTypeId() == 78) - { - //Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.DROWNING, 2, false, true, false, - "Snow", "Snow Damage"); - - player.getWorld().playEffect(player.getLocation(), Effect.STEP_SOUND, 80); - } - } -} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java similarity index 90% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java index 0adab2c1b..6c4da8994 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHuman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHuman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.KitAvailability; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java index e1387e91f..ec8a3ddbc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanKnight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanKnight.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import mineplex.core.common.util.C; import mineplex.core.common.util.F; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java index d2687a1ea..fcd021465 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanMarksman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanMarksman.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import org.bukkit.Material; import org.bukkit.entity.EntityType; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java index a59843e3e..c1ec3e24f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitHumanPeasant.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanPeasant.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import mineplex.core.disguise.disguises.DisguiseWolf; import mineplex.core.itemstack.ItemStackFactory; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java similarity index 93% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java index 035385d90..31db5ed38 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndead.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndead.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.KitAvailability; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java similarity index 97% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java index 481b7249e..ebdefc25a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadArcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadArcher.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilInv; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java index ec56ec3f4..1c893a7a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadGhoul.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadGhoul.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import mineplex.core.common.util.C; import mineplex.core.disguise.disguises.DisguisePigZombie; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java similarity index 96% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java index f45fc539f..9d9eb4b75 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/classickits/KitUndeadZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitUndeadZombie.java @@ -1,4 +1,4 @@ -package nautilus.game.arcade.game.games.castlesiege.classickits; +package nautilus.game.arcade.game.games.castlesiege.kits; import mineplex.core.common.util.C; import mineplex.core.disguise.disguises.DisguiseZombie; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java index 82ea187e8..c6df42427 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BloodThirstyStatTracker.java @@ -11,7 +11,7 @@ import org.bukkit.event.EventPriority; import mineplex.core.common.util.UtilPlayer; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.classickits.KitUndead; +import nautilus.game.arcade.game.games.castlesiege.kits.KitUndead; import nautilus.game.arcade.game.games.hideseek.kits.KitSeeker; public class BloodThirstyStatTracker extends StatTracker diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java index bf5053000..5b84ac9af 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingDamageStatTracker.java @@ -10,20 +10,20 @@ import org.bukkit.event.EventPriority; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.CastleSiegeClassic; +import nautilus.game.arcade.game.games.castlesiege.CastleSiege; -public class KingDamageStatTracker extends StatTracker +public class KingDamageStatTracker extends StatTracker { private final Map _kingDamage = new HashMap<>(); private double _totalKingDamage = 0; - public KingDamageStatTracker(CastleSiegeClassic game) + public KingDamageStatTracker(CastleSiege game) { super(game); } @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void onKingDamage(CastleSiegeClassic.KingDamageEvent event) + public void onKingDamage(CastleSiege.KingDamageEvent event) { if (getGame().GetState() != Game.GameState.Live) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java index 8f3e7f287..c229272e5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/KingSlayerStatTracker.java @@ -3,7 +3,7 @@ package nautilus.game.arcade.stats; import org.bukkit.event.EventHandler; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.castlesiege.CastleSiegeClassic; +import nautilus.game.arcade.game.games.castlesiege.CastleSiege; public class KingSlayerStatTracker extends StatTracker { @@ -13,7 +13,7 @@ public class KingSlayerStatTracker extends StatTracker } @EventHandler - public void onKingSlaughtered(CastleSiegeClassic.KingSlaughterEvent event) + public void onKingSlaughtered(CastleSiege.KingSlaughterEvent event) { if (getGame().GetState() != Game.GameState.Live) return; From 79560fd415912a3c4e5968dea1576dee07f7ca73 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 17:24:12 -0400 Subject: [PATCH 074/170] Implement Castle Assault into the selection compass and re-add old Castle Siege --- .../mineplex/hub/server/ServerManager.java | 5 ++++ .../hub/server/ui/ServerGameMenu.java | 27 ++++++++++++++----- .../hub/server/ui/button/SelectCAButton.java | 23 ++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index a305c124b..f72c95a65 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -787,6 +787,11 @@ public class ServerManager extends MiniPlugin implements BrawlShopProvider { return _statusManager; } + + public ShopBase getCastleAssaultShop() + { + return _serverNpcShopMap.get("Castle Assault"); + } public ShopBase getCastleSiegeShop() { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java index 79d186558..00498e1d3 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -21,6 +21,7 @@ import mineplex.hub.server.ui.button.SelectBHButton; import mineplex.hub.server.ui.button.SelectBLDButton; import mineplex.hub.server.ui.button.SelectBRButton; import mineplex.hub.server.ui.button.SelectBawkButton; +import mineplex.hub.server.ui.button.SelectCAButton; import mineplex.hub.server.ui.button.SelectCLANSButton; import mineplex.hub.server.ui.button.SelectCSButton; import mineplex.hub.server.ui.button.SelectCTFButton; @@ -63,14 +64,22 @@ public class ServerGameMenu extends ShopPageBase { add(1, Material.EGG, C.cYellowB + "Bawk Bawk Battles " + C.cGray + "Challenges", new String[] { - (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", C.Reset + "", C.Reset + "Follow Bawk Bawk's instructions", C.Reset + "Complete different tasks", C.Reset + "If you lose, chickens will devour you!" }, "BBB", "Bawk_Bawk_Battles", new SelectBawkButton(this)); + + add(3, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault " + C.cGray + "Fast Paced PvP", new String[] + { + (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", + C.Reset + "", + C.Reset + "Combatants must battle to", + C.Reset + "win the day for their king", + C.Reset + "at all costs!", + }, "CA", "Castle_Assault", new SelectCAButton(this)); - add(4, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] + add(5, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] { C.Reset + "", C.Reset + "Memorize Gwen the Guardian's builds", @@ -154,13 +163,12 @@ public class ServerGameMenu extends ShopPageBase C.Reset + "last man standing.", }, "TDM", "Team_Deathmatch", new SelectTDMButton(this)); - add(24, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Siege " + C.cGray + "Fast-Paced PvP", new String[] + add(24, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Siege " + C.cGray + "Team Game", new String[] { - (_extraValue ? C.cAquaB : C.cWhiteB) + "MAJOR UPDATE/REWRITE", C.Reset + "", - C.Reset + "Combatants must battle to", - C.Reset + "win the day for their king", - C.Reset + "at all costs!", + C.Reset + "Defenders must protect King Sparklez", + C.Reset + "from the endless waves of Undead", + C.Reset + "until the sun rises!", }, "CS", "Castle_Siege", new SelectCSButton(this)); add(26, Material.GRASS, C.cYellowB + "Block Hunt " + C.cGray + "Cat and Mouse", new String[] @@ -632,6 +640,11 @@ public class ServerGameMenu extends ShopPageBase { getPlugin().getCtfShop().attemptShopOpen(player); } + + public void openCA(Player player) + { + getPlugin().getCastleAssaultShop().attemptShopOpen(player); + } public void openCS(Player player) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java new file mode 100644 index 000000000..6ab3a36c8 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java @@ -0,0 +1,23 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectCAButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectCAButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.openCA(player); + } +} From 834c537bc8f76cdeebea820ee9e93c30dbc9f22a Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 8 May 2017 23:22:48 -0400 Subject: [PATCH 075/170] Block spectators obtaining TNT --- .../game/arcade/game/games/castleassault/CastleAssault.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index d327f19d4..0399abe55 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -1298,6 +1298,10 @@ public class CastleAssault extends TeamGame { return; } + if (UtilPlayer.isSpectator(event.getPlayer())) + { + return; + } if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) { From 9d3957cd54767847fe7ccc3e975178994474a3bd Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 May 2017 16:27:06 +0100 Subject: [PATCH 076/170] Increase time after switching servers to kick player --- .../src/mineplex/gemhunters/economy/CashOutModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java index 88a603396..28c029fe1 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java @@ -164,7 +164,7 @@ public class CashOutModule extends MiniPlugin { kickPlayer(player); } - }, 20); + }, 50); } } } From 1fbeaa6ecdf5704cefffa6a0f34aed74b271a409 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 May 2017 16:27:21 +0100 Subject: [PATCH 077/170] Add a random teleport npc in the safezones --- .../gemhunters/spawn/SpawnModule.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java index edb9c4fe2..3473812f2 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java @@ -152,6 +152,24 @@ public class SpawnModule extends MiniPlugin new SimpleNPC(_plugin, location, Villager.class, C.cGoldB + "Gem Hunters Tutorial", null); } + { + for (Location location : _worldData.getCustomLocation("RANDOM_TELEPORT")) + { + new SimpleNPC(_plugin, location, Villager.class, C.cYellowB + "Random Teleport", clicker -> + { + + Location toTeleport = getRandomLocation(); + + if (toTeleport == null) + { + clicker.sendMessage(F.main(_moduleName, "A suitable teleport location could not be found. Please try again in a few seconds.")); + return; + } + + clicker.teleport(toTeleport); + }); + } + } } @EventHandler @@ -174,7 +192,7 @@ public class SpawnModule extends MiniPlugin Block up = block.getRelative(BlockFace.UP); Block down = block.getRelative(BlockFace.DOWN); - if (block.getType() != Material.AIR || down.getType() == Material.AIR || UtilBlock.liquid(down) || UtilBlock.liquid(up) || UtilBlock.liquid(block) || _safezone.isInSafeZone(block.getLocation()) || block.getLocation().getBlockY() > MAX_SPAWNING_Y) + if (block.getType() != Material.AIR || down.getType() == Material.AIR || down.getType() == Material.LEAVES || up.getType() == Material.LEAVES || UtilBlock.liquid(down) || UtilBlock.liquid(up) || UtilBlock.liquid(block) || _safezone.isInSafeZone(block.getLocation()) || block.getLocation().getBlockY() > MAX_SPAWNING_Y) { return false; } From 26df99a4cfa626c953710a13c1bb55f1fa6f466a Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 May 2017 16:27:43 +0100 Subject: [PATCH 078/170] Don't spawn combat NPCs in the lobby --- .../mineplex/gemhunters/safezone/SafezoneModule.java | 12 ++++++++++++ .../src/mineplex/gemhunters/shop/ShopModule.java | 6 +----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java index b9e1ce380..627581b5b 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.UUID; import mineplex.core.recharge.Recharge; +import mineplex.gemhunters.death.event.QuitNPCSpawnEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.HumanEntity; @@ -130,6 +131,17 @@ public class SafezoneModule extends MiniPlugin _currentSafezone.remove(player.getUniqueId()); } + @EventHandler + public void quitNpcSpawn(QuitNPCSpawnEvent event) + { + String safezone = getSafezone(event.getPlayer().getLocation()); + + if (safezone != null && safezone.contains(SAFEZONE_DATA_IGNORE)) + { + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.HIGHEST) public void entityDamage(EntityDamageEvent event) { diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java index cfe5b13cb..59707f452 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java @@ -77,7 +77,7 @@ public class ShopModule extends MiniPlugin _npcs = new ArrayList<>(); _spawnedIndexes = new HashMap<>(); - runSyncLater(() -> updateVillagerTrades(), 20); + runSyncLater(this::updateVillagerTrades, 20); } public void updateVillagerTrades() @@ -111,8 +111,6 @@ public class ShopModule extends MiniPlugin { SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); } - - continue; } } continue; @@ -135,8 +133,6 @@ public class ShopModule extends MiniPlugin { SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); } - - continue; } } From 10b0f1e1edf3c33cccad0344e0004fc1c5da7578 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 May 2017 16:27:56 +0100 Subject: [PATCH 079/170] Add an armour decay for offline players --- .../mineplex/gemhunters/join/JoinModule.java | 22 +++++++++++++++++++ .../persistence/PersistenceData.java | 8 ++++++- .../persistence/PersistenceModule.java | 5 ++++- .../persistence/PersistenceRepository.java | 22 +++++++++++++++---- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java index deb3644d7..88c8ec574 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -18,7 +18,10 @@ import mineplex.gemhunters.spawn.SpawnModule; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import java.awt.*; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @ReflectivelyCreateMiniPlugin @@ -61,6 +64,7 @@ public class JoinModule extends MiniPlugin player.setMaxHealth(data.getMaxHealth()); player.setFoodLevel(data.getHunger()); player.getInventory().addItem(data.getItems()); + loseDurability(data.getArmour(), data.getSaveTime()); player.getInventory().setArmorContents(data.getArmour()); _inventory.unlockSlots(player, data.getSlots(), false); }); @@ -86,4 +90,22 @@ public class JoinModule extends MiniPlugin }); } + private void loseDurability(ItemStack[] items, long time) + { + long diff = System.currentTimeMillis() - time; + long hours = TimeUnit.MILLISECONDS.toHours(diff); + + for (ItemStack item : items) + { + short max = item.getType().getMaxDurability(); + short change = (short) ((max / 100D) * hours); + + if (item.getDurability() + change > max * 0.15) + { + continue; + } + + item.setDurability((short) (item.getDurability() + change)); + } + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java index dc8fe78ed..01dd83737 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java @@ -16,8 +16,9 @@ public class PersistenceData private final int _slots; private final ItemStack[] _items; private final ItemStack[] _armour; + private final long _saveTime; - public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour) + public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour, long saveTime) { _gems = gems; _location = location; @@ -28,6 +29,7 @@ public class PersistenceData _items = items; _slots = slots; _armour = armour; + _saveTime = saveTime; } public int getGems() @@ -75,4 +77,8 @@ public class PersistenceData return _armour; } + public long getSaveTime() + { + return _saveTime; + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index 657cf4431..3c72dda1d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -23,7 +23,9 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import org.jooq.util.derby.sys.Sys; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -92,8 +94,9 @@ public class PersistenceModule extends MiniPlugin int slots = _inventory.getSlots(player); ItemStack[] items = player.getInventory().getContents(); ItemStack[] armour = player.getInventory().getArmorContents(); + long saveTime = System.currentTimeMillis(); - PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour); + PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour, saveTime); runAsync(() -> { diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java index ab34b4bab..88c734add 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java @@ -6,6 +6,7 @@ import mineplex.gemhunters.quest.QuestPlayerData; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; import mineplex.serverdata.database.column.ColumnInt; +import mineplex.serverdata.database.column.ColumnTimestamp; import mineplex.serverdata.database.column.ColumnVarChar; import net.minecraft.server.v1_8_R3.ItemMapEmpty; import org.bukkit.Bukkit; @@ -14,8 +15,11 @@ import org.bukkit.Material; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.jooq.util.derby.sys.Sys; import java.lang.reflect.Constructor; +import java.sql.Time; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -25,8 +29,8 @@ public class PersistenceRepository extends RepositoryBase { private static final String GET_DATA = "SELECT * FROM gemHunters WHERE accountId=?;"; - private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; - private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=? WHERE accountId=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=?,saveTime=? WHERE accountId=?;"; private static final String DELETE_DATA = "DELETE FROM gemHunters WHERE accountId=?;"; private static final Gson GSON; private static final ItemStack AIR = new ItemStack(Material.AIR); @@ -98,10 +102,17 @@ public class PersistenceRepository extends RepositoryBase armourList.add(CraftItemStack.deserialize(map)); } + Timestamp saveTime = resultSet.getTimestamp("saveTime"); + + if (saveTime == null) + { + saveTime = new Timestamp(System.currentTimeMillis()); + } + _exists.add(accountId); Location location = new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch); - PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0])); + PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0]), saveTime.getTime()); response.accept(data); } }, new ColumnInt("accountId", accountId)); @@ -125,6 +136,7 @@ public class PersistenceRepository extends RepositoryBase ItemStack[] armour = data.getArmour(); List> itemsMap = new ArrayList<>(items.length); List> armourMap = new ArrayList<>(armour.length); + Timestamp saveTime = new Timestamp(data.getSaveTime()); for (ItemStack itemStack : items) { @@ -162,6 +174,7 @@ public class PersistenceRepository extends RepositoryBase new ColumnInt("slots", slots), new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), + new ColumnTimestamp("saveTime", saveTime), new ColumnInt("accountId", accountId) ); } @@ -181,7 +194,8 @@ public class PersistenceRepository extends RepositoryBase new ColumnVarChar("quests", 500, GSON.toJson(data.getQuestData())), new ColumnInt("slots", slots), new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), - new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)) + new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), + new ColumnTimestamp("saveTime", saveTime) ); } From f2ff546d476e5826fdc330e7a98d25736c3288f2 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Tue, 9 May 2017 20:35:48 -0400 Subject: [PATCH 080/170] Clean up game classes a bit --- .../games/castleassault/CastleAssault.java | 97 +++-- .../games/castleassault/CastleAssaultTDM.java | 358 +++++++----------- 2 files changed, 183 insertions(+), 272 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 0399abe55..c4cb2618a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -75,7 +75,6 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.EnchantedBookBuilder; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.leaderboard.Leaderboard; import mineplex.core.leaderboard.LeaderboardManager; @@ -125,16 +124,10 @@ public class CastleAssault extends TeamGame private List _chests = new ArrayList<>(); - private ChestLoot _diamondGearCommon = new ChestLoot(true); - private ChestLoot _diamondGearRare = new ChestLoot(true); - private ChestLoot _weaponGearCommon = new ChestLoot(true); - private ChestLoot _weaponGearRare = new ChestLoot(true); private ChestLoot _rangedGear = new ChestLoot(true); private ChestLoot _rodsAndGaps = new ChestLoot(true); private ChestLoot _potionGearCommon = new ChestLoot(true); private ChestLoot _potionGearRare = new ChestLoot(true); - private ChestLoot _enchantGearCommon = new ChestLoot(true); - private ChestLoot _enchantGearRare = new ChestLoot(true); private ChestLoot _miscGear = new ChestLoot(); private ObjectiveTNTSpawner _tntSpawner; @@ -236,37 +229,6 @@ public class CastleAssault extends TeamGame private void generateLoot() { - { - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - } - { - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - } - { - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); - } - { - _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); - } { _rangedGear.addLoot(new ItemStack(Material.BOW), 3); _rangedGear.addLoot(Material.ARROW, 3, 8, 16); @@ -283,15 +245,6 @@ public class CastleAssault extends TeamGame _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); } - { - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); - _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); - } - { - _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); - } { _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); @@ -602,10 +555,29 @@ public class CastleAssault extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } KitPlayer kit = (KitPlayer) GetKit(player); @@ -651,10 +623,29 @@ public class CastleAssault extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } KitPlayer kit = (KitPlayer) GetKit(player); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index a64fff374..2fc876a00 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.WeakHashMap; import org.bukkit.Bukkit; @@ -15,6 +14,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Entity; import org.bukkit.entity.ItemFrame; @@ -26,6 +26,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockDispenseEvent; import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; @@ -45,6 +46,8 @@ import org.bukkit.material.Dispenser; import org.bukkit.material.MaterialData; import org.bukkit.metadata.MetadataValue; +import mineplex.core.Managers; +import mineplex.core.common.Pair; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; @@ -56,8 +59,10 @@ import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.EnchantedBookBuilder; import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -73,9 +78,6 @@ import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.GemData; import nautilus.game.arcade.game.TeamGame; import nautilus.game.arcade.game.games.castleassault.data.KillStreakData; -import nautilus.game.arcade.game.games.castleassault.data.medals.MedalData; -import nautilus.game.arcade.game.games.castleassault.data.medals.MedalData.MedalLevel; -import nautilus.game.arcade.game.games.castleassault.data.medals.MedalType; import nautilus.game.arcade.game.games.castleassault.kits.KitArcher; import nautilus.game.arcade.game.games.castleassault.kits.KitDemolitionist; import nautilus.game.arcade.game.games.castleassault.kits.KitFighter; @@ -83,6 +85,7 @@ import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; import nautilus.game.arcade.game.games.castleassault.kits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; public class CastleAssaultTDM extends TeamGame { @@ -95,22 +98,14 @@ public class CastleAssaultTDM extends TeamGame private ItemBuilder _flintAndSteel; private Map _streakData = new WeakHashMap<>(); - private Map _medalData = new WeakHashMap<>(); private Map _teamKills = new HashMap<>(); private List _chests = new ArrayList<>(); - private ChestLoot _diamondGearCommon = new ChestLoot(true); - private ChestLoot _diamondGearRare = new ChestLoot(true); - private ChestLoot _weaponGearCommon = new ChestLoot(true); - private ChestLoot _weaponGearRare = new ChestLoot(true); private ChestLoot _rangedGear = new ChestLoot(true); private ChestLoot _rodsAndGaps = new ChestLoot(true); private ChestLoot _potionGearCommon = new ChestLoot(true); private ChestLoot _potionGearRare = new ChestLoot(true); - //private ChestLoot _blockGear = new ChestLoot(); - private ChestLoot _enchantGearCommon = new ChestLoot(true); - private ChestLoot _enchantGearRare = new ChestLoot(true); private ChestLoot _miscGear = new ChestLoot(); private boolean _writeScoreboard = true; @@ -149,7 +144,9 @@ public class CastleAssaultTDM extends TeamGame this.AllowFlintAndSteel = true; this.BlockPlaceAllow.add(Material.FIRE.getId()); this.CrownsEnabled = true; + this.Leaderboards = true; this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; new CompassModule() .setGiveCompass(true) @@ -159,95 +156,38 @@ public class CastleAssaultTDM extends TeamGame _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); generateLoot(); - } - - private Player[] getMedalOwners(MedalType type) - { - Player gold = null; - Double goldScore = 0D; - Player silver = null; - Double silverScore = 0D; - Player bronze = null; - Double bronzeScore = 0D; - //GOLD - for (Entry scores : _medalData.entrySet()) + if (manager.IsRewardStats()) { - if (scores.getValue().getScore(type) > goldScore) + if (manager.GetLobby() instanceof NewGameLobbyManager) { - gold = scores.getKey(); - goldScore = scores.getValue().getScore(type); + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + } } } - - //SILVER - for (Entry scores : _medalData.entrySet()) - { - if (gold != null && gold.getName().equals(scores.getKey().getName())) - { - continue; - } - if (scores.getValue().getScore(type) > silverScore) - { - silver = scores.getKey(); - silverScore = scores.getValue().getScore(type); - } - } - - //BRONZE - for (Entry scores : _medalData.entrySet()) - { - if (gold != null && gold.getName().equals(scores.getKey().getName())) - { - continue; - } - if (silver != null && silver.getName().equals(scores.getKey().getName())) - { - continue; - } - if (scores.getValue().getScore(type) > bronzeScore) - { - bronze = scores.getKey(); - bronzeScore = scores.getValue().getScore(type); - } - } - - return new Player[] {gold, silver, bronze}; } private void generateLoot() { - { - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_HELMET), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_CHESTPLATE), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_LEGGINGS), 2); - _diamondGearCommon.addLoot(new ItemStack(Material.DIAMOND_BOOTS), 2); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - _diamondGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_PROJECTILE, 3).build(), 1); - } - { - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - _diamondGearRare.addLoot(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 4).build(), 1); - } - { - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).build(), 2); - _weaponGearCommon.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).build(), 2); - } - { - _weaponGearRare.addLoot(new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).build(), 1); - } { _rangedGear.addLoot(new ItemStack(Material.BOW), 3); _rangedGear.addLoot(Material.ARROW, 3, 8, 16); @@ -264,19 +204,6 @@ public class CastleAssaultTDM extends TeamGame _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); } - /*{ - _blockGear.addLoot(new ItemStack(Material.STONE, 64), 2); - _blockGear.addLoot(new ItemStack(Material.WOOD, 64), 2); - }*/ - { - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build(), 2); - _enchantGearCommon.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_DAMAGE, 1).build(), 2); - _enchantGearCommon.addLoot(new ItemStack(Material.EXP_BOTTLE, 64), 1); - } - { - _enchantGearRare.addLoot(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build(), 1); - } { _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); _miscGear.addLoot(new ItemBuilder(Material.TNT, 4).setTitle(F.item("Throwing TNT")).build(), 2); @@ -318,23 +245,7 @@ public class CastleAssaultTDM extends TeamGame if (chance <= 0.3) { loot = _rangedGear; - }/* - if (chance <= 0.4) - { - loot = _weaponGearCommon; - if (subChance <= 0.4) - { - loot = _weaponGearRare; - } } - if (chance <= 0.3) - { - loot = _diamondGearCommon; - if (subChance <= 0.3) - { - loot = _diamondGearRare; - } - }*/ chest.getBlockInventory().setItem(slot, loot.getLoot()); } } @@ -380,8 +291,8 @@ public class CastleAssaultTDM extends TeamGame _writeScoreboard = false; Scoreboard.reset(); Scoreboard.writeNewLine(); - Scoreboard.write(winner + C.cBlue + " has won"); - Scoreboard.write(C.cBlue + "with " + C.cGreen + kills + C.cBlue + " kills!"); + Scoreboard.write(winner + C.cWhite + " has won"); + Scoreboard.write(C.cWhite + "with " + C.cGreen + kills + C.cWhite + " kills!"); Scoreboard.writeNewLine(); Scoreboard.draw(); @@ -401,6 +312,19 @@ public class CastleAssaultTDM extends TeamGame _teamKills.put(red, 0); GameTeam blue = GetTeam(ChatColor.AQUA); _teamKills.put(blue, 0); + this.CreatureAllowOverride = true; + int kitIndex = 0; + for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + { + if (kitIndex >= GetKits().length) + { + kitIndex = 0; + } + Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); + Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); + kitIndex++; + } + this.CreatureAllowOverride = false; } @Override @@ -429,34 +353,6 @@ public class CastleAssaultTDM extends TeamGame GameTeam winner = teamsAlive.get(0); AnnounceEnd(winner); writeFinalScoreboard(winner.GetColor() + winner.GetName(), _teamKills.get(winner)); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -474,10 +370,29 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } if (GetKit(player) != null) @@ -529,34 +444,6 @@ public class CastleAssaultTDM extends TeamGame { AnnounceEnd(blue); writeFinalScoreboard(blue.GetColor() + blue.GetName(), _teamKills.get(blue)); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -574,10 +461,29 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } KitPlayer kit = (KitPlayer) GetKit(player); @@ -601,34 +507,6 @@ public class CastleAssaultTDM extends TeamGame { AnnounceEnd(red); writeFinalScoreboard(red.GetColor() + red.GetName(), _teamKills.get(red)); - boolean announcedMedalStart = false; - for (MedalType type : MedalType.values()) - { - Player[] rewarding = getMedalOwners(type); - if (rewarding[0] != null) - { - if (!announcedMedalStart) - { - announcedMedalStart = true; - Bukkit.broadcastMessage(C.cGoldB + "-==Match Medal Recipients==-"); - } - AddGems(rewarding[0], 50, MedalLevel.GOLD.getName() + " " + type.getName(), false, false); - AddStat(rewarding[0], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.GOLD.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.GOLD.getColor() + rewarding[0].getName()); - } - if (rewarding[1] != null) - { - AddGems(rewarding[1], 30, MedalLevel.SILVER.getName() + " " + type.getName(), false, false); - AddStat(rewarding[1], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.SILVER.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.SILVER.getColor() + rewarding[1].getName()); - } - if (rewarding[2] != null) - { - AddGems(rewarding[2], 20, MedalLevel.BRONZE.getName() + " " + type.getName(), false, false); - AddStat(rewarding[2], "Medalist", 1, false, false); - Bukkit.broadcastMessage(MedalLevel.BRONZE.getName() + " " + type.getName() + C.cGray + ": " + MedalLevel.BRONZE.getColor() + rewarding[2].getName()); - } - } for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) @@ -646,10 +524,29 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } - int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); - if (streak > 0) { - AddGems(player, streak, streak + " Player Kill Streak", false, false); + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } } KitPlayer kit = (KitPlayer) GetKit(player); @@ -697,6 +594,10 @@ public class CastleAssaultTDM extends TeamGame Manager.GetDamage().SetEnabled(true); Manager.GetExplosion().setEnabled(true); Manager.GetCreature().SetDisableCustomDrops(false); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_KILLS"); } } @@ -757,6 +658,23 @@ public class CastleAssaultTDM extends TeamGame { event.setCancelled(true); } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } } @SuppressWarnings("deprecation") @@ -871,7 +789,6 @@ public class CastleAssaultTDM extends TeamGame } AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); - _medalData.computeIfAbsent(player, key -> new MedalData()).addScore(MedalType.ELIM, 1D); _teamKills.merge(GetTeam(player), 1, Integer::sum); if (UtilPlayer.isSpectator(player)) @@ -886,7 +803,6 @@ public class CastleAssaultTDM extends TeamGame if (data.addKill(hardLine)) { AddStat(player, "KillStreak", 1, false, false); - player.sendMessage(C.cRedB + "You have received a Kill Streak Reward!"); ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); } if (UtilMath.isEven(data.getKills())) @@ -1029,6 +945,10 @@ public class CastleAssaultTDM extends TeamGame teleport.setYaw(shooter.getLocation().getYaw()); shooter.teleport(teleport); } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } } @EventHandler From 3b3436d1af8b6339deff6229ae908851d418bee4 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Wed, 10 May 2017 02:06:25 -0400 Subject: [PATCH 081/170] Remove TNT from TDM chest loot --- .../game/arcade/game/games/castleassault/CastleAssaultTDM.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index 2fc876a00..dcb41bdcc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -206,7 +206,6 @@ public class CastleAssaultTDM extends TeamGame } { _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); - _miscGear.addLoot(new ItemBuilder(Material.TNT, 4).setTitle(F.item("Throwing TNT")).build(), 2); _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); _miscGear.addLoot(_flintAndSteel.build(), 2); _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); From adf6e35a1f9223eb353932dc54478267e8a484e1 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Wed, 10 May 2017 02:49:21 -0400 Subject: [PATCH 082/170] Update leaderboard backend based on discussion with Jon --- .../core/leaderboard/Leaderboard.java | 14 ++- .../core/leaderboard/LeaderboardManager.java | 5 + .../leaderboard/LeaderboardRepository.java | 91 +++++++++++-------- .../games/castleassault/CastleAssault.java | 8 +- .../games/castleassault/CastleAssaultTDM.java | 8 +- .../games/castleassault/kits/KitPlayer.java | 4 +- 6 files changed, 80 insertions(+), 50 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java index 7b717f6ff..4273a5399 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -18,12 +18,17 @@ public class Leaderboard private String _display; private Pair _statDisplay; private String[] _statIds; - private int _size; + private int _size, _start; private LeaderboardSQLType _type; private Location _loc; private Hologram _holo; public Leaderboard(String display, Pair statDisplayNames, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) + { + this(display, statDisplayNames, statIds, type, displayLoc, size, 0); + } + + public Leaderboard(String display, Pair statDisplayNames, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size, int start) { _display = display; _statDisplay = statDisplayNames; @@ -40,6 +45,11 @@ public class Leaderboard return _size; } + public int getStart() + { + return _start; + } + public String[] getStatIds() { return _statIds; @@ -56,7 +66,7 @@ public class Leaderboard LinkedList display = new LinkedList<>(); display.add(C.cAqua + _display); display.add(C.cRed + " "); - int place = 1; + int place = _start + 1; for (Entry entry : names.entrySet()) { if (entry.getValue() == 1) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index c9e66f1a8..754daed49 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -16,6 +16,7 @@ import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; import mineplex.core.hologram.HologramManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; public class LeaderboardManager extends MiniPlugin { @@ -86,6 +87,10 @@ public class LeaderboardManager extends MiniPlugin return; } _leaderboards.put(identifier, board); + if (board.getType() == LeaderboardSQLType.MONTHLY || board.getType() == LeaderboardSQLType.MONTHLY_SEASON || board.getType() == LeaderboardSQLType.YEARLY || board.getType() == LeaderboardSQLType.YEARLY_SEASON) + { + log("Warning! You have selected a LeaderboardSQLType identified to be potentially expensive and intensive on Leaderboard ID: " + identifier); + } _repo.loadLeaderboard(board, board::update); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 188103c5a..6650af665 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -1,7 +1,6 @@ package mineplex.core.leaderboard; import java.sql.Connection; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -21,13 +20,21 @@ import mineplex.serverdata.database.column.ColumnVarChar; public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; - private static final String CREATE = "CREATE TABLE Account.statLeaderboard (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; - private static final String INSERT_STAT = "INSERT INTO statLeaderboard (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; - private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; - private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; - private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; - private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; - private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM statLeaderboard AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId IN (SELECT id FROM stats WHERE name IN (%IDS%)) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %LIMIT%;"; + private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date, season), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; + + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_YEARLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { @@ -49,10 +56,20 @@ public class LeaderboardRepository extends RepositoryBase try (Connection c = getConnection()) { Map names = new LinkedHashMap<>(); - ResultSet rs = board.getType().getStatement(c, board.getStatIds(), board.getSize()).executeQuery(); - while (rs.next()) + Statement s = c.createStatement(); + s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); + for (int i = 0; i < board.getStatIds().length; i++) { - names.put(rs.getString("name"), rs.getInt("value")); + ResultSet rs = s.getResultSet(); + while (rs.next()) + { + names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break ; + } } UtilServer.runSync(() -> leaderboard.accept(names)); @@ -77,7 +94,7 @@ public class LeaderboardRepository extends RepositoryBase int i = 0; for (Leaderboard board : boards) { - queryBuilder.append(board.getType().getMultiStatement(board.getStatIds(), board.getSize())); + queryBuilder.append(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); leaderboards[i] = new LinkedHashMap<>(); i++; } @@ -87,19 +104,23 @@ public class LeaderboardRepository extends RepositoryBase { Statement s = c.createStatement(); s.execute(queryBuilder.toString()); - - for (int i = 0; i < boards.size(); i++) + int index = 0; + mainBoardLoop: for (Leaderboard board : boards) { - ResultSet rs = s.getResultSet(); - while (rs.next()) + for (int i = 0; i < board.getStatIds().length; i++) { - leaderboards[i].put(rs.getString("name"), rs.getInt("value")); - } - - if (!s.getMoreResults()) - { - break; + ResultSet rs = s.getResultSet(); + while (rs.next()) + { + leaderboards[index].merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break mainBoardLoop; + } } + index++; } } @@ -115,10 +136,15 @@ public class LeaderboardRepository extends RepositoryBase public static enum LeaderboardSQLType { DAILY(FETCH_STAT_DAILY), + DAILY_SEASON(FETCH_STAT_DAILY_SEASON), WEEKLY(FETCH_STAT_WEEKLY), + WEEKLY_SEASON(FETCH_STAT_WEEKLY_SEASON), MONTHLY(FETCH_STAT_MONTHLY), + MONTHLY_SEASON(FETCH_STAT_MONTHLY_SEASON), YEARLY(FETCH_STAT_YEARLY), - ALL(FETCH_STAT_ALL) + YEARLY_SEASON(FETCH_STAT_YEARLY_SEASON), + ALL(FETCH_STAT_ALL), + ALL_SEASON(FETCH_STAT_ALL_SEASON) ; private String _sql; @@ -128,25 +154,14 @@ public class LeaderboardRepository extends RepositoryBase _sql = sql; } - public PreparedStatement getStatement(Connection connection, String[] statIds, int limit) throws SQLException + public String getStatement(String[] statIds, int start, int limit) throws SQLException { - StringBuilder idBuilder = new StringBuilder(); + StringBuilder statementBuilder = new StringBuilder(); for (String id : statIds) { - idBuilder.append("'" + id + "'").append(", "); + statementBuilder.append(_sql.replace("%STAT%", id).replace("%START%", String.valueOf(start)).replace("%LIMIT%", String.valueOf(limit))); } - PreparedStatement ps = connection.prepareStatement(_sql.replace("%LIMIT%", String.valueOf(limit)).replace("%IDS%", idBuilder.substring(0, idBuilder.length() - 2))); - return ps; - } - - public String getMultiStatement(String[] statIds, int limit) - { - StringBuilder idBuilder = new StringBuilder(); - for (String id : statIds) - { - idBuilder.append("'" + id + "'").append(", "); - } - return _sql.replace("%LIMIT%", String.valueOf(limit)).replace("%IDS%", idBuilder.substring(0, idBuilder.length() - 2)); + return statementBuilder.toString(); } } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index c4cb2618a..aa48f660d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -206,22 +206,22 @@ public class CastleAssault extends TeamGame if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_WINS")) { Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index dcb41bdcc..294a963a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -165,22 +165,22 @@ public class CastleAssaultTDM extends TeamGame if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_WINS")) { Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java index c9fdaf1c6..1b90a1793 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java @@ -20,12 +20,12 @@ public abstract class KitPlayer extends ProgressingKit public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[] perks, Material holding) { - super(manager, name, "csii" + name.toLowerCase(), availability, description, perks, EntityType.ZOMBIE, new ItemStack(holding)); + super(manager, name, "castleassault" + name.toLowerCase(), availability, description, perks, EntityType.ZOMBIE, new ItemStack(holding)); } public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[][] perks, String[][] upgradeDetails, Material holding) { - super(manager, name, "csii" + name.toLowerCase(), availability, description, perks, upgradeDetails, EntityType.ZOMBIE, new ItemStack(holding)); + super(manager, name, "castleassault" + name.toLowerCase(), availability, description, perks, upgradeDetails, EntityType.ZOMBIE, new ItemStack(holding)); _progressionEnabled = true; } From fa1cd00c227a3990406d069b613bdef077102d55 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Wed, 10 May 2017 02:56:00 -0400 Subject: [PATCH 083/170] Tidy up leaderboard repository class a bit --- .../src/mineplex/core/leaderboard/LeaderboardRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 6650af665..783f561ca 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -20,8 +20,10 @@ import mineplex.serverdata.database.column.ColumnVarChar; public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; + private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date, season), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; From f34a2946c4998e1237128433a5745f1a482b4e27 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Wed, 10 May 2017 03:28:55 -0400 Subject: [PATCH 084/170] Final leaderboard repository changes for Jon --- .../core/leaderboard/LeaderboardRepository.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 783f561ca..03f696760 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -21,16 +21,12 @@ public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; - private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date, season), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_YEARLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; @@ -137,13 +133,9 @@ public class LeaderboardRepository extends RepositoryBase public static enum LeaderboardSQLType { - DAILY(FETCH_STAT_DAILY), DAILY_SEASON(FETCH_STAT_DAILY_SEASON), - WEEKLY(FETCH_STAT_WEEKLY), WEEKLY_SEASON(FETCH_STAT_WEEKLY_SEASON), - MONTHLY(FETCH_STAT_MONTHLY), MONTHLY_SEASON(FETCH_STAT_MONTHLY_SEASON), - YEARLY(FETCH_STAT_YEARLY), YEARLY_SEASON(FETCH_STAT_YEARLY_SEASON), ALL(FETCH_STAT_ALL), ALL_SEASON(FETCH_STAT_ALL_SEASON) From b4c27307baea1f38c95dc58afd328b5e23fa2d01 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Wed, 10 May 2017 04:40:14 -0400 Subject: [PATCH 085/170] Further leaderboard repository tweaks --- .../core/leaderboard/Leaderboard.java | 19 +++-- .../core/leaderboard/LeaderboardManager.java | 59 +++++++++++-- .../leaderboard/LeaderboardRepository.java | 84 +++++++++++-------- .../src/mineplex/core/stats/StatsManager.java | 10 +++ .../game/arcade/managers/GameStatManager.java | 2 +- 5 files changed, 122 insertions(+), 52 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java index 4273a5399..c90639b66 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -17,22 +17,24 @@ public class Leaderboard { private String _display; private Pair _statDisplay; - private String[] _statIds; + private String[] _statNames; + private int[] _statIds; private int _size, _start; private LeaderboardSQLType _type; private Location _loc; private Hologram _holo; - public Leaderboard(String display, Pair statDisplayNames, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size) + public Leaderboard(String display, Pair statDisplayNames, String[] statNames, LeaderboardSQLType type, Location displayLoc, int size) { - this(display, statDisplayNames, statIds, type, displayLoc, size, 0); + this(display, statDisplayNames, statNames, type, displayLoc, size, 0); } - public Leaderboard(String display, Pair statDisplayNames, String[] statIds, LeaderboardSQLType type, Location displayLoc, int size, int start) + public Leaderboard(String display, Pair statDisplayNames, String[] statNames, LeaderboardSQLType type, Location displayLoc, int size, int start) { _display = display; _statDisplay = statDisplayNames; - _statIds = statIds; + _statNames = statNames; + _statIds = new int[_statNames.length]; _type = type; _size = size; _loc = displayLoc; @@ -50,7 +52,12 @@ public class Leaderboard return _start; } - public String[] getStatIds() + public String[] getStatNames() + { + return _statNames; + } + + public int[] getStatIds() { return _statIds; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 754daed49..5300b48b0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -2,8 +2,10 @@ package mineplex.core.leaderboard; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -17,6 +19,7 @@ import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; import mineplex.core.hologram.HologramManager; import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.stats.StatsManager; public class LeaderboardManager extends MiniPlugin { @@ -24,6 +27,7 @@ public class LeaderboardManager extends MiniPlugin private final long REFRESH_RATE; private final LeaderboardRepository _repo; private final HologramManager _holo; + private final Map _loading = new HashMap<>(); public LeaderboardManager(JavaPlugin plugin, HologramManager hologram) { @@ -45,6 +49,28 @@ public class LeaderboardManager extends MiniPlugin REFRESH_RATE = 5 * 60 * 20 + ((UtilMath.r(5) + 1) * 60 * 20); runSyncTimer(() -> refreshBoards(), 0, REFRESH_RATE); + + runSyncTimer(() -> + { + Iterator> iterator = _loading.entrySet().iterator(); + while (iterator.hasNext()) + { + Entry entry = iterator.next(); + boolean registered = true; + for (int id : entry.getKey().getStatIds()) + { + if (id == 0) + { + registered = false; + } + } + if (registered) + { + entry.getValue().run(); + iterator.remove(); + } + } + }, 0, 20 * 2); } private void refreshBoards() @@ -70,13 +96,16 @@ public class LeaderboardManager extends MiniPlugin return _leaderboards.get(identifier); } - public void handleStatIncrease(Player player, String statId, int value) + public void handleStatIncrease(Player player, String stat, int value) { - int accountId = Managers.get(CoreClientManager.class).getAccountId(player); - if (accountId != -1) + final int accountId = Managers.get(CoreClientManager.class).getAccountId(player); + Managers.get(StatsManager.class).loadStatId(stat, id -> { - _repo.insertStat(accountId, statId, value); - } + if (accountId != -1) + { + _repo.insertStat(accountId, id, value); + } + }); } public void registerLeaderboard(String identifier, Leaderboard board) @@ -86,12 +115,24 @@ public class LeaderboardManager extends MiniPlugin board.deconstruct(); return; } - _leaderboards.put(identifier, board); - if (board.getType() == LeaderboardSQLType.MONTHLY || board.getType() == LeaderboardSQLType.MONTHLY_SEASON || board.getType() == LeaderboardSQLType.YEARLY || board.getType() == LeaderboardSQLType.YEARLY_SEASON) + final Runnable postLoad = () -> { - log("Warning! You have selected a LeaderboardSQLType identified to be potentially expensive and intensive on Leaderboard ID: " + identifier); + _leaderboards.put(identifier, board); + if (board.getType() == LeaderboardSQLType.MONTHLY_SEASON || board.getType() == LeaderboardSQLType.YEARLY_SEASON) + { + log("Warning! You have selected a LeaderboardSQLType identified to be potentially expensive and intensive on Leaderboard ID: " + identifier); + } + _repo.loadLeaderboard(board, board::update); + }; + _loading.put(board, postLoad); + for (int i = 0; i < board.getStatNames().length; i++) + { + final int index = i; + Managers.get(StatsManager.class).loadStatId(board.getStatNames()[index], id -> + { + board.getStatIds()[index] = id.intValue(); + }); } - _repo.loadLeaderboard(board, board::update); } public void unregisterLeaderboard(String boardIdentifier) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 03f696760..2f6291043 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -15,35 +15,39 @@ import mineplex.core.common.util.UtilServer; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; import mineplex.serverdata.database.column.ColumnInt; -import mineplex.serverdata.database.column.ColumnVarChar; public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; - private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; - private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (id), UNIQUE INDEX accountStatIndex(accountId, statId, date, season), INDEX valueIndex(value), INDEX seasonIndex(season), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (accountId, statId, date, season), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; - private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ") ON DUPLICATE KEY UPDATE value=value+VALUES(value);"; + private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ");"; + private static final String UPDATE_STAT = "UPDATE accountStatsSeasonal SET value=value + ? WHERE accountId=? AND statId=? AND date=CURDATE() AND season=" + SEASON + ";"; - private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_YEARLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_MONTHLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_WEEKLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_DAILY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=(SELECT id FROM stats WHERE name=%STAT%) AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_YEARLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { super(DBPool.getAccount()); } - public void insertStat(int accountId, String statId, int value) + public void insertStat(int accountId, int statId, int value) { UtilServer.runAsync(() -> { - executeInsert(INSERT_STAT, null, new ColumnInt("accountId", accountId), new ColumnVarChar("name", 100, statId), new ColumnInt("value", value)); + int rowsAffected = executeUpdate(UPDATE_STAT, (Runnable)null, new ColumnInt("value", value), new ColumnInt("accountId", accountId), new ColumnInt("statId", statId)); + if (rowsAffected == 0) + { + executeInsert(INSERT_STAT, null, new ColumnInt("accountId", accountId), new ColumnInt("statId", statId), new ColumnInt("value", value)); + } }); } @@ -51,9 +55,9 @@ public class LeaderboardRepository extends RepositoryBase { UtilServer.runAsync(() -> { + Map names = new LinkedHashMap<>(); try (Connection c = getConnection()) { - Map names = new LinkedHashMap<>(); Statement s = c.createStatement(); s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); for (int i = 0; i < board.getStatIds().length; i++) @@ -66,16 +70,18 @@ public class LeaderboardRepository extends RepositoryBase if (!s.getMoreResults()) { - break ; + break; } } - - UtilServer.runSync(() -> leaderboard.accept(names)); } catch (SQLException ex) { ex.printStackTrace(); } + finally + { + UtilServer.runSync(() -> leaderboard.accept(names)); + } }); } @@ -84,21 +90,21 @@ public class LeaderboardRepository extends RepositoryBase { UtilServer.runAsync(() -> { - try (Connection c = getConnection()) + Map[] leaderboards = new Map[boards.size()]; + StringBuilder queryBuilder = new StringBuilder(); { - Map[] leaderboards = new Map[boards.size()]; - StringBuilder queryBuilder = new StringBuilder(); + int i = 0; + for (Leaderboard board : boards) { - int i = 0; - for (Leaderboard board : boards) - { - queryBuilder.append(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); - leaderboards[i] = new LinkedHashMap<>(); - i++; - } + queryBuilder.append(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); + leaderboards[i] = new LinkedHashMap<>(); + i++; } - - if (queryBuilder.length() > 0) + } + + if (queryBuilder.length() > 0) + { + try (Connection c = getConnection()) { Statement s = c.createStatement(); s.execute(queryBuilder.toString()); @@ -112,7 +118,7 @@ public class LeaderboardRepository extends RepositoryBase { leaderboards[index].merge(rs.getString("name"), rs.getInt("value"), Integer::sum); } - + if (!s.getMoreResults()) { break mainBoardLoop; @@ -121,12 +127,18 @@ public class LeaderboardRepository extends RepositoryBase index++; } } - - UtilServer.runSync(() -> leaderboard.accept(leaderboards)); + catch (SQLException ex) + { + ex.printStackTrace(); + } + finally + { + UtilServer.runSync(() -> leaderboard.accept(leaderboards)); + } } - catch (SQLException ex) + else { - ex.printStackTrace(); + UtilServer.runSync(() -> leaderboard.accept(leaderboards)); } }); } @@ -148,12 +160,12 @@ public class LeaderboardRepository extends RepositoryBase _sql = sql; } - public String getStatement(String[] statIds, int start, int limit) throws SQLException + public String getStatement(int[] statIds, int start, int limit) { StringBuilder statementBuilder = new StringBuilder(); - for (String id : statIds) + for (int id : statIds) { - statementBuilder.append(_sql.replace("%STAT%", id).replace("%START%", String.valueOf(start)).replace("%LIMIT%", String.valueOf(limit))); + statementBuilder.append(_sql.replace("%STAT%", String.valueOf(id)).replace("%START%", String.valueOf(start)).replace("%LIMIT%", String.valueOf(limit))); } return statementBuilder.toString(); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 29804bc5b..6871997c6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -88,6 +88,16 @@ public class StatsManager extends MiniDbClientPlugin return stats; }); } + + public void loadStatId(String statName, Consumer idConsumer) + { + registerNewStat(statName, () -> + { + final int statId = _stats.get(statName); + + runSync(() -> idConsumer.accept(Integer.valueOf(statId))); + }); + } /** diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java index ce18f5910..8b727b704 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java @@ -81,7 +81,7 @@ public class GameStatManager implements Listener if (stat.startsWith("Global.")) continue; - Managers.get(LeaderboardManager.class).handleStatIncrease(player, stat, value); + Manager.runSyncLater(() -> Managers.get(LeaderboardManager.class).handleStatIncrease(player, stat, value), 40L); } } } From 5d1199634d393e9e81c6269ab7bea550b7175195 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 14:48:35 -0400 Subject: [PATCH 086/170] Rewrite leaderboard backend (again) --- .../core/hologram/HologramManager.java | 28 +-- .../core/leaderboard/LeaderboardManager.java | 28 +-- .../leaderboard/LeaderboardRepository.java | 182 +++++++++++++----- .../src/mineplex/core/stats/StatsManager.java | 21 +- .../src/nautilus/game/arcade/Arcade.java | 3 - .../src/nautilus/game/arcade/game/Game.java | 2 - .../games/castleassault/CastleAssault.java | 5 +- .../games/castleassault/CastleAssaultTDM.java | 59 +++--- .../game/arcade/managers/GameStatManager.java | 10 - 9 files changed, 209 insertions(+), 129 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index 618c30f44..a68ce5944 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -4,6 +4,17 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.Vector; + +import mineplex.core.MiniPlugin; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.packethandler.IPacketHandler; @@ -14,24 +25,13 @@ import mineplex.core.updater.event.UpdateEvent; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.EnumEntityUseAction; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.util.Vector; - -public class HologramManager implements Listener, IPacketHandler +public class HologramManager extends MiniPlugin implements IPacketHandler { private ArrayList _activeHolograms = new ArrayList(); - public HologramManager(JavaPlugin arcadeManager, PacketHandler packetHandler) + public HologramManager(JavaPlugin plugin, PacketHandler packetHandler) { - Bukkit.getPluginManager().registerEvents(this, arcadeManager); + super("Hologram Manager", plugin); packetHandler.addPacketHandler(this, true, PacketPlayInUseEntity.class); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 5300b48b0..88a84c29d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -12,13 +12,11 @@ import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.Managers; import mineplex.core.MiniPlugin; -import mineplex.core.account.CoreClientManager; import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; import mineplex.core.hologram.HologramManager; -import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; import mineplex.core.stats.StatsManager; public class LeaderboardManager extends MiniPlugin @@ -26,15 +24,13 @@ public class LeaderboardManager extends MiniPlugin private final Map _leaderboards = new HashMap<>(); private final long REFRESH_RATE; private final LeaderboardRepository _repo; - private final HologramManager _holo; private final Map _loading = new HashMap<>(); - public LeaderboardManager(JavaPlugin plugin, HologramManager hologram) + public LeaderboardManager(JavaPlugin plugin) { super("Leaderboard Manager", plugin); _repo = new LeaderboardRepository(plugin); - _holo = hologram; addCommand(new CommandBase(this, Rank.DEVELOPER, "cycleleaderboard") { @@ -88,7 +84,7 @@ public class LeaderboardManager extends MiniPlugin public HologramManager getHologramManager() { - return _holo; + return Managers.get(HologramManager.class); } public Leaderboard getLeaderboard(String identifier) @@ -96,16 +92,14 @@ public class LeaderboardManager extends MiniPlugin return _leaderboards.get(identifier); } - public void handleStatIncrease(Player player, String stat, int value) + public void handleStatIncrease(Map> stats) { - final int accountId = Managers.get(CoreClientManager.class).getAccountId(player); - Managers.get(StatsManager.class).loadStatId(stat, id -> - { - if (accountId != -1) - { - _repo.insertStat(accountId, id, value); - } - }); + _repo.insertStats(stats); + } + + public void handleStatIncrease(int accountId, Map stats) + { + _repo.insertStats(accountId, stats); } public void registerLeaderboard(String identifier, Leaderboard board) @@ -118,10 +112,6 @@ public class LeaderboardManager extends MiniPlugin final Runnable postLoad = () -> { _leaderboards.put(identifier, board); - if (board.getType() == LeaderboardSQLType.MONTHLY_SEASON || board.getType() == LeaderboardSQLType.YEARLY_SEASON) - { - log("Warning! You have selected a LeaderboardSQLType identified to be potentially expensive and intensive on Leaderboard ID: " + identifier); - } _repo.loadLeaderboard(board, board::update); }; _loading.put(board, postLoad); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 2f6291043..978ba3c1c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -1,6 +1,7 @@ package mineplex.core.leaderboard; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -14,75 +15,170 @@ import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.common.util.UtilServer; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; -import mineplex.serverdata.database.column.ColumnInt; public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; - private static final String CREATE_ALL_TIME = "CREATE TABLE accountStatsAllTime (accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; - private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (accountId INT NOT NULL, statId INT NOT NULL, value INT NOT NULL, date DATE NOT NULL, season INT NOT NULL, PRIMARY KEY (accountId, statId, date, season), INDEX valueIndex(value), FOREIGN KEY (accountId) REFERENCES Account.accounts(id), FOREIGN KEY (statId) REFERENCES Account.stats(id));"; + private static final String CREATE_TOTAL = "CREATE TABLE accountSeasonStatsTotal (accountId INT NOT NULL, statId INT NOT NULL, season SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId, season), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_YEARLY = "CREATE TABLE accountSeasonStatsYearly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_MONTHLY = "CREATE TABLE accountSeasonStatsMonthly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_WEEKLY = "CREATE TABLE accountSeasonStatsWeekly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_DAILY = "CREATE TABLE accountSeasonStatsDaily (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonal (accountId, statId, value, date, season) VALUES (?, (SELECT id FROM stats WHERE name=?), ?, CURDATE(), " + SEASON + ");"; - private static final String UPDATE_STAT = "UPDATE accountStatsSeasonal SET value=value + ? WHERE accountId=? AND statId=? AND date=CURDATE() AND season=" + SEASON + ";"; + private static final String INSERT_STAT = "INSERT INTO accountSeasonStatsTotal (accountId, statId, season, value) VALUES (?, ?, " + SEASON + ", ?);"; + private static final String INSERT_STAT_ALL = "INSERT INTO accountSeasonStatsTotal (accountId, statId, season, value) VALUES (?, ?, 0, ?);"; + private static final String UPDATE_STAT = "UPDATE accountSeasonStatsTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=" + SEASON + ";"; + private static final String UPDATE_STAT_ALL = "UPDATE accountSeasonStatsTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=0;"; - private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountSeasonStatsTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=0 ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_YEARLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_MONTHLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(`date`) = YEAR(CURDATE()) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_WEEKLY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_DAILY_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { super(DBPool.getAccount()); } - public void insertStat(int accountId, int statId, int value) + public void insertStats(Map> stats) { UtilServer.runAsync(() -> { - int rowsAffected = executeUpdate(UPDATE_STAT, (Runnable)null, new ColumnInt("value", value), new ColumnInt("accountId", accountId), new ColumnInt("statId", statId)); - if (rowsAffected == 0) + try (Connection c = getConnection()) { - executeInsert(INSERT_STAT, null, new ColumnInt("accountId", accountId), new ColumnInt("statId", statId), new ColumnInt("value", value)); + final boolean auto = c.getAutoCommit(); + + c.setAutoCommit(true); + PreparedStatement s = c.prepareStatement(UPDATE_STAT); + PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); + for (Integer accountId : stats.keySet()) + { + for (Integer statId : stats.get(accountId).keySet()) + { + s.setLong(1, stats.get(accountId).get(statId)); + s.setInt(2, accountId); + s.setInt(3, statId); + s.addBatch(); + u.setLong(1, stats.get(accountId).get(statId)); + u.setInt(2, accountId); + u.setInt(3, statId); + u.addBatch(); + } + } + int[] rowsAffected1 = s.executeBatch(); + int[] rowsAffected2 = u.executeBatch(); + c.setAutoCommit(false); + s = c.prepareStatement(INSERT_STAT); + u = c.prepareStatement(INSERT_STAT_ALL); + int i = 0; + for (Integer accountId : stats.keySet()) + { + for (Integer statId : stats.get(accountId).keySet()) + { + if (rowsAffected1[i] < 1) + { + s.setInt(1, accountId); + s.setInt(2, statId); + s.setLong(3, stats.get(accountId).get(statId)); + s.addBatch(); + } + if (rowsAffected2[i] < 1) + { + u.setInt(1, accountId); + u.setInt(2, statId); + u.setLong(3, stats.get(accountId).get(statId)); + u.addBatch(); + } + i++; + } + } + s.executeBatch(); + u.executeBatch(); + + c.setAutoCommit(auto); + } + catch (SQLException e) + { + e.printStackTrace(); } }); } + public void insertStats(int accountId, Map stats) + { + try (Connection c = getConnection()) + { + final boolean auto = c.getAutoCommit(); + + c.setAutoCommit(true); + PreparedStatement s = c.prepareStatement(UPDATE_STAT); + for (Integer statId : stats.keySet()) + { + s.setLong(1, stats.get(statId)); + s.setInt(2, accountId); + s.setInt(3, statId); + s.addBatch(); + } + int[] rowsAffected = s.executeBatch(); + c.setAutoCommit(false); + s = c.prepareStatement(INSERT_STAT); + int i = 0; + for (Integer statId : stats.keySet()) + { + if (rowsAffected[i] < 1) + { + s.setInt(1, accountId); + s.setInt(2, statId); + s.setLong(3, stats.get(statId)); + s.addBatch(); + } + i++; + } + s.executeBatch(); + + c.setAutoCommit(auto); + + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + public void loadLeaderboard(Leaderboard board, Consumer> leaderboard) { - UtilServer.runAsync(() -> + Map names = new LinkedHashMap<>(); + try (Connection c = getConnection()) { - Map names = new LinkedHashMap<>(); - try (Connection c = getConnection()) + Statement s = c.createStatement(); + s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); + for (int i = 0; i < board.getStatIds().length; i++) { - Statement s = c.createStatement(); - s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); - for (int i = 0; i < board.getStatIds().length; i++) + ResultSet rs = s.getResultSet(); + while (rs.next()) { - ResultSet rs = s.getResultSet(); - while (rs.next()) - { - names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); - } - - if (!s.getMoreResults()) - { - break; - } + names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break; } } - catch (SQLException ex) - { - ex.printStackTrace(); - } - finally - { - UtilServer.runSync(() -> leaderboard.accept(names)); - } - }); + } + catch (SQLException ex) + { + ex.printStackTrace(); + } + finally + { + UtilServer.runSync(() -> leaderboard.accept(names)); + } } @SuppressWarnings("unchecked") @@ -145,10 +241,10 @@ public class LeaderboardRepository extends RepositoryBase public static enum LeaderboardSQLType { - DAILY_SEASON(FETCH_STAT_DAILY_SEASON), - WEEKLY_SEASON(FETCH_STAT_WEEKLY_SEASON), - MONTHLY_SEASON(FETCH_STAT_MONTHLY_SEASON), - YEARLY_SEASON(FETCH_STAT_YEARLY_SEASON), + DAILY(FETCH_STAT_DAILY), + WEEKLY(FETCH_STAT_WEEKLY), + MONTHLY(FETCH_STAT_MONTHLY), + YEARLY(FETCH_STAT_YEARLY), ALL(FETCH_STAT_ALL), ALL_SEASON(FETCH_STAT_ALL_SEASON) ; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 6871997c6..c4290ff84 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -21,6 +21,7 @@ import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTasks; +import mineplex.core.leaderboard.LeaderboardManager; import mineplex.core.stats.command.GiveStatCommand; import mineplex.core.stats.command.MasterBuilderUnban; import mineplex.core.stats.command.SetLevelCommand; @@ -39,6 +40,7 @@ public class StatsManager extends MiniDbClientPlugin private final CoreClientManager _coreClientManager; private final StatsRepository _repository; + private final LeaderboardManager _leaderboard; private final Map _stats = new HashMap<>(); private final Map> _statUploadQueue = new HashMap<>(); @@ -50,11 +52,21 @@ public class StatsManager extends MiniDbClientPlugin _repository = new StatsRepository(); _coreClientManager = clientManager; + + _leaderboard = new LeaderboardManager(plugin); UtilScheduler.runAsyncEvery(UpdateType.SEC, () -> { - save(_statUploadQueue, _repository::saveStats, "increment"); - save(_statUploadQueueOverRidable, map -> _repository.saveStats(map, true), "override"); + save(_statUploadQueue, map -> + { + _repository.saveStats(map); + _leaderboard.handleStatIncrease(map); + }, "increment"); + save(_statUploadQueueOverRidable, map -> + { + _repository.saveStats(map, true); + _leaderboard.handleStatIncrease(map); + }, "override"); }); for (Stat stat : _repository.retrieveStats()) @@ -125,6 +137,7 @@ public class StatsManager extends MiniDbClientPlugin * * @param value The value, must be greater or equal to zero */ + @Deprecated public void setStat(Player player, String statName, long value) { if (value < 0) @@ -158,6 +171,7 @@ public class StatsManager extends MiniDbClientPlugin * * @param value The value, must be greater or equal to zero */ + @Deprecated public void setStat(final int accountId, final String statName, final long value) { if (value < 0) @@ -171,7 +185,8 @@ public class StatsManager extends MiniDbClientPlugin _repository.saveStats(uploadQueue, true); }); } - + + @Deprecated private void addToOverRidableQueue(String statName, CoreClient client, long value) { if (client.getAccountId() == -1) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 9c0b9e40f..7eb6eee04 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -52,7 +52,6 @@ import mineplex.core.ignore.IgnoreManager; import mineplex.core.incognito.IncognitoManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.leaderboard.LeaderboardManager; import mineplex.core.memory.MemoryFix; import mineplex.core.message.MessageManager; import mineplex.core.monitor.LagMeter; @@ -196,8 +195,6 @@ public class Arcade extends JavaPlugin ProjectileManager projectileManager = new ProjectileManager(this); HologramManager hologramManager = new HologramManager(this, packetHandler); - new LeaderboardManager(this, hologramManager); - //Inventory InventoryManager inventoryManager = new InventoryManager(this, _clientManager); CastleManager castleManager = new CastleManager(this, _clientManager, hologramManager, false); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 75ad46dbb..90d008a25 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -346,8 +346,6 @@ public abstract class Game extends ListenerComponent implements Lifetimed //ELO public boolean EloRanking = false; public int EloStart = 1000; - - public boolean Leaderboards = false; public boolean CanAddStats = true; public boolean CanGiveLoot = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index aa48f660d..7f206d2a3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -184,7 +184,6 @@ public class CastleAssault extends TeamGame this.AllowFlintAndSteel = true; this.BlockPlaceAllow.add(Material.FIRE.getId()); this.CrownsEnabled = true; - this.Leaderboards = true; this.FirstKillReward = 20; this.GemKillDeathRespawn = 1; @@ -206,12 +205,12 @@ public class CastleAssault extends TeamGame if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) { Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); } if (lobbyCustomLocs.containsKey("TOP_WINS")) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index 294a963a6..e9bfa88d6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -47,7 +47,6 @@ import org.bukkit.material.MaterialData; import org.bukkit.metadata.MetadataValue; import mineplex.core.Managers; -import mineplex.core.common.Pair; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; @@ -60,9 +59,7 @@ import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.leaderboard.Leaderboard; import mineplex.core.leaderboard.LeaderboardManager; -import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -85,7 +82,6 @@ import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; import nautilus.game.arcade.game.games.castleassault.kits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; public class CastleAssaultTDM extends TeamGame { @@ -144,7 +140,6 @@ public class CastleAssaultTDM extends TeamGame this.AllowFlintAndSteel = true; this.BlockPlaceAllow.add(Material.FIRE.getId()); this.CrownsEnabled = true; - this.Leaderboards = true; this.FirstKillReward = 20; this.GemKillDeathRespawn = 1; @@ -157,33 +152,33 @@ public class CastleAssaultTDM extends TeamGame _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); generateLoot(); - if (manager.IsRewardStats()) - { - if (manager.GetLobby() instanceof NewGameLobbyManager) - { - Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); - if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_WINS")) - { - Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); - } - if (lobbyCustomLocs.containsKey("TOP_KILLS")) - { - Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); - Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); - } - } - } +// if (manager.IsRewardStats()) +// { +// if (manager.GetLobby() instanceof NewGameLobbyManager) +// { +// Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); +// if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) +// { +// Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); +// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); +// } +// if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) +// { +// Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); +// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); +// } +// if (lobbyCustomLocs.containsKey("TOP_WINS")) +// { +// Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); +// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); +// } +// if (lobbyCustomLocs.containsKey("TOP_KILLS")) +// { +// Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); +// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); +// } +// } +// } } private void generateLoot() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java index 8b727b704..5916af5b1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java @@ -12,12 +12,10 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import mineplex.core.Managers; import mineplex.core.common.Rank; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; -import mineplex.core.leaderboard.LeaderboardManager; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -74,14 +72,6 @@ public class GameStatManager implements Listener continue; Manager.GetStatsManager().incrementStat(player, stat, value); - - if (!event.GetGame().Leaderboards) - continue; - - if (stat.startsWith("Global.")) - continue; - - Manager.runSyncLater(() -> Managers.get(LeaderboardManager.class).handleStatIncrease(player, stat, value), 40L); } } } From aa898d74da671c2d95b3e3b1b9cb2d656dd14a0b Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 15:25:22 -0400 Subject: [PATCH 087/170] Fix incorrectly named tables in fetch query --- .../core/leaderboard/LeaderboardRepository.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 978ba3c1c..d03464be4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -33,12 +33,12 @@ public class LeaderboardRepository extends RepositoryBase private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountSeasonStatsTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=0 ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountSeasonStatsYearly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountSeasonStatsMonthly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountSeasonStatsWeekly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountSeasonStatsDaily AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountSeasonStatsTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { From 7f240bb5a4a8cb50c06cc6c2050cb546ed440386 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 15:53:58 -0400 Subject: [PATCH 088/170] Fix some leaderboards not cleaning up after themselves --- .../game/arcade/game/games/castleassault/CastleAssault.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 7f206d2a3..96382fc7f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -695,6 +695,10 @@ public class CastleAssault extends TeamGame Manager.GetDamage().SetEnabled(true); Manager.GetExplosion().setEnabled(true); Manager.GetCreature().SetDisableCustomDrops(false); + } + + if (event.GetState() == GameState.Dead) + { Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS"); Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS"); Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_WINS"); From 86c66d3a440a1e028847746077dee878f666753e Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 16:05:19 -0400 Subject: [PATCH 089/170] Add specific kit spawn data locs --- .../game/games/castleassault/CastleAssault.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 96382fc7f..5388c6fc1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -396,16 +396,14 @@ public class CastleAssault extends TeamGame this.CreatureAllowOverride = true; _kings.put(red, new TeamKing(red, "King Jon", redKing)); _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); - int kitIndex = 0; - for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + for (Kit kit : GetKits()) { - if (kitIndex >= GetKits().length) + List spawns = WorldData.GetDataLocs("K:" + kit.GetName()); + for (Location spawn : spawns) { - kitIndex = 0; + Entity ent = kit.SpawnEntity(spawn); + Manager.GetLobby().addKitLocation(ent, kit, spawn); } - Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); - Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); - kitIndex++; } this.CreatureAllowOverride = false; _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); From 7df87a7d7e7bb6f4f8578323e4c9a8109a4117cb Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 11 May 2017 22:55:30 +0100 Subject: [PATCH 090/170] Lots of fixes --- .../gemhunters/economy/CashOutModule.java | 2 + .../economy/command/ResetCooldownCommand.java | 23 ++ .../mineplex/gemhunters/join/JoinModule.java | 34 ++- .../mineplex/gemhunters/loot/LootModule.java | 72 ++---- .../loot/rewards/LootChestReward.java | 21 +- .../loot/rewards/LootGadgetReward.java | 10 +- .../loot/rewards/LootRankReward.java | 5 +- .../loot/rewards/LootShardReward.java | 3 +- .../gemhunters/map/ItemMapRenderer.java | 4 +- .../persistence/PersistenceData.java | 9 +- .../persistence/PersistenceModule.java | 15 +- .../persistence/PersistenceRepository.java | 16 +- .../mineplex/gemhunters/quest/QuestNPC.java | 10 +- .../mineplex/gemhunters/shop/SellingNPC.java | 223 ++++++++++++++++++ .../mineplex/gemhunters/shop/ShopModule.java | 60 ++--- .../mineplex/gemhunters/shop/TraderNPC.java | 6 +- .../gemhunters/shop/VillagerProperties.java | 9 +- .../VillagerPropertiesDeserialiser.java | 7 +- .../gemhunters/spawn/SpawnModule.java | 21 +- .../gemhunters/util/SlackRewardBot.java | 49 ++++ .../gemhunters/util/SlackSheetsBot.java | 25 -- 21 files changed, 451 insertions(+), 173 deletions(-) create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java delete mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java index 28c029fe1..c4d3b75d8 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java @@ -14,6 +14,7 @@ import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.gemhunters.economy.command.CashOutItemCommand; +import mineplex.gemhunters.economy.command.ResetCooldownCommand; import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; import org.bukkit.Material; @@ -61,6 +62,7 @@ public class CashOutModule extends MiniPlugin public void addCommands() { addCommand(new CashOutItemCommand(this)); + addCommand(new ResetCooldownCommand(this)); } @EventHandler diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java new file mode 100644 index 000000000..f95a82f8f --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java @@ -0,0 +1,23 @@ +package mineplex.gemhunters.economy.command; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.recharge.Recharge; +import mineplex.gemhunters.economy.CashOutModule; +import org.bukkit.entity.Player; + +public class ResetCooldownCommand extends CommandBase +{ + + public ResetCooldownCommand(CashOutModule plugin) + { + super(plugin, Rank.DEVELOPER, "resetcashout"); + } + + @Override + public void Execute(Player caller, String[] args) + { + Recharge.Instance.useForce(caller, "Cash Out", 0); + } + +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java index 88c8ec574..a18716289 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -4,12 +4,13 @@ import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; -import mineplex.core.inventory.InventoryManager; +import mineplex.core.common.util.UtilItem; +import mineplex.core.recharge.Recharge; import mineplex.gemhunters.death.quitnpc.QuitNPC; import mineplex.gemhunters.death.quitnpc.QuitNPCModule; import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.loot.InventoryModule; -import mineplex.gemhunters.map.ItemMapModule; +import mineplex.gemhunters.loot.LootModule; import mineplex.gemhunters.persistence.PersistenceData; import mineplex.gemhunters.persistence.PersistenceModule; import mineplex.gemhunters.persistence.PersistenceRepository; @@ -20,7 +21,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.ItemStack; -import java.awt.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -28,8 +28,11 @@ import java.util.function.Consumer; public class JoinModule extends MiniPlugin { + private static final double MAXIMUM_DURABILITY_LOSS = 0.85; + private final CoreClientManager _client; private final EconomyModule _economy; + private final LootModule _loot; private final QuestModule _quest; private final PersistenceModule _persistence; private final QuitNPCModule _npc; @@ -42,6 +45,7 @@ public class JoinModule extends MiniPlugin _client = require(CoreClientManager.class); _economy = require(EconomyModule.class); + _loot = require(LootModule.class); _quest = require(QuestModule.class); _persistence = require(PersistenceModule.class); _npc = require(QuitNPCModule.class); @@ -63,10 +67,16 @@ public class JoinModule extends MiniPlugin player.setHealth(data.getHealth()); player.setMaxHealth(data.getMaxHealth()); player.setFoodLevel(data.getHunger()); + loseDurability(data.getItems(), data.getSaveTime()); + for (ItemStack itemStack : data.getItems()) + { + _loot.handleRewardItem(player, itemStack); + } player.getInventory().addItem(data.getItems()); loseDurability(data.getArmour(), data.getSaveTime()); player.getInventory().setArmorContents(data.getArmour()); _inventory.unlockSlots(player, data.getSlots(), false); + Recharge.Instance.useForce(player, "Cash Out", data.getCashOutTime()); }); player.getInventory().clear(); @@ -93,19 +103,25 @@ public class JoinModule extends MiniPlugin private void loseDurability(ItemStack[] items, long time) { long diff = System.currentTimeMillis() - time; - long hours = TimeUnit.MILLISECONDS.toHours(diff); + long hours = TimeUnit.MILLISECONDS.toSeconds(diff); for (ItemStack item : items) { - short max = item.getType().getMaxDurability(); - short change = (short) ((max / 100D) * hours); - - if (item.getDurability() + change > max * 0.15) + if (!UtilItem.isSword(item) && !UtilItem.isArmor(item)) { continue; } - item.setDurability((short) (item.getDurability() + change)); + short max = item.getType().getMaxDurability(); + short change = (short) (((double) max / 100D) * hours); + short apply = (short) (item.getDurability() + change); + + if (apply > max * MAXIMUM_DURABILITY_LOSS) + { + apply = (short) (max * MAXIMUM_DURABILITY_LOSS); + } + + item.setDurability(apply); } } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java index a60f1e7f0..ea7dc1d4d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java @@ -1,14 +1,23 @@ package mineplex.gemhunters.loot; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.google.GoogleSheetsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.gemhunters.economy.EconomyModule; +import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; +import mineplex.gemhunters.loot.command.SpawnChestCommand; +import mineplex.gemhunters.loot.command.UpdateLootCommand; +import mineplex.gemhunters.loot.deserialisers.ChestPropertiesDeserialiser; +import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; +import mineplex.gemhunters.loot.event.PlayerChestOpenEvent; +import mineplex.gemhunters.loot.rewards.*; +import mineplex.gemhunters.safezone.SafezoneModule; +import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; +import mineplex.gemhunters.world.WorldDataModule; import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; @@ -25,35 +34,8 @@ import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import mineplex.core.MiniPlugin; -import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.google.GoogleSheetsManager; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.gemhunters.economy.EconomyModule; -import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; -import mineplex.gemhunters.loot.command.SpawnChestCommand; -import mineplex.gemhunters.loot.command.UpdateLootCommand; -import mineplex.gemhunters.loot.deserialisers.ChestPropertiesDeserialiser; -import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; -import mineplex.gemhunters.loot.event.PlayerChestOpenEvent; -import mineplex.gemhunters.loot.rewards.LootChestReward; -import mineplex.gemhunters.loot.rewards.LootGadgetReward; -import mineplex.gemhunters.loot.rewards.LootItemReward; -import mineplex.gemhunters.loot.rewards.LootRankReward; -import mineplex.gemhunters.loot.rewards.LootShardReward; -import mineplex.gemhunters.safezone.SafezoneModule; -import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; -import mineplex.gemhunters.util.SlackSheetsBot; -import mineplex.gemhunters.world.WorldDataModule; +import java.util.*; +import java.util.concurrent.TimeUnit; @ReflectivelyCreateMiniPlugin public class LootModule extends MiniPlugin @@ -200,12 +182,6 @@ public class LootModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Chest Loot", key, row); - } - - continue; } } @@ -224,12 +200,6 @@ public class LootModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Chest Loot", key, row); - } - - continue; } } @@ -659,7 +629,7 @@ public class LootModule extends MiniPlugin } } } - + public final Set getShownPlayers() { return _shownPlayers; diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java index 5ef354ec1..323c184f9 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -10,14 +11,14 @@ public class LootChestReward extends LootItemReward { private final InventoryManager _inventory; - + private final String _chestName; private final int _amount; - + public LootChestReward(long cashOutDelay, ItemStack itemStack, String chestName, int amount) { super(chestName + " Chest", cashOutDelay, itemStack); - + _inventory = Managers.require(InventoryManager.class); _chestName = chestName; _amount = amount; @@ -26,27 +27,19 @@ public class LootChestReward extends LootItemReward @Override public void onCollectItem() { - + } @Override public void onSuccessful() { - _inventory.addItemToInventory(new Callback() - { - - @Override - public void run(Boolean success) - { - //DebugModule.getInstance().d("Success= " + success); - } - }, _player, _chestName + " Chest", _amount); + _inventory.addItemToInventory(success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure"), _player, _chestName + " Chest", _amount); } @Override public void onDeath() { - + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java index 59f9db30f..03ba74fe6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java @@ -1,5 +1,9 @@ package mineplex.gemhunters.loot.rewards; +import com.sun.org.apache.xpath.internal.operations.Bool; +import mineplex.core.common.util.Callback; +import mineplex.core.server.util.TransactionResponse; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -35,13 +39,11 @@ public class LootGadgetReward extends LootItemReward if (donor.ownsUnknownSalesPackage(_gadget)) { - //DebugModule.getInstance().d("Shard duplicate"); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random())); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random()), success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); } else { - //DebugModule.getInstance().d("Adding gadget"); - _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, null); + _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, transaction -> SlackRewardBot.logReward(_player, this, transaction == TransactionResponse.Success ? "Success" : "Failure")); } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java index 58ae67fb3..e0e592fd3 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java @@ -2,6 +2,7 @@ package mineplex.gemhunters.loot.rewards; import java.util.concurrent.TimeUnit; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -70,11 +71,11 @@ public class LootRankReward extends LootItemReward if (newRank == null) { _player.sendMessage(F.main("Loot", "Since you already have eternal ( You are lucky :) ). So instead you can have " + CONSOLATION_PRICE + " shards.")); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE, success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); return; } - _clientManager.SaveRank(_player.getName(), _player.getUniqueId(), newRank, true); + _clientManager.SaveRank(callback -> SlackRewardBot.logReward(_player, this, callback.Name), _player.getName(), _player.getUniqueId(), newRank, true); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java index af1119a73..458e577e1 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -30,7 +31,7 @@ public class LootShardReward extends LootItemReward @Override public void onSuccessful() { - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount, success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure")); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java index 8c1e4f865..09d4aca84 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java @@ -279,8 +279,8 @@ public class ItemMapRenderer extends MapRenderer continue; } - byte b0 = (byte) (int) Math.min(127, (double) (mapX * 2.0F) + 0.5D); - byte b1 = (byte) (int) Math.max(-127, (double) (mapZ * 2.0F) + 0.5D); + byte b0 = (byte) (int) Math.min(127, (mapX * 2.0F) + 0.5D); + byte b1 = (byte) (int) Math.max(-127, (mapZ * 2.0F) + 0.5D); byte rotation = (byte) (int) ((l.getYaw() * 16D) / 360D); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java index 01dd83737..fed987d21 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java @@ -17,8 +17,9 @@ public class PersistenceData private final ItemStack[] _items; private final ItemStack[] _armour; private final long _saveTime; + private final int _cashOutTime; - public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour, long saveTime) + public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour, long saveTime, int cashOutTime) { _gems = gems; _location = location; @@ -30,6 +31,7 @@ public class PersistenceData _slots = slots; _armour = armour; _saveTime = saveTime; + _cashOutTime = cashOutTime; } public int getGems() @@ -81,4 +83,9 @@ public class PersistenceData { return _saveTime; } + + public int getCashOutTime() + { + return _cashOutTime; + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index 9a9954135..3e87fbc78 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -6,6 +6,8 @@ import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.F; import mineplex.core.portal.events.ServerTransferEvent; +import mineplex.core.recharge.Recharge; +import mineplex.core.recharge.RechargeData; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.economy.CashOutModule; import mineplex.gemhunters.economy.EconomyModule; @@ -98,8 +100,19 @@ public class PersistenceModule extends MiniPlugin ItemStack[] items = player.getInventory().getContents(); ItemStack[] armour = player.getInventory().getArmorContents(); long saveTime = System.currentTimeMillis(); + int cashOutTime; + RechargeData rechargeData = Recharge.Instance.Get(player).get("Cash Out"); - PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour, saveTime); + if (rechargeData == null) + { + cashOutTime = 0; + } + else + { + cashOutTime = (int) rechargeData.GetRemaining(); + } + + PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour, saveTime, cashOutTime); runAsync(() -> { diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java index 88c734add..cab1e644a 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java @@ -8,17 +8,14 @@ import mineplex.serverdata.database.RepositoryBase; import mineplex.serverdata.database.column.ColumnInt; import mineplex.serverdata.database.column.ColumnTimestamp; import mineplex.serverdata.database.column.ColumnVarChar; -import net.minecraft.server.v1_8_R3.ItemMapEmpty; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.jooq.util.derby.sys.Sys; import java.lang.reflect.Constructor; -import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; @@ -29,8 +26,8 @@ public class PersistenceRepository extends RepositoryBase { private static final String GET_DATA = "SELECT * FROM gemHunters WHERE accountId=?;"; - private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; - private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=?,saveTime=? WHERE accountId=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=?,saveTime=?,cashOutTime=? WHERE accountId=?;"; private static final String DELETE_DATA = "DELETE FROM gemHunters WHERE accountId=?;"; private static final Gson GSON; private static final ItemStack AIR = new ItemStack(Material.AIR); @@ -109,10 +106,12 @@ public class PersistenceRepository extends RepositoryBase saveTime = new Timestamp(System.currentTimeMillis()); } + int cashOutTime = resultSet.getInt("cashOutTime"); + _exists.add(accountId); Location location = new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch); - PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0]), saveTime.getTime()); + PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0]), saveTime.getTime(), cashOutTime); response.accept(data); } }, new ColumnInt("accountId", accountId)); @@ -137,6 +136,7 @@ public class PersistenceRepository extends RepositoryBase List> itemsMap = new ArrayList<>(items.length); List> armourMap = new ArrayList<>(armour.length); Timestamp saveTime = new Timestamp(data.getSaveTime()); + int cashOutTime = data.getCashOutTime(); for (ItemStack itemStack : items) { @@ -175,6 +175,7 @@ public class PersistenceRepository extends RepositoryBase new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), new ColumnTimestamp("saveTime", saveTime), + new ColumnInt("cashOutTime", cashOutTime), new ColumnInt("accountId", accountId) ); } @@ -195,7 +196,8 @@ public class PersistenceRepository extends RepositoryBase new ColumnInt("slots", slots), new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), - new ColumnTimestamp("saveTime", saveTime) + new ColumnTimestamp("saveTime", saveTime), + new ColumnInt("cashOutTime", cashOutTime) ); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java index 6594d1517..7c377c06d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java @@ -1,5 +1,8 @@ package mineplex.gemhunters.quest; +import mineplex.core.common.util.C; +import mineplex.core.menu.Menu; +import mineplex.gemhunters.util.SimpleNPC; import org.bukkit.Location; import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; @@ -8,10 +11,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.metadata.FixedMetadataValue; -import mineplex.core.common.util.C; -import mineplex.core.menu.Menu; -import mineplex.gemhunters.util.SimpleNPC; - public class QuestNPC extends SimpleNPC { @@ -19,7 +18,7 @@ public class QuestNPC extends SimpleNPC public QuestNPC(QuestModule quest, Location spawn, Menu menu) { - super(quest.getPlugin(), spawn, Villager.class, C.cGreenB + "NEW - " + C.cYellowB + "Quest Master" + C.cGreenB + " - NEW", null); + super(quest.getPlugin(), spawn, Villager.class, C.cYellowB + "Quest Master", null); _questMenu = menu; _entity.setMetadata("quest_npc", new FixedMetadataValue(quest.getPlugin(), true)); @@ -40,7 +39,6 @@ public class QuestNPC extends SimpleNPC event.setCancelled(true); - //event.getPlayer().sendMessage(F.main("Quest", "The Quest Master is currently disabled but will be available to all players shortly.")); _questMenu.open(event.getPlayer()); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java new file mode 100644 index 000000000..4e6ff2416 --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java @@ -0,0 +1,223 @@ +package mineplex.gemhunters.shop; + +import mineplex.core.Managers; +import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilServer; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.gemhunters.economy.EconomyModule; +import mineplex.gemhunters.util.SimpleNPC; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class SellingNPC extends SimpleNPC +{ + + private static final ItemStack CANCEL = new ItemBuilder(Material.REDSTONE_BLOCK) + .setTitle(C.cRedB + "Cancel") + .addLore("", "Click to cancel and return your items.") + .build(); + private static final ItemStack BUFFER = new ItemBuilder(Material.STAINED_GLASS_PANE, (byte) 15) + .setTitle(" ") + .build(); + + private final EconomyModule _economy; + + private final Set _selling; + private final Map _inv; + + private int _total; + + public SellingNPC(JavaPlugin plugin, Location spawn, Class type, String name, boolean vegetated, Set selling) + { + super(plugin, spawn, type, name, null, vegetated); + + _economy = Managers.require(EconomyModule.class); + + _selling = selling; + _inv = new HashMap<>(); + } + + @Override + @EventHandler + public void npcClick(PlayerInteractEntityEvent event) + { + super.npcClick(event); + + if (event.getRightClicked().equals(_entity)) + { + event.setCancelled(true); + + Player player = event.getPlayer(); + Inventory inv = UtilServer.getServer().createInventory(null, 54, _entity.getCustomName()); + + inv.setItem(0, CANCEL); + inv.setItem(8, getConfirm()); + + for (int i = 9; i < 18; i++) + { + inv.setItem(i, BUFFER); + } + + _inv.put(player, inv); + player.openInventory(inv); + } + } + + + @EventHandler + public void inventoryClick(InventoryClickEvent event) + { + if (event.getInventory() == null) + { + return; + } + + Player player = (Player) event.getWhoClicked(); + Inventory inv = _inv.get(player); + + if (inv == null | !event.getInventory().equals(inv)) + { + return; + } + + ItemStack itemStack = event.getCurrentItem(); + ItemStack cursor = event.getCursor(); + + if (itemStack == null || cursor == null) + { + return; + } + + Material type = itemStack.getType(); + + if (type == Material.EMERALD_BLOCK || type == Material.REDSTONE_BLOCK || type == Material.STAINED_GLASS_PANE) + { + if (type == Material.EMERALD_BLOCK) + { + finalise(player); + } + else if (type == Material.REDSTONE_BLOCK) + { + cancel(player); + } + + event.setCancelled(true); + return; + } + + TradeableItem currentItem = fromItemStack(itemStack); + TradeableItem cursorItem = fromItemStack(cursor); + + if (currentItem == null && cursorItem == null) + { + event.setCancelled(true); + player.playSound(player.getLocation(), Sound.VILLAGER_NO, 1, 0.7F); + player.sendMessage(F.main("Shop", "You cannot sell that item.")); + return; + } + + UtilServer.runSyncLater(() -> recalculatePrice(inv), 1); + } + + @EventHandler + public void inventoryClose(InventoryCloseEvent event) + { + Player player = (Player) event.getPlayer(); + + if (_inv.containsKey(player)) + { + cancel(player); + } + } + + private void recalculatePrice(Inventory inv) + { + int price = 0; + + for (ItemStack itemStack : inv.getContents()) + { + TradeableItem tradeableItem = fromItemStack(itemStack); + + if (tradeableItem == null) + { + continue; + } + + price += tradeableItem.getCost() * itemStack.getAmount(); + } + + _total = price; + inv.setItem(8, getConfirm()); + } + + private void finalise(Player player) + { + recalculatePrice(_inv.remove(player)); + player.closeInventory(); + player.playSound(player.getLocation(), Sound.VILLAGER_YES, 1, 0.7F); + _economy.addToStore(player, "Sold Items", _total); + } + + private void cancel(Player player) + { + Inventory inv = _inv.remove(player); + + for (ItemStack itemStack : inv.getContents()) + { + TradeableItem tradeableItem = fromItemStack(itemStack); + + if (tradeableItem == null) + { + continue; + } + + player.getInventory().addItem(itemStack); + } + + player.closeInventory(); + } + + private TradeableItem fromItemStack(ItemStack itemStack) + { + if (itemStack == null) + { + return null; + } + + for (TradeableItem item : _selling) + { + ItemStack itemStack2 = item.getLootItem().getItemStack(); + + if (itemStack.getType() == itemStack2.getType()) + { + return item; + } + } + + return null; + } + + private ItemStack getConfirm() + { + return new ItemBuilder(Material.EMERALD_BLOCK) + .setTitle(C.cGreenB + "Confirm") + .addLore("", "Click to sell these current items", "at a price of " + F.currency(GlobalCurrency.GEM, _total) + ".") + .build(); + } +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java index 59707f452..2f8725d8d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java @@ -1,19 +1,8 @@ package mineplex.gemhunters.shop; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.bukkit.Location; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; - import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTime; @@ -24,8 +13,13 @@ import mineplex.core.updater.event.UpdateEvent; import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; import mineplex.gemhunters.safezone.SafezoneModule; import mineplex.gemhunters.shop.deserialisers.VillagerPropertiesDeserialiser; -import mineplex.gemhunters.util.SlackSheetsBot; +import mineplex.gemhunters.util.SlackRewardBot; import mineplex.gemhunters.world.WorldDataModule; +import org.bukkit.Location; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; + +import java.util.*; @ReflectivelyCreateMiniPlugin public class ShopModule extends MiniPlugin @@ -35,16 +29,7 @@ public class ShopModule extends MiniPlugin private static final String VILLAGER_MASTER_SHEET_NAME = "VILLAGER_MASTER"; private static final VillagerPropertiesDeserialiser VILLAGER_PROPERTIES_DESERIALISER = new VillagerPropertiesDeserialiser(); private static final LootItemDeserialiser DESERIALISER = new LootItemDeserialiser(); - private static final SheetObjectDeserialiser COST_DESERIALISER = new SheetObjectDeserialiser() - { - - @Override - public Integer deserialise(String[] values) throws ArrayIndexOutOfBoundsException, NumberFormatException - { - return Integer.parseInt(values[10]); - } - - }; + private static final SheetObjectDeserialiser COST_DESERIALISER = values -> Integer.parseInt(values[10]); private static final int MINIMUM_ITEMS = 1; private static final int MAXIMUM_ITEMS = 5; @@ -107,10 +92,6 @@ public class ShopModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); - } } } continue; @@ -129,10 +110,6 @@ public class ShopModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); - } } } @@ -208,20 +185,31 @@ public class ShopModule extends MiniPlugin } int index = getFreeIndex(locations.size(), usedIndexes); - + if (index == -1) { return; } - + Location randomLocation = locations.get(index); randomLocation.setYaw(UtilMath.r(360)); - + usedIndexes.add(index); + String name = NAMES[UtilMath.r(NAMES.length)]; + + name = (properties.isSelling() ? C.cGold + "Buying" : C.cGreen + "Selling") + C.cGray + " - " + C.cWhite + name; + //DebugModule.getInstance().d("Trader at " + UtilWorld.locToStrClean(randomLocation) + " with key=" + key + " and index=" + index + " and max=" + spawned + "/" + max); - _npcs.add(new TraderNPC(_plugin, randomLocation, Villager.class, NAMES[UtilMath.r(NAMES.length)], _safezone.isInSafeZone(randomLocation), properties, getRandomItemSet(_trades.get(key)))); + if (properties.isSelling()) + { + _npcs.add(new TraderNPC(_plugin, randomLocation, Villager.class, name, _safezone.isInSafeZone(randomLocation), properties, getRandomItemSet(_trades.get(key)))); + } + else + { + new SellingNPC(_plugin, randomLocation, Villager.class, name, _safezone.isInSafeZone(randomLocation), _trades.get(key)); + } } } @@ -252,7 +240,7 @@ public class ShopModule extends MiniPlugin return items2; } - private final String capitalise(String s) + private String capitalise(String s) { String right = s.toLowerCase().substring(1); char left = Character.toUpperCase(s.charAt(0)); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java index 0c3572803..dbd7c1668 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java @@ -100,14 +100,14 @@ public class TraderNPC extends SimpleNPC if (cost > gems) { - player.sendMessage(F.main(_entity.getCustomName(), "I'm sorry you don't have enough gems to purchase this.")); + player.sendMessage(F.main("Shop", "I'm sorry you don't have enough gems to purchase this.")); player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0.6F); return; } if (!UtilInv.HasSpace(player, itemStack.getType(), itemStack.getAmount())) { - player.sendMessage(F.main(_entity.getCustomName(), "I'm sorry you don't have enough space to hold that.")); + player.sendMessage(F.main("Shop", "I'm sorry you don't have enough space to hold that.")); player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0.6F); return; } @@ -125,7 +125,7 @@ public class TraderNPC extends SimpleNPC String itemName = ItemStackFactory.Instance.GetName(itemStack, true); - player.sendMessage(F.main(_entity.getCustomName(), "Purchased " + F.elem(itemName) + "!")); + player.sendMessage(F.main("Shop", "Purchased " + F.elem(itemName) + "!")); player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 1.2F); player.getInventory().addItem(itemStack); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java index bb94751ea..db5ed3495 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java @@ -5,16 +5,18 @@ public class VillagerProperties private final String _name; private final String _dataKey; + private final boolean _selling; private final int _spawnRate; private final int _expireRate; private final int _max; private long _lastSpawn; - public VillagerProperties(String name, String dataKey, int spawnRate, int expireRate, int max) + public VillagerProperties(String name, String dataKey, boolean selling, int spawnRate, int expireRate, int max) { _name = name; _dataKey = dataKey; + _selling = selling; _spawnRate = spawnRate; _expireRate = expireRate; _max = max; @@ -32,6 +34,11 @@ public class VillagerProperties return _dataKey; } + public boolean isSelling() + { + return _selling; + } + public final int getSpawnRate() { return _spawnRate; diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java index 8d37883a9..423be658c 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.shop.deserialisers; +import com.sun.org.apache.xpath.internal.operations.Bool; import mineplex.core.google.SheetObjectDeserialiser; import mineplex.gemhunters.shop.VillagerProperties; @@ -11,13 +12,15 @@ public class VillagerPropertiesDeserialiser implements SheetObjectDeserialiser { + if (_status.Get(clicker).getStatusType() == PlayerStatusType.COMBAT || !Recharge.Instance.usable(clicker, "Cash Out")) + { + clicker.sendMessage(F.main(_moduleName, "You can not do this right now.")); + return; + } + Location toTeleport = getRandomLocation(); if (toTeleport == null) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java new file mode 100644 index 000000000..9ae99966a --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java @@ -0,0 +1,49 @@ +package mineplex.gemhunters.util; + +import mineplex.core.Managers; +import mineplex.core.common.util.UtilServer; +import mineplex.core.monitor.LagMeter; +import mineplex.core.slack.SlackAPI; +import mineplex.core.slack.SlackMessage; +import mineplex.core.slack.SlackTeam; +import mineplex.gemhunters.loot.rewards.LootItemReward; +import org.bukkit.entity.Player; + +import java.net.MalformedURLException; +import java.net.URL; +import java.text.DecimalFormat; + +public class SlackRewardBot +{ + + private static final DecimalFormat FORMAT = new DecimalFormat("0.0"); + private static final String SLACK_CHANNEL_NAME = "#gem-hunters-logging"; + private static final String SLACK_USERNAME = "Gem Hunters"; + private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/chest-image.png"; + + private static LagMeter _lag; + + public static void logReward(Player player, LootItemReward reward, String status) + { + if (_lag == null) + { + _lag = Managers.get(LagMeter.class); + } + + try + { + SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), + "Rewarding a " + reward.getClass().getSimpleName() + + "\nName: " + reward.getItemStack().getItemMeta().getDisplayName() + + "\nPlayer: " + player.getName() + + "\nStatus: *" + status + "*" + + "\nServer: " + UtilServer.getServerName() + + "\nTPS: " + FORMAT.format(_lag.getTicksPerSecond())), + true); + } + catch (MalformedURLException e) + { + } + } + +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java deleted file mode 100644 index 4523e1642..000000000 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java +++ /dev/null @@ -1,25 +0,0 @@ -package mineplex.gemhunters.util; - -public class SlackSheetsBot -{ - - private static final String SLACK_CHANNEL_NAME = "#google-sheet-errors"; - private static final String SLACK_USERNAME = "Google Sheets"; - private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/google-sheets-image.png"; - - public static final void reportParsingError(Exception exception, String spreadsheetName, String sheetName, int row) - { - String message = "A parsing error has occured on spreadsheet *" + spreadsheetName + "* sheet *" + sheetName + "* at row *" + row + "*.\n Details: " + exception.getMessage(); - - System.out.println(message); -// try -// { -// SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), message), true); -// } -// catch (MalformedURLException e) -// { -// e.printStackTrace(); -// } - } - -} From b446a7640e7dd5ea37ba0a3b9b548797db0cb740 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 11 May 2017 22:56:48 +0100 Subject: [PATCH 091/170] Hours not seconds --- .../src/mineplex/gemhunters/join/JoinModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java index a18716289..747d72cd5 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -103,7 +103,7 @@ public class JoinModule extends MiniPlugin private void loseDurability(ItemStack[] items, long time) { long diff = System.currentTimeMillis() - time; - long hours = TimeUnit.MILLISECONDS.toSeconds(diff); + long hours = TimeUnit.MILLISECONDS.toHours(diff); for (ItemStack item : items) { From 0091cbe2a8cf25929173d2ea96d803ab312d41f1 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 18:15:33 -0400 Subject: [PATCH 092/170] Change kit data loc formatting --- .../game/arcade/game/games/castleassault/CastleAssault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 5388c6fc1..8bef3e9b0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -398,7 +398,7 @@ public class CastleAssault extends TeamGame _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); for (Kit kit : GetKits()) { - List spawns = WorldData.GetDataLocs("K:" + kit.GetName()); + List spawns = WorldData.GetDataLocs(kit.GetName()); for (Location spawn : spawns) { Entity ent = kit.SpawnEntity(spawn); From 4a05149743862b42833f1fd89b2f104af39b9051 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 18:29:42 -0400 Subject: [PATCH 093/170] Use correct data loc pool for kit locations --- .../game/arcade/game/games/castleassault/CastleAssault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 8bef3e9b0..c1d2a7f0e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -398,7 +398,7 @@ public class CastleAssault extends TeamGame _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); for (Kit kit : GetKits()) { - List spawns = WorldData.GetDataLocs(kit.GetName()); + List spawns = WorldData.GetCustomLocs(kit.GetName().toUpperCase()); for (Location spawn : spawns) { Entity ent = kit.SpawnEntity(spawn); From a76572f6d759c5b7d57c666a2e67a94bef974722 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 20:49:38 -0400 Subject: [PATCH 094/170] Change table names and add date indexes based on Jon's request --- .../leaderboard/LeaderboardRepository.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index d03464be4..68f1133e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -20,25 +20,25 @@ public class LeaderboardRepository extends RepositoryBase { private static final int SEASON = 1; - private static final String CREATE_TOTAL = "CREATE TABLE accountSeasonStatsTotal (accountId INT NOT NULL, statId INT NOT NULL, season SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId, season), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String CREATE_YEARLY = "CREATE TABLE accountSeasonStatsYearly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String CREATE_MONTHLY = "CREATE TABLE accountSeasonStatsMonthly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String CREATE_WEEKLY = "CREATE TABLE accountSeasonStatsWeekly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String CREATE_DAILY = "CREATE TABLE accountSeasonStatsDaily (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_TOTAL = "CREATE TABLE accountStatsSeasonalTotal (accountId INT NOT NULL, statId INT NOT NULL, season SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId, season), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_YEARLY = "CREATE TABLE accountStatsYearly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_MONTHLY = "CREATE TABLE accountStatsMonthly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_WEEKLY = "CREATE TABLE accountStatsWeekly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_DAILY = "CREATE TABLE accountStatsDaily (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; - private static final String INSERT_STAT = "INSERT INTO accountSeasonStatsTotal (accountId, statId, season, value) VALUES (?, ?, " + SEASON + ", ?);"; - private static final String INSERT_STAT_ALL = "INSERT INTO accountSeasonStatsTotal (accountId, statId, season, value) VALUES (?, ?, 0, ?);"; - private static final String UPDATE_STAT = "UPDATE accountSeasonStatsTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=" + SEASON + ";"; - private static final String UPDATE_STAT_ALL = "UPDATE accountSeasonStatsTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=0;"; + private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonalTotal (accountId, statId, season, value) VALUES (?, ?, " + SEASON + ", ?);"; + private static final String INSERT_STAT_ALL = "INSERT INTO accountStatsSeasonalTotal (accountId, statId, season, value) VALUES (?, ?, 0, ?);"; + private static final String UPDATE_STAT = "UPDATE accountStatsSeasonalTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=" + SEASON + ";"; + private static final String UPDATE_STAT_ALL = "UPDATE accountStatsSeasonalTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=0;"; - private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountSeasonStatsTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=0 ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsSeasonalTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=0 ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountSeasonStatsYearly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountSeasonStatsMonthly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountSeasonStatsWeekly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountSeasonStatsDaily AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsYearly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsMonthly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsWeekly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsDaily AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountSeasonStatsTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonalTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { From 1e93ad0b1e5ba61a20aaf098792decb792114957 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 21:18:05 -0400 Subject: [PATCH 095/170] Proper resource management for leaderboard statements --- .../leaderboard/LeaderboardRepository.java | 76 +++++++++---------- 1 file changed, 34 insertions(+), 42 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 68f1133e0..d52b487d7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -49,13 +49,8 @@ public class LeaderboardRepository extends RepositoryBase { UtilServer.runAsync(() -> { - try (Connection c = getConnection()) + try (Connection c = getConnection(); PreparedStatement s = c.prepareStatement(UPDATE_STAT); PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement v = c.prepareStatement(INSERT_STAT); PreparedStatement w = c.prepareStatement(INSERT_STAT_ALL)) { - final boolean auto = c.getAutoCommit(); - - c.setAutoCommit(true); - PreparedStatement s = c.prepareStatement(UPDATE_STAT); - PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); for (Integer accountId : stats.keySet()) { for (Integer statId : stats.get(accountId).keySet()) @@ -72,9 +67,6 @@ public class LeaderboardRepository extends RepositoryBase } int[] rowsAffected1 = s.executeBatch(); int[] rowsAffected2 = u.executeBatch(); - c.setAutoCommit(false); - s = c.prepareStatement(INSERT_STAT); - u = c.prepareStatement(INSERT_STAT_ALL); int i = 0; for (Integer accountId : stats.keySet()) { @@ -82,25 +74,23 @@ public class LeaderboardRepository extends RepositoryBase { if (rowsAffected1[i] < 1) { - s.setInt(1, accountId); - s.setInt(2, statId); - s.setLong(3, stats.get(accountId).get(statId)); - s.addBatch(); + v.setInt(1, accountId); + v.setInt(2, statId); + v.setLong(3, stats.get(accountId).get(statId)); + v.addBatch(); } if (rowsAffected2[i] < 1) { - u.setInt(1, accountId); - u.setInt(2, statId); - u.setLong(3, stats.get(accountId).get(statId)); - u.addBatch(); + w.setInt(1, accountId); + w.setInt(2, statId); + w.setLong(3, stats.get(accountId).get(statId)); + w.addBatch(); } i++; } } - s.executeBatch(); - u.executeBatch(); - - c.setAutoCommit(auto); + v.executeBatch(); + w.executeBatch(); } catch (SQLException e) { @@ -111,38 +101,42 @@ public class LeaderboardRepository extends RepositoryBase public void insertStats(int accountId, Map stats) { - try (Connection c = getConnection()) + try (Connection c = getConnection(); PreparedStatement s = c.prepareStatement(UPDATE_STAT); PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement v = c.prepareStatement(INSERT_STAT); PreparedStatement w = c.prepareStatement(INSERT_STAT_ALL)) { - final boolean auto = c.getAutoCommit(); - - c.setAutoCommit(true); - PreparedStatement s = c.prepareStatement(UPDATE_STAT); for (Integer statId : stats.keySet()) { s.setLong(1, stats.get(statId)); s.setInt(2, accountId); s.setInt(3, statId); s.addBatch(); + u.setLong(1, stats.get(statId)); + u.setInt(2, accountId); + u.setInt(3, statId); + u.addBatch(); } - int[] rowsAffected = s.executeBatch(); - c.setAutoCommit(false); - s = c.prepareStatement(INSERT_STAT); + int[] rowsAffected1 = s.executeBatch(); + int[] rowsAffected2 = u.executeBatch(); int i = 0; for (Integer statId : stats.keySet()) { - if (rowsAffected[i] < 1) + if (rowsAffected1[i] < 1) { - s.setInt(1, accountId); - s.setInt(2, statId); - s.setLong(3, stats.get(statId)); - s.addBatch(); + v.setInt(1, accountId); + v.setInt(2, statId); + v.setLong(3, stats.get(statId)); + v.addBatch(); + } + if (rowsAffected2[i] < 1) + { + w.setInt(1, accountId); + w.setInt(2, statId); + w.setLong(3, stats.get(statId)); + w.addBatch(); } i++; } - s.executeBatch(); - - c.setAutoCommit(auto); - + v.executeBatch(); + w.executeBatch(); } catch (SQLException e) { @@ -153,9 +147,8 @@ public class LeaderboardRepository extends RepositoryBase public void loadLeaderboard(Leaderboard board, Consumer> leaderboard) { Map names = new LinkedHashMap<>(); - try (Connection c = getConnection()) + try (Connection c = getConnection(); Statement s = c.createStatement()) { - Statement s = c.createStatement(); s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); for (int i = 0; i < board.getStatIds().length; i++) { @@ -200,9 +193,8 @@ public class LeaderboardRepository extends RepositoryBase if (queryBuilder.length() > 0) { - try (Connection c = getConnection()) + try (Connection c = getConnection(); Statement s = c.createStatement()) { - Statement s = c.createStatement(); s.execute(queryBuilder.toString()); int index = 0; mainBoardLoop: for (Leaderboard board : boards) From 3023c64c359c631ba29ffdd4ad9b988e655e1b1e Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 21:34:41 -0400 Subject: [PATCH 096/170] Jon is actually OCD --- .../leaderboard/LeaderboardRepository.java | 106 ++++++++++-------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index d52b487d7..5c79561f3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -49,24 +49,30 @@ public class LeaderboardRepository extends RepositoryBase { UtilServer.runAsync(() -> { - try (Connection c = getConnection(); PreparedStatement s = c.prepareStatement(UPDATE_STAT); PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement v = c.prepareStatement(INSERT_STAT); PreparedStatement w = c.prepareStatement(INSERT_STAT_ALL)) + try ( + Connection c = getConnection(); + PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); + PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); + PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); + PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); + ) { for (Integer accountId : stats.keySet()) { for (Integer statId : stats.get(accountId).keySet()) { - s.setLong(1, stats.get(accountId).get(statId)); - s.setInt(2, accountId); - s.setInt(3, statId); - s.addBatch(); - u.setLong(1, stats.get(accountId).get(statId)); - u.setInt(2, accountId); - u.setInt(3, statId); - u.addBatch(); + updateStat.setLong(1, stats.get(accountId).get(statId)); + updateStat.setInt(2, accountId); + updateStat.setInt(3, statId); + updateStat.addBatch(); + updateAllStats.setLong(1, stats.get(accountId).get(statId)); + updateAllStats.setInt(2, accountId); + updateAllStats.setInt(3, statId); + updateAllStats.addBatch(); } } - int[] rowsAffected1 = s.executeBatch(); - int[] rowsAffected2 = u.executeBatch(); + int[] rowsAffected1 = updateStat.executeBatch(); + int[] rowsAffected2 = updateAllStats.executeBatch(); int i = 0; for (Integer accountId : stats.keySet()) { @@ -74,23 +80,23 @@ public class LeaderboardRepository extends RepositoryBase { if (rowsAffected1[i] < 1) { - v.setInt(1, accountId); - v.setInt(2, statId); - v.setLong(3, stats.get(accountId).get(statId)); - v.addBatch(); + insertStat.setInt(1, accountId); + insertStat.setInt(2, statId); + insertStat.setLong(3, stats.get(accountId).get(statId)); + insertStat.addBatch(); } if (rowsAffected2[i] < 1) { - w.setInt(1, accountId); - w.setInt(2, statId); - w.setLong(3, stats.get(accountId).get(statId)); - w.addBatch(); + insertAllStats.setInt(1, accountId); + insertAllStats.setInt(2, statId); + insertAllStats.setLong(3, stats.get(accountId).get(statId)); + insertAllStats.addBatch(); } i++; } } - v.executeBatch(); - w.executeBatch(); + insertStat.executeBatch(); + insertAllStats.executeBatch(); } catch (SQLException e) { @@ -101,42 +107,48 @@ public class LeaderboardRepository extends RepositoryBase public void insertStats(int accountId, Map stats) { - try (Connection c = getConnection(); PreparedStatement s = c.prepareStatement(UPDATE_STAT); PreparedStatement u = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement v = c.prepareStatement(INSERT_STAT); PreparedStatement w = c.prepareStatement(INSERT_STAT_ALL)) + try ( + Connection c = getConnection(); + PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); + PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); + PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); + PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); + ) { for (Integer statId : stats.keySet()) { - s.setLong(1, stats.get(statId)); - s.setInt(2, accountId); - s.setInt(3, statId); - s.addBatch(); - u.setLong(1, stats.get(statId)); - u.setInt(2, accountId); - u.setInt(3, statId); - u.addBatch(); + updateStat.setLong(1, stats.get(statId)); + updateStat.setInt(2, accountId); + updateStat.setInt(3, statId); + updateStat.addBatch(); + updateAllStats.setLong(1, stats.get(statId)); + updateAllStats.setInt(2, accountId); + updateAllStats.setInt(3, statId); + updateAllStats.addBatch(); } - int[] rowsAffected1 = s.executeBatch(); - int[] rowsAffected2 = u.executeBatch(); + int[] rowsAffected1 = updateStat.executeBatch(); + int[] rowsAffected2 = updateAllStats.executeBatch(); int i = 0; for (Integer statId : stats.keySet()) { if (rowsAffected1[i] < 1) { - v.setInt(1, accountId); - v.setInt(2, statId); - v.setLong(3, stats.get(statId)); - v.addBatch(); + insertStat.setInt(1, accountId); + insertStat.setInt(2, statId); + insertStat.setLong(3, stats.get(statId)); + insertStat.addBatch(); } if (rowsAffected2[i] < 1) { - w.setInt(1, accountId); - w.setInt(2, statId); - w.setLong(3, stats.get(statId)); - w.addBatch(); + insertAllStats.setInt(1, accountId); + insertAllStats.setInt(2, statId); + insertAllStats.setLong(3, stats.get(statId)); + insertAllStats.addBatch(); } i++; } - v.executeBatch(); - w.executeBatch(); + insertStat.executeBatch(); + insertAllStats.executeBatch(); } catch (SQLException e) { @@ -147,7 +159,10 @@ public class LeaderboardRepository extends RepositoryBase public void loadLeaderboard(Leaderboard board, Consumer> leaderboard) { Map names = new LinkedHashMap<>(); - try (Connection c = getConnection(); Statement s = c.createStatement()) + try ( + Connection c = getConnection(); + Statement s = c.createStatement(); + ) { s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); for (int i = 0; i < board.getStatIds().length; i++) @@ -193,7 +208,10 @@ public class LeaderboardRepository extends RepositoryBase if (queryBuilder.length() > 0) { - try (Connection c = getConnection(); Statement s = c.createStatement()) + try ( + Connection c = getConnection(); + Statement s = c.createStatement(); + ) { s.execute(queryBuilder.toString()); int index = 0; From 7ad86c435c35920dfb463ee3d00379400abba11d Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Thu, 11 May 2017 21:40:06 -0400 Subject: [PATCH 097/170] More nitpicks --- .../leaderboard/LeaderboardRepository.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 5c79561f3..866a1e5b7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -51,10 +51,10 @@ public class LeaderboardRepository extends RepositoryBase { try ( Connection c = getConnection(); - PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); - PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); - PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); - PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); + PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); + PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); + PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); + PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); ) { for (Integer accountId : stats.keySet()) @@ -167,15 +167,17 @@ public class LeaderboardRepository extends RepositoryBase s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); for (int i = 0; i < board.getStatIds().length; i++) { - ResultSet rs = s.getResultSet(); - while (rs.next()) + try (ResultSet rs = s.getResultSet()) { - names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); - } - - if (!s.getMoreResults()) - { - break; + while (rs.next()) + { + names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break; + } } } } @@ -219,15 +221,17 @@ public class LeaderboardRepository extends RepositoryBase { for (int i = 0; i < board.getStatIds().length; i++) { - ResultSet rs = s.getResultSet(); - while (rs.next()) + try (ResultSet rs = s.getResultSet()) { - leaderboards[index].merge(rs.getString("name"), rs.getInt("value"), Integer::sum); - } - - if (!s.getMoreResults()) - { - break mainBoardLoop; + while (rs.next()) + { + leaderboards[index].merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break mainBoardLoop; + } } } index++; From c8a103559103603f32a764d36b29645427f0fab8 Mon Sep 17 00:00:00 2001 From: samczsun Date: Fri, 14 Apr 2017 00:52:52 -0400 Subject: [PATCH 098/170] Comped accounts --- .../src/mineplex/core/common/api/ApiHost.java | 5 ++ .../mineplex/core/common/util/UtilPlayer.java | 6 ++ .../src/mineplex/core/antihack/AntiHack.java | 6 ++ .../core/antihack/banwave/BanWaveManager.java | 2 + .../CompromisedAccountManager.java | 76 +++++++++++++++++++ .../CompromisedAccountRepository.java | 46 +++++++++++ .../antihack/compedaccount/PlayerInfo.java | 62 +++++++++++++++ 7 files changed, 203 insertions(+) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java index a6dd1cbae..b1593c552 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java @@ -71,6 +71,11 @@ public class ApiHost return getAPIHost("ENDERCHEST"); } + public static ApiHost getBanner() + { + return getAPIHost("BANNER"); + } + private String _host; private int _port; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java index bfc5e4ec8..19b7b6059 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java @@ -1,5 +1,6 @@ package mineplex.core.common.util; +import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1145,6 +1146,11 @@ public class UtilPlayer return entityPlayer.activeContainer != entityPlayer.defaultContainer; } + public static String getIp(Player player) + { + return player.getAddress().getAddress().getHostAddress(); + } + /* * Returns whether the UUID belongs to a slim skin */ diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index b59982c6f..ffb40fc5d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -68,6 +68,7 @@ import mineplex.core.antihack.commands.AnticheatOnCommand; import mineplex.core.antihack.commands.DetailedMessagesCommand; import mineplex.core.antihack.commands.GetVlsCommand; import mineplex.core.antihack.commands.TestBanCommand; +import mineplex.core.antihack.compedaccount.CompromisedAccountManager; import mineplex.core.antihack.gep.GwenExtremePrejudice; import mineplex.core.antihack.guardians.GuardianManager; import mineplex.core.antihack.logging.AntihackLogger; @@ -147,6 +148,8 @@ public class AntiHack extends MiniPlugin private BanWaveManager _banWaveManager; + private final CompromisedAccountManager _compromisedAccountManager; + private AntiHack() { super("AntiHack"); @@ -155,6 +158,7 @@ public class AntiHack extends MiniPlugin require(GuardianManager.class); _banWaveManager = require(BanWaveManager.class); + _compromisedAccountManager = require(CompromisedAccountManager.class); Bukkit.getServicesManager().register(MineplexLink.class, new MineplexLinkImpl(), this._plugin, ServicePriority.Normal); @@ -225,6 +229,8 @@ public class AntiHack extends MiniPlugin new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish(); }); + _compromisedAccountManager.submitImmediateBan(player); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, -1, true, after); }; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java index 668c60db2..a4a5476e5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java @@ -5,6 +5,7 @@ import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.antihack.AntiHack; +import mineplex.core.antihack.compedaccount.CompromisedAccountManager; import mineplex.core.antihack.logging.AntihackLogger; import mineplex.core.antihack.redisnotifications.GwenBanwaveNotification; import mineplex.core.common.util.UtilServer; @@ -74,6 +75,7 @@ public class BanWaveManager extends MiniPlugin JsonObject custom = new JsonObject(); custom.addProperty("is-banwave", true); + require(CompromisedAccountManager.class).submitPendingDelayedBan(player); require(AntihackLogger.class).saveMetadata(player, id, after, custom); } }); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java new file mode 100644 index 000000000..cebea5a50 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java @@ -0,0 +1,76 @@ +package mineplex.core.antihack.compedaccount; + +import java.util.logging.Level; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import com.google.gson.JsonObject; + +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.account.CoreClient; +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.api.ApiHost; +import mineplex.core.common.api.ApiWebCall; +import mineplex.core.common.util.UtilPlayer; + +@ReflectivelyCreateMiniPlugin +public class CompromisedAccountManager extends MiniPlugin +{ + private final CompromisedAccountRepository _repository = new CompromisedAccountRepository(); + + private final CoreClientManager _clientManager = require(CoreClientManager.class); + + private final ApiWebCall _apiCall; + + private CompromisedAccountManager() + { + super("CompedAccount"); + + String url = "http://" + ApiHost.getBanner().getHost() + ":" + ApiHost.getBanner().getPort() + "/"; + _apiCall = new ApiWebCall(url); + } + + public void submitImmediateBan(Player player) + { + _repository.insertPunishment(_clientManager.getAccountId(player), UtilPlayer.getIp(player), "immediate").whenComplete((res, err) -> + { + if (err != null) + { + getPlugin().getLogger().log(Level.SEVERE, "An unexpected error occurred while submitting immediate ban of " + player.getName(), err); + } + }); + } + + public void submitPendingDelayedBan(Player player) + { + _repository.insertPunishment(_clientManager.getAccountId(player), UtilPlayer.getIp(player), "predelayed").whenComplete((res, err) -> + { + if (err != null) + { + getPlugin().getLogger().log(Level.SEVERE, "An unexpected error occurred while submitting delayed ban of " + player.getName(), err); + } + }); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) + { + CoreClient coreClient = _clientManager.Get(event.getPlayer()); + PlayerInfo playerInfo = new PlayerInfo( + event.getPlayer().getName(), + coreClient.getName(), + event.getPlayer().getUniqueId(), + coreClient.getAccountId(), + UtilPlayer.getIp(event.getPlayer()) + ); + + JsonObject response = _apiCall.post("api/server/login/" + event.getPlayer().getName(), JsonObject.class, playerInfo); + if (response != null && response.get("error") != null) + { + getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java new file mode 100644 index 000000000..c9af4fa35 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java @@ -0,0 +1,46 @@ +package mineplex.core.antihack.compedaccount; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; + +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; + +public class CompromisedAccountRepository extends RepositoryBase +{ + private static final String INSERT_BAN = "INSERT INTO gwenPunishments (accountId, ip, type) VALUES (?, ?, ?)"; + + public CompromisedAccountRepository() + { + super(DBPool.getAccount()); + } + + public CompletableFuture insertPunishment(int accountId, String ip, String type) + { + CompletableFuture future = new CompletableFuture<>(); + + CompletableFuture.runAsync(() -> { + try (Connection connection = getConnection()) + { + try (PreparedStatement preparedStatement = connection.prepareStatement(INSERT_BAN)) + { + preparedStatement.setInt(1, accountId); + preparedStatement.setString(2, ip); + preparedStatement.setString(3, type); + preparedStatement.executeUpdate(); + } + } + catch (SQLException ex) + { + future.completeExceptionally(ex); + return; + } + future.complete(null); + }); + + return future; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java new file mode 100644 index 000000000..d80ccf5b9 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java @@ -0,0 +1,62 @@ +package mineplex.core.antihack.compedaccount; + +import java.util.Objects; +import java.util.UUID; + +public class PlayerInfo +{ + private final String _name; + private final String _realName; + private final UUID _uuid; + private final int _accountId; + private final String _ip; + + public PlayerInfo(String name, String realName, UUID uuid, int accountId, String ip) + { + _name = name; + _realName = realName; + _uuid = uuid; + _accountId = accountId; + _ip = ip; + } + + public String getName() + { + return _name; + } + + public String getRealName() + { + return _realName; + } + + public UUID getUuid() + { + return _uuid; + } + + public int getAccountId() + { + return _accountId; + } + + public String getIp() + { + return _ip; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (!(o instanceof PlayerInfo)) return false; + PlayerInfo that = (PlayerInfo) o; + return _accountId == that._accountId; + } + + @Override + public int hashCode() + { + return Objects.hash(_accountId); + } +} From ecef2fe9db5bf6a560461c7099f50d95deb69527 Mon Sep 17 00:00:00 2001 From: samczsun Date: Wed, 26 Apr 2017 20:05:33 -0400 Subject: [PATCH 099/170] New messages/durations --- .../src/mineplex/core/antihack/AntiHack.java | 64 +++++++++++++++++-- .../core/antihack/banwave/BanWaveManager.java | 2 +- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index ffb40fc5d..515ab35da 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -81,6 +81,8 @@ import mineplex.core.preferences.Preference; import mineplex.core.preferences.PreferencesManager; import mineplex.core.punish.Category; import mineplex.core.punish.Punish; +import mineplex.core.punish.PunishClient; +import mineplex.core.punish.Punishment; import mineplex.core.punish.PunishmentResponse; import mineplex.serverdata.commands.ServerCommandManager; @@ -212,7 +214,7 @@ public class AntiHack extends MiniPlugin CoreClient coreClient = _clientManager.Get(player); String id = generateId(); - String finalMessage = "[GWEN] " + id; + String finalMessage = "[GWEN] Cheat Detection\nToken: " + id; JsonObject custom = new JsonObject(); custom.addProperty("ban-reason", CheckManager.getCheckSimpleName(cause)); if (gep) @@ -231,7 +233,7 @@ public class AntiHack extends MiniPlugin _compromisedAccountManager.submitImmediateBan(player); - _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, -1, true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, getDaysBanned(player, cause), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -270,7 +272,7 @@ public class AntiHack extends MiniPlugin Consumer> doPunish = after -> { - _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, -1, true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getDaysBanned(player, CheckManager.getCheckBySimpleName(info.getHackType())), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -346,6 +348,60 @@ public class AntiHack extends MiniPlugin event.setCancelled(true); } + public int getPunishments(Player player) + { + PunishClient punishClient = require(Punish.class).GetClient(player.getName()); + + int totalPunishments = 0; + + if (punishClient.GetPunishments().containsKey(Category.Hacking)) + { + for (Punishment punishment : punishClient.GetPunishments().get(Category.Hacking)) + { + if (punishment.GetAdmin().equalsIgnoreCase(NAME) && punishment.GetReason().contains("[GWEN]")) + { + totalPunishments++; + } + } + } + + return totalPunishments; + } + + public int getDaysBanned(Player player, Class check) + { + if (check == null) // old banwaves + { + switch (getPunishments(player)) + { + case 0: + return 5; + case 1: + return 14; + case 2: + return 30; + default: + return -1; + } + } + + switch (check.getSimpleName()) + { + default: + switch (getPunishments(player)) + { + case 0: + return 5; + case 1: + return 14; + case 2: + return 30; + default: + return -1; + } + } + } + public void announceBan(Player player) { Bukkit.getServer().broadcastMessage(String.format(USER_HAS_BEEN_BANNED, player.getName())); @@ -433,7 +489,7 @@ public class AntiHack extends MiniPlugin .append("A").color(ChatColor.AQUA).obfuscated(true) .append(" GWEN > ", ComponentBuilder.FormatRetention.NONE).color(ChatColor.RED).bold(true) .append(violation.getPlayerName(), ComponentBuilder.FormatRetention.NONE).color(ChatColor.GOLD) - .append(" failed " + violation.getHackType() + " VL" + violation.getViolations() + " in server", ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) + .append(" failed " + violation.getHackType() + " VL" + violation.getViolations() + " in server ", ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) .append(violation.getOriginatingServer(), ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/server " + violation.getOriginatingServer())) .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java index a4a5476e5..3c3d2a179 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java @@ -61,7 +61,7 @@ public class BanWaveManager extends MiniPlugin runAsync(() -> { String id = AntiHack.generateId(); - String newMessage = "[GWEN] [BanWave] " + id; + String newMessage = "[GWEN] Cheat Detection (Banwave)\nToken: " + id; CoreClient client = _clientManager.Get(player); From 1390ea1579205ce754ffe1ea9f036b9a9e6441c3 Mon Sep 17 00:00:00 2001 From: samczsun Date: Thu, 27 Apr 2017 12:28:07 -0400 Subject: [PATCH 100/170] Implement triggers --- .../CompromisedAccountManager.java | 44 +++++++++++++------ .../antihack/compedaccount/PriorityCause.java | 7 +++ .../compedaccount/TriggerPriorityInfo.java | 23 ++++++++++ .../nautilus/game/arcade/ArcadeManager.java | 10 +++++ .../arcade/managers/chat/GameChatManager.java | 3 ++ 5 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java index cebea5a50..48f092b2e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java @@ -58,19 +58,37 @@ public class CompromisedAccountManager extends MiniPlugin @EventHandler public void onJoin(PlayerJoinEvent event) { - CoreClient coreClient = _clientManager.Get(event.getPlayer()); - PlayerInfo playerInfo = new PlayerInfo( - event.getPlayer().getName(), - coreClient.getName(), - event.getPlayer().getUniqueId(), - coreClient.getAccountId(), - UtilPlayer.getIp(event.getPlayer()) - ); - - JsonObject response = _apiCall.post("api/server/login/" + event.getPlayer().getName(), JsonObject.class, playerInfo); - if (response != null && response.get("error") != null) + runAsync(() -> { - getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); - } + JsonObject response = _apiCall.post("api/server/login/" + event.getPlayer().getName(), JsonObject.class, getPlayerInfo(event.getPlayer())); + if (response != null && response.get("error") != null) + { + getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); + } + }); + } + + public void triggerPriorityBan(Player player, PriorityCause cause) + { + runAsync(() -> + { + JsonObject response = _apiCall.post("api/banner/trigger/" + player.getName(), JsonObject.class, new TriggerPriorityInfo(getPlayerInfo(player), cause)); + if (response != null && response.get("error") != null) + { + getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); + } + }); + } + + private PlayerInfo getPlayerInfo(Player player) + { + CoreClient coreClient = _clientManager.Get(player); + return new PlayerInfo( + player.getName(), + coreClient.getName(), + player.getUniqueId(), + coreClient.getAccountId(), + UtilPlayer.getIp(player) + ); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java new file mode 100644 index 000000000..697432b38 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java @@ -0,0 +1,7 @@ +package mineplex.core.antihack.compedaccount; + +public enum PriorityCause +{ + JOIN_GAME, + CHAT +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java new file mode 100644 index 000000000..aea9654e2 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java @@ -0,0 +1,23 @@ +package mineplex.core.antihack.compedaccount; + +public class TriggerPriorityInfo +{ + private final PlayerInfo _target; + private final PriorityCause _cause; + + public TriggerPriorityInfo(PlayerInfo target, PriorityCause cause) + { + _target = target; + _cause = cause; + } + + public PlayerInfo getTarget() + { + return _target; + } + + public PriorityCause getCause() + { + return _cause; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 20c226a03..6fe776ff3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -39,6 +39,8 @@ import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; +import mineplex.core.antihack.compedaccount.CompromisedAccountManager; +import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blood.Blood; import mineplex.core.bonuses.BonusManager; @@ -262,6 +264,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation public final boolean IsHolidayEnabled; private final Titles _titles; + private final CompromisedAccountManager _compromisedAccountManager = require(CompromisedAccountManager.class); public ArcadeManager(Arcade plugin, ServerStatusManager serverStatusManager, GameServerConfig serverConfig, CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, @@ -972,6 +975,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation @EventHandler public void MessageJoin(PlayerJoinEvent event) { + _compromisedAccountManager.triggerPriorityBan(event.getPlayer(), PriorityCause.JOIN_GAME); + if (_incognitoManager.Get(event.getPlayer()).Status) { event.setJoinMessage(null); @@ -2063,4 +2068,9 @@ public class ArcadeManager extends MiniPlugin implements IRelation { return this._titles; } + + public CompromisedAccountManager getCompromisedAccountManager() + { + return _compromisedAccountManager; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java index 69e9958d2..a65ffd6cf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java @@ -15,6 +15,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.jooq.tools.json.JSONObject; +import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.common.Rank; import mineplex.core.common.jsonchat.JsonMessage; import mineplex.core.common.util.C; @@ -67,6 +68,8 @@ public class GameChatManager implements Listener if (event.getMessage().trim().length() == 0) return; + _manager.getCompromisedAccountManager().triggerPriorityBan(event.getPlayer(), PriorityCause.CHAT); + Player sender = event.getPlayer(); String senderName = sender.getName(); From 7658046d621a3eff8c75ab1349a09b86fec160f1 Mon Sep 17 00:00:00 2001 From: samczsun Date: Thu, 27 Apr 2017 12:32:11 -0400 Subject: [PATCH 101/170] Change messages --- Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java | 2 +- .../src/mineplex/core/antihack/banwave/BanWaveManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index 515ab35da..525351b5a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -214,7 +214,7 @@ public class AntiHack extends MiniPlugin CoreClient coreClient = _clientManager.Get(player); String id = generateId(); - String finalMessage = "[GWEN] Cheat Detection\nToken: " + id; + String finalMessage = "[GWEN Cheat Detection]\n\nToken: " + id; JsonObject custom = new JsonObject(); custom.addProperty("ban-reason", CheckManager.getCheckSimpleName(cause)); if (gep) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java index 3c3d2a179..3eb4506b0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java @@ -61,7 +61,7 @@ public class BanWaveManager extends MiniPlugin runAsync(() -> { String id = AntiHack.generateId(); - String newMessage = "[GWEN] Cheat Detection (Banwave)\nToken: " + id; + String newMessage = "[GWEN Cheat Detection]\n\nToken: " + id; CoreClient client = _clientManager.Get(player); From 5c968890d304fa8ee9a99bb1407b29477675ee28 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 11 May 2017 23:07:46 +0100 Subject: [PATCH 102/170] Just implement logging --- .../loot/rewards/LootChestReward.java | 21 +++----- .../loot/rewards/LootGadgetReward.java | 10 ++-- .../loot/rewards/LootRankReward.java | 5 +- .../loot/rewards/LootShardReward.java | 3 +- .../gemhunters/util/SlackRewardBot.java | 49 +++++++++++++++++++ 5 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java index 5ef354ec1..323c184f9 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -10,14 +11,14 @@ public class LootChestReward extends LootItemReward { private final InventoryManager _inventory; - + private final String _chestName; private final int _amount; - + public LootChestReward(long cashOutDelay, ItemStack itemStack, String chestName, int amount) { super(chestName + " Chest", cashOutDelay, itemStack); - + _inventory = Managers.require(InventoryManager.class); _chestName = chestName; _amount = amount; @@ -26,27 +27,19 @@ public class LootChestReward extends LootItemReward @Override public void onCollectItem() { - + } @Override public void onSuccessful() { - _inventory.addItemToInventory(new Callback() - { - - @Override - public void run(Boolean success) - { - //DebugModule.getInstance().d("Success= " + success); - } - }, _player, _chestName + " Chest", _amount); + _inventory.addItemToInventory(success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure"), _player, _chestName + " Chest", _amount); } @Override public void onDeath() { - + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java index 59f9db30f..03ba74fe6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java @@ -1,5 +1,9 @@ package mineplex.gemhunters.loot.rewards; +import com.sun.org.apache.xpath.internal.operations.Bool; +import mineplex.core.common.util.Callback; +import mineplex.core.server.util.TransactionResponse; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -35,13 +39,11 @@ public class LootGadgetReward extends LootItemReward if (donor.ownsUnknownSalesPackage(_gadget)) { - //DebugModule.getInstance().d("Shard duplicate"); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random())); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random()), success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); } else { - //DebugModule.getInstance().d("Adding gadget"); - _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, null); + _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, transaction -> SlackRewardBot.logReward(_player, this, transaction == TransactionResponse.Success ? "Success" : "Failure")); } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java index 58ae67fb3..e0e592fd3 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java @@ -2,6 +2,7 @@ package mineplex.gemhunters.loot.rewards; import java.util.concurrent.TimeUnit; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -70,11 +71,11 @@ public class LootRankReward extends LootItemReward if (newRank == null) { _player.sendMessage(F.main("Loot", "Since you already have eternal ( You are lucky :) ). So instead you can have " + CONSOLATION_PRICE + " shards.")); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE, success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); return; } - _clientManager.SaveRank(_player.getName(), _player.getUniqueId(), newRank, true); + _clientManager.SaveRank(callback -> SlackRewardBot.logReward(_player, this, callback.Name), _player.getName(), _player.getUniqueId(), newRank, true); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java index af1119a73..458e577e1 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -30,7 +31,7 @@ public class LootShardReward extends LootItemReward @Override public void onSuccessful() { - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount, success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure")); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java new file mode 100644 index 000000000..8544e411b --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java @@ -0,0 +1,49 @@ +package mineplex.gemhunters.util; + +import mineplex.core.Managers; +import mineplex.core.common.util.UtilServer; +import mineplex.core.monitor.LagMeter; +import mineplex.core.slack.SlackAPI; +import mineplex.core.slack.SlackMessage; +import mineplex.core.slack.SlackTeam; +import mineplex.gemhunters.loot.rewards.LootItemReward; +import org.bukkit.entity.Player; + +import java.net.MalformedURLException; +import java.net.URL; +import java.text.DecimalFormat; + +public class SlackRewardBot +{ + + private static final DecimalFormat FORMAT = new DecimalFormat("0.0"); + private static final String SLACK_CHANNEL_NAME = "#gem-hunters-logging"; + private static final String SLACK_USERNAME = "Gem Hunters"; + private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/chest-image.png"; + + private static LagMeter _lag; + + public static void logReward(Player player, LootItemReward reward, String status) + { + if (_lag == null) + { + _lag = Managers.get(LagMeter.class); + } + + try + { + SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), + "Rewarding a " + reward.getClass().getSimpleName() + + "\nName: " + reward.getItemStack().getItemMeta().getDisplayName() + + "\nPlayer: " + player.getName() + + "\nStatus: *" + status + "*" + + "\nServer: " + UtilServer.getServerName() + + "\nTPS: " + FORMAT.format(_lag.getTicksPerSecond())), + true); + } + catch (MalformedURLException e) + { + } + } + +} \ No newline at end of file From 7b7b91ed3ffac491c13865bd70315c522978a08c Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 12 May 2017 00:47:11 -0400 Subject: [PATCH 103/170] Fix small gameplay issues and update kit selection data points for TDM --- .../games/castleassault/CastleAssault.java | 24 +++++++++++-- .../games/castleassault/CastleAssaultTDM.java | 35 +++++++++++++------ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index c1d2a7f0e..4df26278e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -820,7 +820,7 @@ public class CastleAssault extends TeamGame @SuppressWarnings("deprecation") @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + public void onPlayerFillBucket(PlayerBucketFillEvent event) { if (!IsLive()) { @@ -828,10 +828,10 @@ public class CastleAssault extends TeamGame } Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) { event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); } } @@ -1117,6 +1117,11 @@ public class CastleAssault extends TeamGame { return; } + if (Manager.GetLobby().getKits().containsKey(event.getEntity())) + { + event.setCancelled(true); + return; + } if (event.getEntity() instanceof EnderCrystal) { event.setCancelled(true); @@ -1127,6 +1132,10 @@ public class CastleAssault extends TeamGame event.setCancelled(true); if (event instanceof EntityDamageByEntityEvent) { + if (!event.getEntity().getCustomName().contains("Ryan") && !event.getEntity().getCustomName().contains("Jon")) + { + return; + } GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; if (e.getDamager() instanceof Player) @@ -1353,6 +1362,11 @@ public class CastleAssault extends TeamGame { return; } + + Bukkit.getOnlinePlayers().forEach(player -> + { + player.getInventory().remove(_wearableTnt.build()); + }); Iterator tntIterator = _tntCarry.iterator(); @@ -1406,6 +1420,10 @@ public class CastleAssault extends TeamGame UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); + if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() != Material.TNT) + { + player.getInventory().setHelmet(_wearableTnt.build()); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index e9bfa88d6..e83f12804 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -29,6 +29,7 @@ import org.bukkit.event.block.BlockFadeEvent; import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileHitEvent; @@ -307,16 +308,14 @@ public class CastleAssaultTDM extends TeamGame GameTeam blue = GetTeam(ChatColor.AQUA); _teamKills.put(blue, 0); this.CreatureAllowOverride = true; - int kitIndex = 0; - for (int i = 0; i < WorldData.GetDataLocs("WHITE").size(); i++) + for (Kit kit : GetKits()) { - if (kitIndex >= GetKits().length) + List spawns = WorldData.GetCustomLocs(kit.GetName().toUpperCase()); + for (Location spawn : spawns) { - kitIndex = 0; + Entity ent = kit.SpawnEntity(spawn); + Manager.GetLobby().addKitLocation(ent, kit, spawn); } - Entity ent = GetKits()[kitIndex].SpawnEntity(WorldData.GetDataLocs("WHITE").get(i)); - Manager.GetLobby().addKitLocation(ent, GetKits()[kitIndex], WorldData.GetDataLocs("WHITE").get(i)); - kitIndex++; } this.CreatureAllowOverride = false; } @@ -711,18 +710,18 @@ public class CastleAssaultTDM extends TeamGame @SuppressWarnings("deprecation") @EventHandler(ignoreCancelled=true) - public void onPlayerEmptyBucket(PlayerBucketFillEvent event) + public void onPlayerFillBucket(PlayerBucketFillEvent event) { if (!IsLive()) { return; } - + Player player = event.getPlayer(); - if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) { event.setCancelled(true); - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); } } @@ -1068,4 +1067,18 @@ public class CastleAssaultTDM extends TeamGame _streakData.getOrDefault(player, new KillStreakData()).reset(); } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (Manager.GetLobby().getKits().containsKey(event.getEntity())) + { + event.setCancelled(true); + return; + } + } } \ No newline at end of file From 35ed1099f9246f96d25314e7e66c69e54262a175 Mon Sep 17 00:00:00 2001 From: Dan Mulloy Date: Fri, 12 May 2017 13:50:14 -0500 Subject: [PATCH 104/170] Avoid instantiating HologramManager twice --- Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 3421cb3d8..a4b0a0b88 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -184,7 +184,7 @@ public class Hub extends JavaPlugin implements IRelation String boosterGroup = serverConfiguration.getServerGroup().getBoosterGroup(); ThankManager thankManager = new ThankManager(this, clientManager, donationManager); BoosterManager boosterManager = new BoosterManager(this, boosterGroup, clientManager, donationManager, inventoryManager, thankManager); - HubManager hubManager = new HubManager(this, blockRestore, clientManager, incognito, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this, packetHandler), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, customDataManager, thankManager, boosterManager, castleManager); + HubManager hubManager = new HubManager(this, blockRestore, clientManager, incognito, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, hologramManager, npcManager, personalServerManager, packetHandler, punish, serverStatusManager, customDataManager, thankManager, boosterManager, castleManager); QueueManager queueManager = new QueueManager(this, clientManager, donationManager, eloManager, partyManager); ServerManager serverManager = new ServerManager(this, clientManager, donationManager, portal, partyManager, serverStatusManager, hubManager, queueManager, boosterManager); From ab35e96ca16680a9ee2b4e846a8a9f7374fe3661 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 May 2017 22:21:59 +0100 Subject: [PATCH 105/170] Add more polish --- .../game/games/alieninvasion/Alien.java | 92 +++++++++++++++++++ .../games/alieninvasion/AlienInvasion.java | 79 +++++++++++++--- .../arcade/game/games/alieninvasion/Beam.java | 18 ++-- .../games/alieninvasion/PhaserProjectile.java | 72 +++++++++++++++ .../games/alieninvasion/kit/KitPlayer.java | 21 ++--- .../games/alieninvasion/kit/PerkBlaster.java | 65 +++++++++++++ 6 files changed, 316 insertions(+), 31 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java new file mode 100644 index 000000000..86ffe98be --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java @@ -0,0 +1,92 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.utils.UtilVariant; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.ItemStack; + +public class Alien +{ + + private static final int RADIUS = 3; + private static final ItemStack BLASTER = new ItemStack(Material.DIAMOND_BARDING); + private static final ItemStack HELMET = new ItemStack(Material.GLASS); + + private PhaserProjectile _phaser; + private ArmorStand _stand; + private Skeleton _skeleton; + private Location _center; + + private double _theta; + + public Alien(ArcadeManager manager, Location location) + { + _phaser = new PhaserProjectile(manager); + _stand = location.getWorld().spawn(location, ArmorStand.class); + _skeleton = UtilVariant.spawnWitherSkeleton(location); + _center = location; + + _stand.setSmall(true); + _stand.setVisible(false); + _stand.setGravity(false); + _stand.setPassenger(_skeleton); + _stand.setRemoveWhenFarAway(false); + + _skeleton.setMaxHealth(4); + _skeleton.setRemoveWhenFarAway(false); + + EntityEquipment equipment = _skeleton.getEquipment(); + equipment.setItemInHand(BLASTER); + equipment.setHelmet(HELMET); + + UtilEnt.silence(_stand, true); + UtilEnt.vegetate(_skeleton); + + _theta = Math.random(); + } + + public void update() + { + double x = RADIUS * Math.cos(_theta); + double z = RADIUS * Math.sin(_theta); + + _center.add(x, 0, z); + ((CraftLivingEntity) _stand).getHandle().setPosition(_center.getX(), _center.getY(), _center.getZ()); + _center.subtract(x, 0, z); + + _theta += Math.PI / 30; + + if (Math.random() < 0.95) + { + return; + } + + for (Player player : UtilPlayer.getNearby(_skeleton.getLocation(), 15)) + { + _phaser.shoot(_skeleton, UtilAlg.getTrajectory(_skeleton.getEyeLocation(), player.getEyeLocation())); + } + } + + public boolean isValid() + { + boolean remove = !_stand.isValid() || !_skeleton.isValid(); + + if (remove) + { + _stand.remove(); + _skeleton.remove(); + } + + return !remove; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 84eea19ba..43fbbb9b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -24,14 +24,13 @@ import org.bukkit.entity.Skeleton; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.Team; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.Map.Entry; -import java.util.concurrent.atomic.AtomicInteger; public class AlienInvasion extends SoloGame { @@ -64,12 +63,16 @@ public class AlienInvasion extends SoloGame private final List _score = new ArrayList<>(16); + private final Set _aliens = new HashSet<>(); + public AlienInvasion(ArcadeManager manager) { super(manager, GameType.AlienInvasion, new Kit[]{new KitPlayer(manager)}, DESCRIPTION); WorldTimeSet = 18000; DamagePvP = false; + DamageFall = false; + HungerSet = 20; } @Override @@ -167,8 +170,14 @@ public class AlienInvasion extends SoloGame for (Player player : GetPlayers(true)) { + Manager.GetCondition().Factory().Invisible(GetName(), player, null, Integer.MAX_VALUE, 0, false, false, false); _score.add(new DragonScore(player, 0)); } + + for (Team team : Scoreboard.getHandle().getTeams()) + { + team.setCanSeeFriendlyInvisibles(true); + } } @EventHandler @@ -180,22 +189,42 @@ public class AlienInvasion extends SoloGame } _lastBeam = System.currentTimeMillis(); - _nextBeam = 5000; + _nextBeam = 10000; - ItemStack sword = new ItemStack(Material.STONE_SWORD); - ItemStack helmet = new ItemStack(Material.GLASS); + ItemStack glass = new ItemStack(Material.GLASS); CreatureAllowOverride = true; for (Location location : WorldData.GetDataLocs("BLUE")) { Skeleton skeleton = UtilVariant.spawnWitherSkeleton(location); - skeleton.getEquipment().setHelmet(helmet); - skeleton.getEquipment().setItemInHand(sword); + skeleton.setMaxHealth(4); + skeleton.getEquipment().setHelmet(glass); + } + + for (Location location : WorldData.GetDataLocs("LIGHT_BLUE")) + { + _aliens.add(new Alien(Manager, location)); } CreatureAllowOverride = false; } + @EventHandler + public void updateAliens(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK || !IsLive()) + { + return; + } + + for (Alien alien : _aliens) + { + alien.update(); + } + + _aliens.removeIf(alien -> !alien.isValid()); + } + @EventHandler public void updateBeam(UpdateEvent event) { @@ -212,7 +241,7 @@ public class AlienInvasion extends SoloGame } _lastBeam = System.currentTimeMillis(); - _nextBeam -= 50; + _nextBeam -= 100; _lastBeamId++; Manager.runSyncTimer(new BukkitRunnable() @@ -224,14 +253,25 @@ public class AlienInvasion extends SoloGame { for (Entry entry : UtilPlayer.getInRadius(beam.getLastLocation(), 20).entrySet()) { - Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, "Alien Invasion", "Phaser"); + Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, GetName(), "Photo Torpedo"); + } + + int killIfBefore = 0; + + for (int i = 0; i < _path.size(); i++) + { + if (UtilMath.offsetSquared(beam.getLastLocation(), _path.get(i++)) < 25) + { + killIfBefore = i; + break; + } } for (DragonScore score : _score) { - if (score.Score <= _lastBeamId) + if (score.Score <= killIfBefore) { - Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Phaser"); + Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Photo Torpedo"); } } @@ -346,4 +386,15 @@ public class AlienInvasion extends SoloGame return null; } + + @Override + public Location GetSpectatorLocation() + { + if (SpectatorSpawn == null) + { + return new Location(WorldData.World, 0, 158, 0); + } + + return SpectatorSpawn; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java index ecd80a603..bfbff6594 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java @@ -1,21 +1,22 @@ package nautilus.game.arcade.game.games.alieninvasion; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.*; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.particles.effects.LineParticle; import nautilus.game.arcade.ArcadeManager; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +import java.util.Set; public class Beam extends LineParticle { - private static final int EXPLOSION_RADIUS = 15; + private static final int EXPLOSION_RADIUS = 20; private static final int BEAM_BLOCK_TIME = 1500; private final ArcadeManager _manager; @@ -40,8 +41,13 @@ public class Beam extends LineParticle if (hit) { - _manager.GetExplosion().BlockExplosion(UtilBlock.getInRadius(last, EXPLOSION_RADIUS).keySet(), last, false); + last.getWorld().playSound(last, Sound.EXPLODE, 2f, 0.75f); UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, last, 4, 1, 4, 0.5F, 10, ViewDist.LONG); + + Set blocks = UtilBlock.getInRadius(last, EXPLOSION_RADIUS).keySet(); + //blocks.removeIf(block -> block.getRelative(BlockFace.DOWN).getType() == Material.AIR); + + blocks.forEach(block -> MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR)); } else { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java new file mode 100644 index 000000000..a61862ee6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -0,0 +1,72 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Snowball; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.util.Vector; + +public class PhaserProjectile implements IThrown +{ + + private ArcadeManager _manager; + + public PhaserProjectile(ArcadeManager manager) + { + _manager = manager; + } + + public void shoot(LivingEntity shooter, Vector direction) + { + Snowball snowball = shooter.launchProjectile(Snowball.class); + + snowball.setVelocity(direction.multiply(2)); + + _manager.GetProjectile().AddThrow(snowball, shooter, this, -1, true, true, true, false, 0.5F); + } + + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + if (target == null) + { + return; + } + + if (data.getThrower() instanceof Player) + { + if (target instanceof Player) + { + data.getThrown().remove(); + return; + } + + Player player = (Player) data.getThrower(); + + player.playSound(player.getLocation(), Sound.CHICKEN_EGG_POP, 1, 0.7F); + } + + UtilParticle.PlayParticle(ParticleType.CLOUD, data.getThrown().getLocation(), 0.5F, 0.5F, 0.5F, 0.05F, 5, ViewDist.NORMAL); + _manager.GetDamage().NewDamageEvent(target, data.getThrower(), (Projectile) data.getThrown(), DamageCause.CUSTOM, 2, false, true, true, UtilEnt.getName(data.getThrower()), "Blaster"); + } + + @Override + public void Idle(ProjectileUser data) + { + } + + @Override + public void Expire(ProjectileUser data) + { + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java index 9a7ac2ac5..eeb707bf6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java @@ -1,11 +1,12 @@ package nautilus.game.arcade.game.games.alieninvasion.kit; -import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.common.util.C; +import mineplex.core.itemstack.ItemBuilder; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.perks.PerkLeap; +import nautilus.game.arcade.kit.perks.PerkDoubleJump; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -14,29 +15,27 @@ import org.bukkit.inventory.ItemStack; public class KitPlayer extends Kit { - private static final String[] DESCRIPTION = { - "" - }; - private static final Perk[] PERKS = { - new PerkLeap("Leap", 1, 1, 8000, 4), + new PerkDoubleJump("Leap", 1, 1, true, 10000, true), + new PerkBlaster() }; private static final ItemStack[] PLAYER_ITEMS = { - new ItemStack(Material.IRON_AXE) + new ItemBuilder(Material.DIAMOND_BARDING) + .setTitle(C.cBlue + C.Scramble + "ABC " + C.cAqua + "Super Snow Blaster 3000" + C.cBlue + C.Scramble + " ABC") + .build() }; - private static final ItemStack IN_HAND = new ItemStack(Material.ENDER_STONE); + private static final ItemStack IN_HAND = new ItemStack(Material.DIAMOND_BARDING); public KitPlayer(ArcadeManager manager) { - super(manager, "Player", KitAvailability.Free, DESCRIPTION, PERKS, EntityType.SKELETON, IN_HAND); + super(manager, "Player", KitAvailability.Free, new String[0], PERKS, EntityType.SKELETON, IN_HAND); } @Override public void GiveItems(Player player) { player.getInventory().addItem(PLAYER_ITEMS); - player.setExp(0.999F); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java new file mode 100644 index 000000000..599ae54ff --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java @@ -0,0 +1,65 @@ +package nautilus.game.arcade.game.games.alieninvasion.kit; + +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.game.games.alieninvasion.PhaserProjectile; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; + +public class PerkBlaster extends Perk +{ + + private PhaserProjectile _phaser; + + public PerkBlaster() + { + super("Space Blaster", new String[0]); + } + + @EventHandler + public void interact(PlayerInteractEvent event) + { + if (event.isCancelled()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (UtilBlock.usable(event.getClickedBlock())) + { + return; + } + + Player player = event.getPlayer(); + + if (event.getItem() == null || event.getItem().getType() != Material.DIAMOND_BARDING) + { + return; + } + + if (!hasPerk(player)) + { + return; + } + + if (!Recharge.Instance.use(player, GetName(), 200, false, false)) + { + return; + } + + if (_phaser == null) + { + _phaser = new PhaserProjectile(Manager); + } + + _phaser.shoot(player, player.getLocation().getDirection()); + } +} From 42ef7d05908aff9ac05e84e128485da9fe59d6b7 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 May 2017 22:58:58 +0100 Subject: [PATCH 106/170] Lobby class --- .../mineplex/hub/modules/AlienInvasion.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java new file mode 100644 index 000000000..14ac72838 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -0,0 +1,25 @@ +package mineplex.hub.modules; + +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; + +@ReflectivelyCreateMiniPlugin +public class AlienInvasion extends MiniPlugin +{ + + private static final boolean ENABLED = true; + + public AlienInvasion() + { + super("Alien Invasion"); + + if (!ENABLED) + { + return; + } + + + } + + +} From dc2d3176528a1fc1058a2db6da3b821b673692a1 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 May 2017 23:07:20 +0100 Subject: [PATCH 107/170] Fix merging with develop --- .../nautilus/game/arcade/ArcadeManager.java | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 0a73a0f96..f5ab85d39 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -5,8 +5,6 @@ import java.util.ArrayList; import java.util.HashSet; import mineplex.core.google.GoogleSheetsManager; -import net.minecraft.server.v1_8_R3.EntityLiving; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -40,6 +38,8 @@ import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; +import mineplex.core.antihack.compedaccount.CompromisedAccountManager; +import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blood.Blood; import mineplex.core.bonuses.BonusManager; @@ -124,7 +124,6 @@ import mineplex.minecraft.game.core.condition.ConditionManager; import mineplex.minecraft.game.core.damage.DamageManager; import mineplex.minecraft.game.core.fire.Fire; import mineplex.serverdata.Region; - import nautilus.game.arcade.addons.SoupAddon; import nautilus.game.arcade.booster.GameBoosterManager; import nautilus.game.arcade.command.CancelNextGameCommand; @@ -169,6 +168,7 @@ import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager; import nautilus.game.arcade.player.ArcadePlayer; import nautilus.game.arcade.shop.ArcadeShop; +import net.minecraft.server.v1_8_R3.EntityLiving; public class ArcadeManager extends MiniPlugin implements IRelation { @@ -264,13 +264,14 @@ public class ArcadeManager extends MiniPlugin implements IRelation public final boolean IsHolidayEnabled; private final Titles _titles; + private final CompromisedAccountManager _compromisedAccountManager = require(CompromisedAccountManager.class); public ArcadeManager(Arcade plugin, ServerStatusManager serverStatusManager, GameServerConfig serverConfig, - CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, - StatsManager statsManager, IncognitoManager incognitoManager, AchievementManager achievementManager, DisguiseManager disguiseManager, Creature creature, Teleport teleport, Blood blood, Chat chat, - Portal portal, PreferencesManager preferences, InventoryManager inventoryManager, PacketHandler packetHandler, - CosmeticManager cosmeticManager, ProjectileManager projectileManager, PetManager petManager, HologramManager hologramManager, PollManager pollManager, - NpcManager npcManager, CustomDataManager customDataManager, Punish punish, EloManager eloManager, ThankManager thankManager, BoosterManager boosterManager) + CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, + StatsManager statsManager, IncognitoManager incognitoManager, AchievementManager achievementManager, DisguiseManager disguiseManager, Creature creature, Teleport teleport, Blood blood, Chat chat, + Portal portal, PreferencesManager preferences, InventoryManager inventoryManager, PacketHandler packetHandler, + CosmeticManager cosmeticManager, ProjectileManager projectileManager, PetManager petManager, HologramManager hologramManager, PollManager pollManager, + NpcManager npcManager, CustomDataManager customDataManager, Punish punish, EloManager eloManager, ThankManager thankManager, BoosterManager boosterManager) { super("Game Manager", plugin); @@ -497,7 +498,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation scoreboard.get(ArcadeScoreboardLine.PLAYERS_NAME).write(C.cYellow + C.Bold + "Players"); scoreboard.get(ArcadeScoreboardLine.KIT_NAME).write(C.cGray + C.Bold + "Kit"); - scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); scoreboard.get(ArcadeScoreboardLine.SERVER_NAME).write(C.cAqua + C.Bold + "Server"); scoreboard.get(ArcadeScoreboardLine.SERVER_VALUE).write(_plugin.getConfig().getString("serverstatus.name")); } @@ -522,7 +522,16 @@ public class ArcadeManager extends MiniPlugin implements IRelation } scoreboard.get(ArcadeScoreboardLine.PLAYERS_VALUE).write(_gameManager.getValidPlayersForGameStart().size() + "/" + GetPlayerFull()); - scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + if (GetGame() != null && GetGame().CrownsEnabled) + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGold + C.Bold + "Crowns"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.getCrowns(scoreboard.getOwner())); + } + else + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + } if (GetGame() != null) { @@ -794,11 +803,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation return _customDataManager; } - public GoogleSheetsManager getSheetsManager() - { - return _sheetsManager; - } - public ChatColor GetColor(Player player) { if (_game == null) @@ -952,21 +956,21 @@ public class ArcadeManager extends MiniPlugin implements IRelation } //Recruiting else */if (_game == null || _game.GetState() == GameState.Recruit) + { + if (_game != null && _game.GetCountdown() != -1) { - if (_game != null && _game.GetCountdown() != -1) - { - event.setMotd(ChatColor.GREEN + "Starting in " + _game.GetCountdown() + " Seconds" + extrainformation); - } - else - { - event.setMotd(ChatColor.GREEN + "Recruiting" + extrainformation); - } + event.setMotd(ChatColor.GREEN + "Starting in " + _game.GetCountdown() + " Seconds" + extrainformation); } - //In Progress else { - event.setMotd(ChatColor.YELLOW + "In Progress" + extrainformation); + event.setMotd(ChatColor.GREEN + "Recruiting" + extrainformation); } + } + //In Progress + else + { + event.setMotd(ChatColor.YELLOW + "In Progress" + extrainformation); + } if (UtilServer.isTestServer(false)) event.setMotd(ChatColor.GOLD + "Private Mineplex Test Server"); @@ -981,6 +985,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation @EventHandler public void MessageJoin(PlayerJoinEvent event) { + _compromisedAccountManager.triggerPriorityBan(event.getPlayer(), PriorityCause.JOIN_GAME); + if (_incognitoManager.Get(event.getPlayer()).Status) { event.setJoinMessage(null); @@ -2072,4 +2078,14 @@ public class ArcadeManager extends MiniPlugin implements IRelation { return this._titles; } -} + + public GoogleSheetsManager getSheetsManager() + { + return _sheetsManager; + } + + public CompromisedAccountManager getCompromisedAccountManager() + { + return _compromisedAccountManager; + } +} \ No newline at end of file From a6ec243a029dc5383dc6ee6e6d154b42af20f3ef Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 May 2017 23:19:12 +0100 Subject: [PATCH 108/170] Sneak cancels CreeperExplode --- .../smash/perks/creeper/PerkCreeperExplode.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index 34f3764a5..d307030d9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -22,6 +22,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; import java.util.*; @@ -245,6 +246,20 @@ public class PerkCreeperExplode extends SmashPerk } } + @EventHandler + public void toggleSneak(PlayerToggleSneakEvent event) + { + Player player = event.getPlayer(); + + if (!_active.containsKey(player.getUniqueId()) || isSuperActive(player)) + { + return; + } + + _active.remove(player.getUniqueId()); + UtilPlayer.message(player, F.main("Skill", "You cancelled " + F.skill(GetName()) + ".")); + } + public void activate(Player player) { _active.put(player.getUniqueId(), System.currentTimeMillis()); From 130d1dc05e63f791b2b3f4e39e6ec39aea633df3 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 12 May 2017 15:07:48 -0400 Subject: [PATCH 109/170] Fix TNT being stuck on head --- .../game/arcade/game/games/castleassault/CastleAssault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 4df26278e..f746e3301 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -1420,7 +1420,7 @@ public class CastleAssault extends TeamGame UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); - if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() != Material.TNT) + if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() == Material.AIR) { player.getInventory().setHelmet(_wearableTnt.build()); } From ea4f9aee62e07d0d3881cf40a902c966f8784ed8 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 12 May 2017 16:07:43 -0400 Subject: [PATCH 110/170] Tweak crown kill streak multipliers --- .../games/castleassault/CastleAssault.java | 39 ++++++------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index f746e3301..54ba4fa72 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -455,27 +455,22 @@ public class CastleAssault extends TeamGame } { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 10, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 15, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 20, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 25, streak + " Player Kill Streak", false, false); } } @@ -553,27 +548,22 @@ public class CastleAssault extends TeamGame } { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 10, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 15, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 20, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 25, streak + " Player Kill Streak", false, false); } } @@ -621,27 +611,22 @@ public class CastleAssault extends TeamGame } { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 10, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 15, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 20, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 25, streak + " Player Kill Streak", false, false); } } From a42e6ed9e46ade1dcd9424ab006effad284334d9 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Fri, 12 May 2017 18:44:05 -0400 Subject: [PATCH 111/170] Change crown calculations again --- .../games/castleassault/CastleAssault.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 54ba4fa72..54e71d589 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -454,23 +454,29 @@ public class CastleAssault extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 10, streak + " Player Kill Streak", false, false); + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, 15, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 20, streak + " Player Kill Streak", false, false); + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 25, streak + " Player Kill Streak", false, false); + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } @@ -480,12 +486,6 @@ public class CastleAssault extends TeamGame int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); if (kitLevel > 0) { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); } } @@ -547,37 +547,40 @@ public class CastleAssault extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (GemData data : GetGems(player).values()) + { + crowns += data.Gems; + } + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 10, streak + " Player Kill Streak", false, false); + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, 15, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 20, streak + " Player Kill Streak", false, false); + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 25, streak + " Player Kill Streak", false, false); + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) + if (GetKit(player) != null) { - int crowns = 0; - for (GemData data : GetGems(player).values()) + KitPlayer kit = (KitPlayer) GetKit(player); + int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); + if (kitLevel > 0) { - crowns += data.Gems; + AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); } } } From 37d3b47995791ef57917df468e0acb35bf1abe8a Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sat, 13 May 2017 01:00:10 -0400 Subject: [PATCH 112/170] Rebalance tank kit and set final values for kill streak crown rewards --- .../games/castleassault/CastleAssault.java | 68 +++++++------------ .../games/castleassault/kits/KitTank.java | 17 ++--- 2 files changed, 32 insertions(+), 53 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 54e71d589..f4ed36446 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -6,11 +6,11 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.WeakHashMap; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Color; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; @@ -455,9 +455,12 @@ public class CastleAssault extends TeamGame } int crowns = 0; - for (GemData data : GetGems(player).values()) + for (Entry data : GetGems(player).entrySet()) { - crowns += data.Gems; + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } } { @@ -479,16 +482,6 @@ public class CastleAssault extends TeamGame AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - if (GetKit(player) != null) - { - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } } } SetState(GameState.End); @@ -548,9 +541,12 @@ public class CastleAssault extends TeamGame } int crowns = 0; - for (GemData data : GetGems(player).values()) + for (Entry data : GetGems(player).entrySet()) { - crowns += data.Gems; + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } } { @@ -572,16 +568,6 @@ public class CastleAssault extends TeamGame AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - if (GetKit(player) != null) - { - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } } } SetState(GameState.End); @@ -613,38 +599,34 @@ public class CastleAssault extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { - AddGems(player, 10, streak + " Player Kill Streak", false, false); + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 4 && streak < 6) { - AddGems(player, 15, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { - AddGems(player, 20, streak + " Player Kill Streak", false, false); + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 8) { - AddGems(player, 25, streak + " Player Kill Streak", false, false); + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } } } SetState(GameState.End); @@ -1407,7 +1389,7 @@ public class CastleAssault extends TeamGame } UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); - UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, Color.RED, false, false); + UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, GetTeam(player).GetColorBase(), false, false); if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() == Material.AIR) { player.getInventory().setHelmet(_wearableTnt.build()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java index 710781ebc..c6b01406f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java @@ -14,7 +14,6 @@ import mineplex.core.itemstack.ItemBuilder; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.perks.PerkIronSkin; public class KitTank extends KitPlayer { @@ -26,18 +25,16 @@ public class KitTank extends KitPlayer C.cGrayB + "Starting Kit:", C.cGray + "Diamond Sword", C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", - C.cGray + "Protection I on Iron Armor", - C.cGreenB + "Passive Ability:", - C.cGreen + "Iron Skin: Take half a heart less damage from all Attacks" + C.cGray + "Protection I on Iron Armor" }, new Perk[][] { - new Perk[] {new PerkIronSkin(1, false)}, - new Perk[] {new PerkIronSkin(1, false)}, - new Perk[] {new PerkIronSkin(1, false)}, - new Perk[] {new PerkIronSkin(1, false)}, - new Perk[] {new PerkIronSkin(1, false)}, - new Perk[] {new PerkIronSkin(1, false)} + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {} }, new String[][] { From 9cf5fda540ff1b553e34cd42e9a41cdcc2169dfb Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sat, 13 May 2017 01:02:06 -0400 Subject: [PATCH 113/170] Update leaderboards system to use more malleable seasons system --- .../leaderboard/LeaderboardRepository.java | 54 ++++--------------- 1 file changed, 11 insertions(+), 43 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java index 866a1e5b7..f9b286039 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -18,27 +18,25 @@ import mineplex.serverdata.database.RepositoryBase; public class LeaderboardRepository extends RepositoryBase { - private static final int SEASON = 1; - - private static final String CREATE_TOTAL = "CREATE TABLE accountStatsSeasonalTotal (accountId INT NOT NULL, statId INT NOT NULL, season SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId, season), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_TOTAL = "CREATE TABLE accountStatsAllTime (accountId INT NOT NULL, statId INT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (accountId INT NOT NULL, statId INT NOT NULL, seasonId SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX seasonIndex (seasonId), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id), FOREIGN KEY (seasonId) REFERENCES statSeasons(id));"; private static final String CREATE_YEARLY = "CREATE TABLE accountStatsYearly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; private static final String CREATE_MONTHLY = "CREATE TABLE accountStatsMonthly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; private static final String CREATE_WEEKLY = "CREATE TABLE accountStatsWeekly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; private static final String CREATE_DAILY = "CREATE TABLE accountStatsDaily (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_SEASON = "CREATE TABLE statSeasons (id SMALLINT NOT NULL, seasonName VARCHAR(50) NOT NULL, startDate TIMESTAMP NOT NULL DEFAULT '1969-12-31 18:00:01', endDate TIMESTAMP NOT NULL DEFAULT '1969-12-31 18:00:01', PRIMARY KEY (id), UNIQUE INDEX seasonIndex (seasonName), INDEX startIndex (startDate), INDEX endIndex (endDate));"; - private static final String INSERT_STAT = "INSERT INTO accountStatsSeasonalTotal (accountId, statId, season, value) VALUES (?, ?, " + SEASON + ", ?);"; - private static final String INSERT_STAT_ALL = "INSERT INTO accountStatsSeasonalTotal (accountId, statId, season, value) VALUES (?, ?, 0, ?);"; - private static final String UPDATE_STAT = "UPDATE accountStatsSeasonalTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=" + SEASON + ";"; - private static final String UPDATE_STAT_ALL = "UPDATE accountStatsSeasonalTotal SET value=value + ? WHERE accountId=? AND statId=? AND season=0;"; + private static final String INSERT_STAT = "INSERT INTO accountStatsAllTime (accountId, statId, value) VALUES (?, ?, ?);"; + private static final String UPDATE_STAT = "UPDATE accountStatsAllTime SET value=value + ? WHERE accountId=? AND statId=?;"; - private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsSeasonalTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=0 ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsYearly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsMonthly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsWeekly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsDaily AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; - private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonalTotal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND season=" + SEASON + " ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND seasonId=(SELECT id FROM statSeasons WHERE now() BETWEEN startDate AND endDate LIMIT 1) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; public LeaderboardRepository(JavaPlugin plugin) { @@ -52,9 +50,7 @@ public class LeaderboardRepository extends RepositoryBase try ( Connection c = getConnection(); PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); - PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); - PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); ) { for (Integer accountId : stats.keySet()) @@ -65,38 +61,25 @@ public class LeaderboardRepository extends RepositoryBase updateStat.setInt(2, accountId); updateStat.setInt(3, statId); updateStat.addBatch(); - updateAllStats.setLong(1, stats.get(accountId).get(statId)); - updateAllStats.setInt(2, accountId); - updateAllStats.setInt(3, statId); - updateAllStats.addBatch(); } } - int[] rowsAffected1 = updateStat.executeBatch(); - int[] rowsAffected2 = updateAllStats.executeBatch(); + int[] rowsAffected = updateStat.executeBatch(); int i = 0; for (Integer accountId : stats.keySet()) { for (Integer statId : stats.get(accountId).keySet()) { - if (rowsAffected1[i] < 1) + if (rowsAffected[i] < 1) { insertStat.setInt(1, accountId); insertStat.setInt(2, statId); insertStat.setLong(3, stats.get(accountId).get(statId)); insertStat.addBatch(); } - if (rowsAffected2[i] < 1) - { - insertAllStats.setInt(1, accountId); - insertAllStats.setInt(2, statId); - insertAllStats.setLong(3, stats.get(accountId).get(statId)); - insertAllStats.addBatch(); - } i++; } } insertStat.executeBatch(); - insertAllStats.executeBatch(); } catch (SQLException e) { @@ -110,9 +93,7 @@ public class LeaderboardRepository extends RepositoryBase try ( Connection c = getConnection(); PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); - PreparedStatement updateAllStats = c.prepareStatement(UPDATE_STAT_ALL); PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); - PreparedStatement insertAllStats = c.prepareStatement(INSERT_STAT_ALL); ) { for (Integer statId : stats.keySet()) @@ -121,34 +102,21 @@ public class LeaderboardRepository extends RepositoryBase updateStat.setInt(2, accountId); updateStat.setInt(3, statId); updateStat.addBatch(); - updateAllStats.setLong(1, stats.get(statId)); - updateAllStats.setInt(2, accountId); - updateAllStats.setInt(3, statId); - updateAllStats.addBatch(); } - int[] rowsAffected1 = updateStat.executeBatch(); - int[] rowsAffected2 = updateAllStats.executeBatch(); + int[] rowsAffected = updateStat.executeBatch(); int i = 0; for (Integer statId : stats.keySet()) { - if (rowsAffected1[i] < 1) + if (rowsAffected[i] < 1) { insertStat.setInt(1, accountId); insertStat.setInt(2, statId); insertStat.setLong(3, stats.get(statId)); insertStat.addBatch(); } - if (rowsAffected2[i] < 1) - { - insertAllStats.setInt(1, accountId); - insertAllStats.setInt(2, statId); - insertAllStats.setLong(3, stats.get(statId)); - insertAllStats.addBatch(); - } i++; } insertStat.executeBatch(); - insertAllStats.executeBatch(); } catch (SQLException e) { From 5454c001631ca0d80e8e4315580ffd20ec92a6c6 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 13 May 2017 15:15:51 +0100 Subject: [PATCH 114/170] Hub integration --- .../core/achievement/Achievement.java | 7 + .../core/titles/tracks/TrackManager.java | 2 + .../tracks/award/AlienInvasionTrack.java | 30 +++ .../Mineplex.Hub/src/mineplex/hub/Hub.java | 2 + .../mineplex/hub/modules/AlienInvasion.java | 219 +++++++++++++++++- .../games/alieninvasion/AlienInvasion.java | 8 +- .../games/alieninvasion/PhaserProjectile.java | 2 +- 7 files changed, 264 insertions(+), 6 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 17b03158f..8c51b6256 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -64,6 +64,13 @@ public enum Achievement new int[]{200}, AchievementCategory.HOLIDAY), + GLOBAL_ALIEN_INVASION("2017 Alien Invasion", 4000, + new String[]{"Global.Alien Invasion 2017"}, + new String[]{"Kill 50 Aliens in the Lobby,", + "during the Alien Invasion event"}, + new int[]{50}, + AchievementCategory.HOLIDAY), + //Bridges BRIDGES_WINS("Bridge Champion", 600, new String[]{"The Bridges.Wins"}, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java index 30072b414..eddb79bf6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; +import mineplex.core.titles.tracks.award.AlienInvasionTrack; import mineplex.core.titles.tracks.award.AprilFools2017Track; import net.md_5.bungee.api.ChatColor; @@ -82,6 +83,7 @@ public class TrackManager extends MiniPlugin // Awarded tracks registerTrack(new Bridges2017Track()); registerTrack(new AprilFools2017Track()); + registerTrack(new AlienInvasionTrack()); // Custom tracks // registerTrack(track("lenny", "Lenny", "( ͡° ͜ʖ ͡°)")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java new file mode 100644 index 000000000..def482e21 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java @@ -0,0 +1,30 @@ +package mineplex.core.titles.tracks.award; + +import mineplex.core.titles.tracks.ItemizedTrack; +import mineplex.core.titles.tracks.TrackFormat; +import mineplex.core.titles.tracks.TrackTier; +import net.md_5.bungee.api.ChatColor; + +public class AlienInvasionTrack extends ItemizedTrack +{ + + public AlienInvasionTrack() + { + super( + "alien-invasion", + ChatColor.GREEN, + "Alien", + "Alien Invasion", + "This track is awarded to players who survived the Alien Invasion Event.", + true); + + special(); + + getRequirements() + .addTier(new TrackTier( + "Alien Invasion", + null, + this::owns, + new TrackFormat(ChatColor.GREEN, ChatColor.DARK_GREEN) + )); } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index a4b0a0b88..13f2ee2b0 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -1,5 +1,6 @@ package mineplex.hub; +import mineplex.hub.modules.AlienInvasion; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -247,6 +248,7 @@ public class Hub extends JavaPlugin implements IRelation require(AprilFoolsTreasureHunt.class); } require(TwitchIntegrationFix.class); + require(AlienInvasion.class); } @Override diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 14ac72838..250c9e6fc 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -2,24 +2,239 @@ package mineplex.hub.modules; import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.achievement.Achievement; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.SchematicData; +import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.creature.Creature; +import mineplex.core.stats.StatsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; +import org.bukkit.Bukkit; +import org.bukkit.DyeColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BlockVector; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; @ReflectivelyCreateMiniPlugin public class AlienInvasion extends MiniPlugin { - private static final boolean ENABLED = true; + private static final String SCHEMATIC_PATH = ".." + File.separator + ".." + File.separator + "update" + File.separator + "files" + File.separator + "UFO.schematic"; + private static final int[][] UFO_SPAWNS = { + { + 0, 81, -14 + }, + { + 15, 91, -11 + }, + { + -10, 94, 5 + }, + { + -25, 97, -26 + } + }; + private static final String[] ALIEN_SPEAK = { + "Every day is a good day when you paint", + }; + private static final ItemStack HELMET = new ItemStack(Material.GLASS); + + private final Creature _creature; + private final StatsManager _stats; + + private Schematic _schematic; + private boolean _active; + private int _lastUFOIndex; + private Location _beam; + + private final Set _ufoBlocks; + private final Set _aliens; public AlienInvasion() { super("Alien Invasion"); - if (!ENABLED) + _creature = require(Creature.class); + _stats = require(StatsManager.class); + + _ufoBlocks = new HashSet<>(200); + _aliens = new HashSet<>(); + + addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-start") + { + @Override + public void Execute(Player caller, String[] args) + { + startAnimation(); + } + }); + addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-stop") + { + @Override + public void Execute(Player caller, String[] args) + { + stopAnimation(); + } + }); + } + + public void startAnimation() + { + try + { + _schematic = UtilSchematic.loadSchematic(new File(SCHEMATIC_PATH)); + } + catch (IOException e) + { + e.printStackTrace(); + return; + } + + _lastUFOIndex = 0; + _active = true; + } + + public void sendPlayerToInstance(Player player) + { + player.sendMessage("Testing"); + } + + public void stopAnimation() + { + _active = false; + + for (Block block : _ufoBlocks) + { + MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR); + } + + _ufoBlocks.clear(); + + for (LivingEntity entity : _aliens) + { + entity.remove(); + } + + _aliens.clear(); + } + + @EventHandler + public void updateUFOSpwawn(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || !_active || _lastUFOIndex == UFO_SPAWNS.length) { return; } + int[] cords = UFO_SPAWNS[_lastUFOIndex]; + Location location = new Location(Bukkit.getWorld("world"), cords[0], cords[1], cords[2]); + SchematicData data = _schematic.paste(location, true); + Location beam = data.getDataLocationMap().getIronLocations(DyeColor.LIME).get(0); + + for (BlockVector vector : data.getBlocks()) + { + Location block = location.add(vector); + + _ufoBlocks.add(block.getBlock()); + + location.subtract(vector); + } + + if (_lastUFOIndex == 0) + { + _beam = beam; + } + + _lastUFOIndex++; } + @EventHandler + public void updateAlienSpawn(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !_active || _aliens.size() > 20) + { + return; + } + _creature.SetForce(true); + + Location random = UtilAlg.getRandomLocation(_beam, 30, 5, 30); + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(random); + skeleton.getEquipment().setHelmet(HELMET); + + _aliens.add(skeleton); + + _creature.SetForce(false); + } + + @EventHandler + public void updateSendToInstance(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || !_active) + { + return; + } + + for (Player player : Bukkit.getOnlinePlayers()) + { + if (UtilMath.offset2d(player.getLocation(), _beam) > 5) + { + continue; + } + + sendPlayerToInstance(player); + } + } + + @EventHandler + public void interactAlien(EntityDamageByEntityEvent event) + { + Entity entity = event.getEntity(); + Entity damager = event.getDamager(); + + if (!_aliens.contains(entity)) + { + return; + } + + if (damager instanceof Player) + { + Player player = (Player) damager; + + sendAlienSpeak(player); + } + else if (damager instanceof EnderPearl) + { + ((LivingEntity) entity).setHealth(0); + _aliens.remove(entity); + + Projectile projectile = (Projectile) damager; + Player shooter = (Player) projectile.getShooter(); + + _stats.incrementStat(shooter, Achievement.GLOBAL_ALIEN_INVASION.getStats()[0], 1); + } + } + + private void sendAlienSpeak(Player player) + { + player.sendMessage(ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 43fbbb9b6..f38efda26 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -53,7 +53,7 @@ public class AlienInvasion extends SoloGame return 0; }; - private final List _sources = new ArrayList<>(5); + private final List _sources = new ArrayList<>(); private final List _targets = new ArrayList<>(); private final ArrayList _path = new ArrayList<>(); @@ -73,6 +73,8 @@ public class AlienInvasion extends SoloGame DamagePvP = false; DamageFall = false; HungerSet = 20; + + manager.GetCreature().SetDisableCustomDrops(true); } @Override @@ -253,7 +255,7 @@ public class AlienInvasion extends SoloGame { for (Entry entry : UtilPlayer.getInRadius(beam.getLastLocation(), 20).entrySet()) { - Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, GetName(), "Photo Torpedo"); + Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, GetName(), "Photon Torpedo"); } int killIfBefore = 0; @@ -271,7 +273,7 @@ public class AlienInvasion extends SoloGame { if (score.Score <= killIfBefore) { - Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Photo Torpedo"); + Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Photon Torpedo"); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java index a61862ee6..307d8de25 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -32,7 +32,7 @@ public class PhaserProjectile implements IThrown snowball.setVelocity(direction.multiply(2)); - _manager.GetProjectile().AddThrow(snowball, shooter, this, -1, true, true, true, false, 0.5F); + _manager.GetProjectile().AddThrow(snowball, shooter, this, -1, true, true, true, false, 0.8F); } @Override From 9a96ce5018104c6f948403c6359fcf8de66bef60 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 13 May 2017 17:13:34 +0100 Subject: [PATCH 115/170] Reward title ingame --- .../games/alieninvasion/AlienInvasion.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index f38efda26..0e0e846ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -1,10 +1,10 @@ package nautilus.game.arcade.game.games.alieninvasion; import mineplex.core.common.Pair; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.*; +import mineplex.core.titles.tracks.Track; +import mineplex.core.titles.tracks.TrackManager; +import mineplex.core.titles.tracks.award.AlienInvasionTrack; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilVariant; @@ -15,7 +15,6 @@ import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; import nautilus.game.arcade.game.games.dragonescape.DragonScore; import nautilus.game.arcade.kit.Kit; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -24,8 +23,6 @@ import org.bukkit.entity.Skeleton; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; @@ -335,8 +332,32 @@ public class AlienInvasion extends SoloGame if (newScore > currentScore) { - Bukkit.broadcastMessage(player.getName() + "=" + newScore); score.Score = newScore; + + // Reward title + if (score.Score == _path.size() - 1) + { + TrackManager trackManager = Manager.getTrackManager(); + Track track = trackManager.getTrack(AlienInvasionTrack.class); + + if (trackManager.hasTrack(player, track)) + { + continue; + } + + trackManager.unlockTrack(player, track, result -> + { + switch (result) + { + case UNKNOWN_ERROR: + player.sendMessage(F.main("Game", "Oops, somehow I could not give you the title track, you should inform a staff member!")); + break; + case SUCCESS: + player.sendMessage(F.main("Game", "Unlocked " + track.getColor() + track.getLongName() + C.mBody + " Title!")); + break; + } + }); + } } } } From d493a61d3d0bfbc7f9082701c4650b5d02d3c678 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 13 May 2017 17:13:47 +0100 Subject: [PATCH 116/170] Polish the hub event --- .../common/block/schematic/Schematic.java | 18 ++- .../mineplex/hub/modules/AlienInvasion.java | 132 +++++++++++++++--- 2 files changed, 130 insertions(+), 20 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java index 0ab1c909f..54e4974b8 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java @@ -79,6 +79,11 @@ public class Schematic } public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset) + { + return paste(originLocation, ignoreAir, worldEditOffset, true); + } + + public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset, boolean quickSet) { if(worldEditOffset && hasWorldEditOffset()) { @@ -144,9 +149,16 @@ public class Schematic continue; } } - - UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); - + + if (quickSet) + { + UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); + } + else + { + originLocation.getWorld().getBlockAt(startX + x, startY + y, startZ + z).setTypeIdAndData(materialId, _blockData[index], false); + } + BlockVector bv = new BlockVector(x,y,z); output.getBlocksRaw().add(bv); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 250c9e6fc..dd03e2d54 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -3,27 +3,29 @@ package mineplex.hub.modules; import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.achievement.Achievement; +import mineplex.core.blockrestore.BlockRestore; import mineplex.core.command.CommandBase; +import mineplex.core.common.Pair; import mineplex.core.common.Rank; import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.SchematicData; import mineplex.core.common.block.schematic.UtilSchematic; -import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.creature.Creature; import mineplex.core.stats.StatsManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilVariant; -import org.bukkit.Bukkit; -import org.bukkit.DyeColor; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockVector; @@ -49,32 +51,68 @@ public class AlienInvasion extends MiniPlugin }, { -25, 97, -26 + }, + { + -17, 94, -47 + }, + { + 20, 95, -55, + }, + { + 45, 106, -23 + }, + { + 50, 110, 16 + }, + { + -33, 125, 5 + }, + { + 30, 102, 10 } }; + /** + * Bob Ross is not an alien + */ private static final String[] ALIEN_SPEAK = { "Every day is a good day when you paint", + "Beat the devil out of it", + "Happy little clouds", + "Happy little trees", + "I believe", + "I wonder if anyone can see these messages", + "Get involved", + "Ruff" }; private static final ItemStack HELMET = new ItemStack(Material.GLASS); + private final BlockRestore _restore; private final Creature _creature; private final StatsManager _stats; + private final World _world; + private Schematic _schematic; private boolean _active; private int _lastUFOIndex; private Location _beam; private final Set _ufoBlocks; + private final Set _beaconBlocks; private final Set _aliens; public AlienInvasion() { super("Alien Invasion"); + _restore = require(BlockRestore.class); _creature = require(Creature.class); _stats = require(StatsManager.class); + _world = Bukkit.getWorld("world"); + _ufoBlocks = new HashSet<>(200); + _beaconBlocks = new HashSet<>(); _aliens = new HashSet<>(); addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-start") @@ -109,11 +147,21 @@ public class AlienInvasion extends MiniPlugin _lastUFOIndex = 0; _active = true; + + _world.setTime(18000); + + for (Player player : Bukkit.getOnlinePlayers()) + { + player.playSound(player.getLocation(), Sound.AMBIENCE_CAVE, 1, 0.5F); + } + + UtilTextMiddle.display(C.cGreenB + "Alien Invasion", "Event is starting!", 10, 40, 10); + Bukkit.broadcastMessage(F.main("Alien", "")); } public void sendPlayerToInstance(Player player) { - player.sendMessage("Testing"); + player.sendMessage("Imagine you are being sent to a game server, ooooo spooky"); } public void stopAnimation() @@ -122,7 +170,7 @@ public class AlienInvasion extends MiniPlugin for (Block block : _ufoBlocks) { - MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR); + block.setType(Material.AIR); } _ufoBlocks.clear(); @@ -133,6 +181,15 @@ public class AlienInvasion extends MiniPlugin } _aliens.clear(); + + for (Block block : _beaconBlocks) + { + _restore.restore(block); + } + + _beaconBlocks.clear(); + + _world.setTime(6000); } @EventHandler @@ -144,9 +201,13 @@ public class AlienInvasion extends MiniPlugin } int[] cords = UFO_SPAWNS[_lastUFOIndex]; - Location location = new Location(Bukkit.getWorld("world"), cords[0], cords[1], cords[2]); + Location location = new Location(_world, cords[0], cords[1], cords[2]); - SchematicData data = _schematic.paste(location, true); + location.subtract(5, 0, 5); + + UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, location, 5F, 5F, 5F, 1, 50, ViewDist.LONG); + + SchematicData data = _schematic.paste(location, true, false, false); Location beam = data.getDataLocationMap().getIronLocations(DyeColor.LIME).get(0); for (BlockVector vector : data.getBlocks()) @@ -160,7 +221,24 @@ public class AlienInvasion extends MiniPlugin if (_lastUFOIndex == 0) { - _beam = beam; + // Spawn a beacon + Block ground = beam.getBlock(); + + while (ground.getType() == Material.AIR) + { + ground = ground.getRelative(BlockFace.DOWN); + } + + ground = ground.getRelative(BlockFace.UP); + _beam = ground.getLocation(); + + for (Pair> pair : UtilBlock.getBeaconBlocks(ground.getLocation(), (byte) 5)) + { + Block block = pair.getLeft().getBlock(); + + _restore.add(block, pair.getRight().getLeft().getId(), pair.getRight().getRight(), Long.MAX_VALUE); + _beaconBlocks.add(block); + } } _lastUFOIndex++; @@ -169,16 +247,21 @@ public class AlienInvasion extends MiniPlugin @EventHandler public void updateAlienSpawn(UpdateEvent event) { - if (event.getType() != UpdateType.FAST || !_active || _aliens.size() > 20) + if (event.getType() != UpdateType.FAST || !_active || _beam == null || _aliens.size() > 20) { return; } _creature.SetForce(true); - Location random = UtilAlg.getRandomLocation(_beam, 30, 5, 30); + Location random = UtilAlg.getRandomLocation(_beam.clone().add(0, 5, 0), 30, 4, 30); + random.setYaw(UtilMath.r(180)); + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(random); skeleton.getEquipment().setHelmet(HELMET); + skeleton.setCustomNameVisible(true); + skeleton.setCustomName(C.cGreenB + "Alien"); + UtilEnt.vegetate(skeleton); _aliens.add(skeleton); @@ -188,14 +271,14 @@ public class AlienInvasion extends MiniPlugin @EventHandler public void updateSendToInstance(UpdateEvent event) { - if (event.getType() != UpdateType.SEC || !_active) + if (event.getType() != UpdateType.SEC || !_active || _beam == null) { return; } for (Player player : Bukkit.getOnlinePlayers()) { - if (UtilMath.offset2d(player.getLocation(), _beam) > 5) + if (UtilMath.offsetSquared(player.getLocation(), _beam) > 25) { continue; } @@ -229,12 +312,27 @@ public class AlienInvasion extends MiniPlugin Projectile projectile = (Projectile) damager; Player shooter = (Player) projectile.getShooter(); + shooter.playSound(shooter.getLocation(), Sound.NOTE_PLING, 1, 1.8F); _stats.incrementStat(shooter, Achievement.GLOBAL_ALIEN_INVASION.getStats()[0], 1); } } + @EventHandler + public void interactAlien(PlayerInteractAtEntityEvent event) + { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + + if (!_aliens.contains(entity)) + { + return; + } + + sendAlienSpeak(player); + } + private void sendAlienSpeak(Player player) { - player.sendMessage(ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); + player.sendMessage(C.cGreen + C.Scramble + ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); } } From 9bc118dc419c66dbc5fa368b3e88a42e39fcd50c Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 15 May 2017 16:37:14 -0700 Subject: [PATCH 117/170] Fix Anticheat ban lengths --- .../src/mineplex/core/antihack/AntiHack.java | 43 ++++++------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index 525351b5a..79d38c111 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -233,7 +233,7 @@ public class AntiHack extends MiniPlugin _compromisedAccountManager.submitImmediateBan(player); - _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, getDaysBanned(player, cause), true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, getHoursBanned(player, cause), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -272,7 +272,7 @@ public class AntiHack extends MiniPlugin Consumer> doPunish = after -> { - _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getDaysBanned(player, CheckManager.getCheckBySimpleName(info.getHackType())), true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getHoursBanned(player, CheckManager.getCheckBySimpleName(info.getHackType())), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -358,7 +358,7 @@ public class AntiHack extends MiniPlugin { for (Punishment punishment : punishClient.GetPunishments().get(Category.Hacking)) { - if (punishment.GetAdmin().equalsIgnoreCase(NAME) && punishment.GetReason().contains("[GWEN]")) + if (punishment.GetAdmin().equalsIgnoreCase(NAME) && punishment.GetReason().contains("[GWEN")) { totalPunishments++; } @@ -368,37 +368,18 @@ public class AntiHack extends MiniPlugin return totalPunishments; } - public int getDaysBanned(Player player, Class check) + public int getHoursBanned(Player player, Class check) { - if (check == null) // old banwaves - { - switch (getPunishments(player)) - { - case 0: - return 5; - case 1: - return 14; - case 2: - return 30; - default: - return -1; - } - } - - switch (check.getSimpleName()) + switch (getPunishments(player)) { + case 0: + return 5 * 24; + case 1: + return 14 * 24; + case 2: + return 30 * 24; default: - switch (getPunishments(player)) - { - case 0: - return 5; - case 1: - return 14; - case 2: - return 30; - default: - return -1; - } + return -1; } } From cc98f4fdd5a1056fc9d1d95459bb555ef636e07c Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 15 May 2017 16:41:16 -0700 Subject: [PATCH 118/170] Disable banner service calls --- .../src/mineplex/core/antihack/AntiHack.java | 6 ----- .../core/antihack/banwave/BanWaveManager.java | 22 ++++++++----------- .../nautilus/game/arcade/ArcadeManager.java | 9 -------- .../arcade/managers/chat/GameChatManager.java | 3 --- 4 files changed, 9 insertions(+), 31 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index 79d38c111..a9d18dbcf 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -68,7 +68,6 @@ import mineplex.core.antihack.commands.AnticheatOnCommand; import mineplex.core.antihack.commands.DetailedMessagesCommand; import mineplex.core.antihack.commands.GetVlsCommand; import mineplex.core.antihack.commands.TestBanCommand; -import mineplex.core.antihack.compedaccount.CompromisedAccountManager; import mineplex.core.antihack.gep.GwenExtremePrejudice; import mineplex.core.antihack.guardians.GuardianManager; import mineplex.core.antihack.logging.AntihackLogger; @@ -150,8 +149,6 @@ public class AntiHack extends MiniPlugin private BanWaveManager _banWaveManager; - private final CompromisedAccountManager _compromisedAccountManager; - private AntiHack() { super("AntiHack"); @@ -160,7 +157,6 @@ public class AntiHack extends MiniPlugin require(GuardianManager.class); _banWaveManager = require(BanWaveManager.class); - _compromisedAccountManager = require(CompromisedAccountManager.class); Bukkit.getServicesManager().register(MineplexLink.class, new MineplexLinkImpl(), this._plugin, ServicePriority.Normal); @@ -231,8 +227,6 @@ public class AntiHack extends MiniPlugin new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish(); }); - _compromisedAccountManager.submitImmediateBan(player); - _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, getHoursBanned(player, cause), true, after); }; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java index 3eb4506b0..7123a383c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java @@ -1,17 +1,5 @@ package mineplex.core.antihack.banwave; -import mineplex.core.MiniPlugin; -import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.account.CoreClient; -import mineplex.core.account.CoreClientManager; -import mineplex.core.antihack.AntiHack; -import mineplex.core.antihack.compedaccount.CompromisedAccountManager; -import mineplex.core.antihack.logging.AntihackLogger; -import mineplex.core.antihack.redisnotifications.GwenBanwaveNotification; -import mineplex.core.common.util.UtilServer; -import mineplex.serverdata.commands.ServerCommandManager; - -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; @@ -20,6 +8,15 @@ import com.google.gson.JsonObject; import com.mineplex.anticheat.checks.Check; import com.mineplex.anticheat.checks.CheckManager; +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.account.CoreClient; +import mineplex.core.account.CoreClientManager; +import mineplex.core.antihack.AntiHack; +import mineplex.core.antihack.logging.AntihackLogger; +import mineplex.core.antihack.redisnotifications.GwenBanwaveNotification; +import mineplex.core.common.util.UtilServer; + @ReflectivelyCreateMiniPlugin public class BanWaveManager extends MiniPlugin { @@ -75,7 +72,6 @@ public class BanWaveManager extends MiniPlugin JsonObject custom = new JsonObject(); custom.addProperty("is-banwave", true); - require(CompromisedAccountManager.class).submitPendingDelayedBan(player); require(AntihackLogger.class).saveMetadata(player, id, after, custom); } }); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 5b49581f5..6def202a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -37,7 +37,6 @@ import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; -import mineplex.core.antihack.compedaccount.CompromisedAccountManager; import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blood.Blood; @@ -262,7 +261,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation public final boolean IsHolidayEnabled; private final Titles _titles; - private final CompromisedAccountManager _compromisedAccountManager = require(CompromisedAccountManager.class); public ArcadeManager(Arcade plugin, ServerStatusManager serverStatusManager, GameServerConfig serverConfig, CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, @@ -981,8 +979,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation @EventHandler public void MessageJoin(PlayerJoinEvent event) { - _compromisedAccountManager.triggerPriorityBan(event.getPlayer(), PriorityCause.JOIN_GAME); - if (_incognitoManager.Get(event.getPlayer()).Status) { event.setJoinMessage(null); @@ -2074,9 +2070,4 @@ public class ArcadeManager extends MiniPlugin implements IRelation { return this._titles; } - - public CompromisedAccountManager getCompromisedAccountManager() - { - return _compromisedAccountManager; - } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java index a65ffd6cf..69e9958d2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/chat/GameChatManager.java @@ -15,7 +15,6 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.jooq.tools.json.JSONObject; -import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.common.Rank; import mineplex.core.common.jsonchat.JsonMessage; import mineplex.core.common.util.C; @@ -68,8 +67,6 @@ public class GameChatManager implements Listener if (event.getMessage().trim().length() == 0) return; - _manager.getCompromisedAccountManager().triggerPriorityBan(event.getPlayer(), PriorityCause.CHAT); - Player sender = event.getPlayer(); String senderName = sender.getName(); From b73958ec966d54cde0a5a6c72baf49b53b64beb6 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 14 May 2017 01:18:23 -0400 Subject: [PATCH 119/170] Fix several issues on Gem Hunters, including a duping attack vector resulting from combat logger inventory desync --- .../gemhunters/death/quitnpc/QuitNPC.java | 11 +-- .../death/quitnpc/QuitNPCModule.java | 58 +++++++++------- .../death/quitnpc/QuitNPCRepository.java | 69 +++++++++++++++++++ .../mineplex/gemhunters/join/JoinModule.java | 18 +++-- .../persistence/PersistenceModule.java | 34 ++++----- 5 files changed, 126 insertions(+), 64 deletions(-) create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java index 5a860af08..0c79be7ef 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java @@ -26,15 +26,10 @@ import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilGameProfile; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.economy.EconomyModule; -import mineplex.gemhunters.loot.InventoryModule; -import mineplex.gemhunters.quest.QuestModule; -import mineplex.gemhunters.quest.QuestPlayerData; public class QuitNPC implements Listener { - // Managers - private final QuitNPCModule _npc; private final DisguiseManager _disguise; // Time @@ -52,10 +47,9 @@ public class QuitNPC implements Listener private final int _gems; - public QuitNPC(QuitNPCModule npc, Player player, long quitMills) + public QuitNPC(Player player, long quitMills) { // Managers - _npc = npc; _disguise = Managers.get(DisguiseManager.class); // Time @@ -162,7 +156,6 @@ public class QuitNPC implements Listener if (killer != null) { - _npc.setKilledBy(_uuid, killer.getName()); Managers.get(EconomyModule.class).addToStore(killer, "Killing " + F.name(_name + "'s") + " NPC", (int) (_gems * EconomyModule.GEM_KILL_FACTOR)); } @@ -192,4 +185,4 @@ public class QuitNPC implements Listener { return _uuid; } -} +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java index 1576c696e..7d067954d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java @@ -1,40 +1,38 @@ package mineplex.gemhunters.death.quitnpc; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; -import mineplex.core.common.util.UtilPlayer; -import mineplex.gemhunters.economy.CashOutModule; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.F; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; -import mineplex.core.texttutorial.TextTutorialManager; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.death.event.QuitNPCSpawnEvent; -import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; +import mineplex.gemhunters.economy.CashOutModule; @ReflectivelyCreateMiniPlugin public class QuitNPCModule extends MiniPlugin { - private static final long LOG_OUT_TIME = TimeUnit.SECONDS.toMillis(60); private final CashOutModule _cashOut; private final Map _npcs; - private final Map _killedBy; + + private final String _serverName; + private final QuitNPCRepository _repo; private QuitNPCModule() { @@ -43,7 +41,8 @@ public class QuitNPCModule extends MiniPlugin _cashOut = require(CashOutModule.class); _npcs = new HashMap<>(); - _killedBy = new HashMap<>(); + _serverName = UtilServer.getServerName(); + _repo = new QuitNPCRepository(); } public void spawnNpc(Player player) @@ -73,7 +72,8 @@ public class QuitNPCModule extends MiniPlugin return; } - _npcs.put(player.getUniqueId(), new QuitNPC(this, player, LOG_OUT_TIME)); + _npcs.put(player.getUniqueId(), new QuitNPC(player, LOG_OUT_TIME)); + _repo.insertNpc(player.getUniqueId(), _serverName); } @EventHandler(priority = EventPriority.LOWEST) @@ -93,23 +93,30 @@ public class QuitNPCModule extends MiniPlugin public void npcDespawn(QuitNPCDespawnEvent event) { log("Despawning npc for " + _npcs.remove(event.getNpc().getUniqueId()).getName()); + _repo.deleteNpc(event.getNpc().getUniqueId()); } - @EventHandler - public void playerJoin(PlayerJoinEvent event) + @EventHandler(priority = EventPriority.HIGHEST) + public void onLogin(AsyncPlayerPreLoginEvent event) { - Player player = event.getPlayer(); - UUID key = player.getUniqueId(); - - if (_killedBy.containsKey(key)) + try { - player.sendMessage(F.main("Game", "You were killed while you were logged out. You were killed by " + F.name(_killedBy.remove(key)) + ".")); + String npcServer = _repo.loadNpcServer(event.getUniqueId()).get(); + if (npcServer == null || npcServer.isEmpty()) + { + return; + } + if (npcServer.equals(_serverName)) + { + return; + } + + event.disallow(Result.KICK_OTHER, C.cRed + "You have a combat logger alive on " + npcServer + "! Either wait for it to despawn or join that server directly!"); + } + catch (Exception ex) + { + ex.printStackTrace(); } - } - - public void setKilledBy(UUID dead, String killedBy) - { - _killedBy.put(dead, killedBy); } public QuitNPC getNPC(Player player) @@ -121,5 +128,4 @@ public class QuitNPCModule extends MiniPlugin { return _npcs.containsKey(player.getUniqueId()); } - -} +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java new file mode 100644 index 000000000..6db02ac7f --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java @@ -0,0 +1,69 @@ +package mineplex.gemhunters.death.quitnpc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; +import mineplex.serverdata.database.column.ColumnVarChar; + +public class QuitNPCRepository extends RepositoryBase +{ + private static final String GET_DATA = "SELECT serverName FROM gemHuntersQuitNpcs WHERE uuid=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHuntersQuitNpcs (uuid, serverName) VALUES (?, ?);"; + private static final String DELETE_DATA = "DELETE FROM gemHuntersQuitNpcs WHERE uuid=?;"; + + public QuitNPCRepository() + { + super(DBPool.getAccount()); + } + + public CompletableFuture loadNpcServer(UUID uuid) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = getConnection()) + { + PreparedStatement stmt = conn.prepareStatement(GET_DATA); + stmt.setString(1, uuid.toString()); + + String serverName = null; + + ResultSet resultSet = stmt.executeQuery(); + if (resultSet.next()) + { + serverName = resultSet.getString("serverName"); + } + + return serverName; + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + }); + } + + public void deleteNpc(UUID uuid) + { + final String uuidStr = uuid.toString(); + UtilServer.runAsync(() -> + { + executeUpdate(DELETE_DATA, new ColumnVarChar("uuid", uuidStr.length(), uuidStr)); + }); + } + + public void insertNpc(UUID uuid, String serverName) + { + final String uuidStr = uuid.toString(); + UtilServer.runAsync(() -> + { + executeInsert(INSERT_DATA, null, new ColumnVarChar("uuid", uuidStr.length(), uuidStr), new ColumnVarChar("serverName", serverName.length(), serverName)); + }); + } +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java index deb3644d7..216ebae4e 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -1,30 +1,28 @@ package mineplex.gemhunters.join; +import java.util.function.Consumer; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; -import mineplex.core.inventory.InventoryManager; import mineplex.gemhunters.death.quitnpc.QuitNPC; import mineplex.gemhunters.death.quitnpc.QuitNPCModule; import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.loot.InventoryModule; -import mineplex.gemhunters.map.ItemMapModule; import mineplex.gemhunters.persistence.PersistenceData; import mineplex.gemhunters.persistence.PersistenceModule; import mineplex.gemhunters.persistence.PersistenceRepository; import mineplex.gemhunters.quest.QuestModule; import mineplex.gemhunters.spawn.SpawnModule; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerJoinEvent; - -import java.util.function.Consumer; @ReflectivelyCreateMiniPlugin public class JoinModule extends MiniPlugin { - private final CoreClientManager _client; private final EconomyModule _economy; private final QuestModule _quest; @@ -81,9 +79,9 @@ public class JoinModule extends MiniPlugin if (!repository.exists(client)) { - _spawn.teleportToSpawn(player); + runSync(() -> _spawn.teleportToSpawn(player)); } }); } -} +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index dcf2afde9..cf928f3d6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -1,5 +1,19 @@ package mineplex.gemhunters.persistence; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; + import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; @@ -12,24 +26,6 @@ import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.loot.InventoryModule; import mineplex.gemhunters.quest.QuestModule; import mineplex.gemhunters.quest.QuestPlayerData; -import mineplex.serverdata.commands.ServerTransfer; -import net.minecraft.server.v1_8_R3.EntityItemFrame; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; @ReflectivelyCreateMiniPlugin public class PersistenceModule extends MiniPlugin @@ -149,4 +145,4 @@ public class PersistenceModule extends MiniPlugin { return _repository; } -} +} \ No newline at end of file From 3abcb441bf6395b578572775484c779f492b1727 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 14 May 2017 01:52:02 -0400 Subject: [PATCH 120/170] Properly take into account server regions --- .../src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java index 7d067954d..109e1039f 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java @@ -41,7 +41,7 @@ public class QuitNPCModule extends MiniPlugin _cashOut = require(CashOutModule.class); _npcs = new HashMap<>(); - _serverName = UtilServer.getServerName(); + _serverName = UtilServer.getRegion().name() + ":" + UtilServer.getServerName(); _repo = new QuitNPCRepository(); } From c3bd123ea1e8de953f6c357372f4d3704ed56bbc Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Tue, 16 May 2017 21:05:12 -0400 Subject: [PATCH 121/170] Live op numero uno --- .../games/castleassault/CastleAssault.java | 53 +++++- .../games/castleassault/CastleAssaultTDM.java | 172 +++++++++--------- .../games/castleassault/data/TeamKing.java | 10 +- .../games/castleassault/kits/KitFighter.java | 12 +- .../games/castleassault/kits/KitPlayer.java | 2 +- 5 files changed, 149 insertions(+), 100 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index f4ed36446..d06c8f042 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -131,6 +131,7 @@ public class CastleAssault extends TeamGame private ChestLoot _miscGear = new ChestLoot(); private ObjectiveTNTSpawner _tntSpawner; + private Map _teamKills = new HashMap<>(); private boolean _writeScoreboard = true; @@ -186,6 +187,7 @@ public class CastleAssault extends TeamGame this.CrownsEnabled = true; this.FirstKillReward = 20; this.GemKillDeathRespawn = 1; + this.GameTimeout = -1; new CompassModule() .setGiveCompass(true) @@ -862,6 +864,55 @@ public class CastleAssault extends TeamGame } AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + _teamKills.merge(GetTeam(player), 1, Integer::sum); + if (GetTeam(player).GetColor() == ChatColor.RED) + { + GameTeam enemy = GetTeam(ChatColor.AQUA); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) + { + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + { + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } + } + } + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } + } + else + { + GameTeam enemy = GetTeam(ChatColor.RED); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) + { + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + { + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } + } + } + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } + } if (UtilPlayer.isSpectator(player)) { @@ -970,7 +1021,7 @@ public class CastleAssault extends TeamGame } else { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index e83f12804..71ead5cc4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.WeakHashMap; import org.bukkit.Bukkit; @@ -48,6 +49,7 @@ import org.bukkit.material.MaterialData; import org.bukkit.metadata.MetadataValue; import mineplex.core.Managers; +import mineplex.core.common.Pair; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; @@ -60,7 +62,9 @@ import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; import mineplex.core.loot.ChestLoot; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -83,12 +87,14 @@ import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; import nautilus.game.arcade.game.games.castleassault.kits.KitTank; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; public class CastleAssaultTDM extends TeamGame { private static final int MAX_FLINT_AND_STEEL_USES = 4; private static final int ITEMS_PER_CHEST = 5; private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + private static final int KILLS_TO_WIN = 50; private long _lastRefill; @@ -122,7 +128,22 @@ public class CastleAssaultTDM extends TeamGame //new KitNinja(manager), new KitTank(manager) }, - new String[] {"AlexTheCoder is awesome!"}); + new String[] + { + "Work with your team", + "To slay the enemy.", + "First team to 50 kills", + "Wins the game and glory!" + } + ); + + _help = new String[] + { + "Purchase kit upgrades by earning and spending crowns from games", + "Each kit has special starter items, be sure to use them to your advantage in fights", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; this.StrictAntiHack = true; this.HungerSet = 20; @@ -143,6 +164,7 @@ public class CastleAssaultTDM extends TeamGame this.CrownsEnabled = true; this.FirstKillReward = 20; this.GemKillDeathRespawn = 1; + this.GameTimeout = -1; new CompassModule() .setGiveCompass(true) @@ -153,33 +175,33 @@ public class CastleAssaultTDM extends TeamGame _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); generateLoot(); -// if (manager.IsRewardStats()) -// { -// if (manager.GetLobby() instanceof NewGameLobbyManager) -// { -// Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); -// if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) -// { -// Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); -// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); -// } -// if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) -// { -// Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); -// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY_SEASON, loc, 10)); -// } -// if (lobbyCustomLocs.containsKey("TOP_WINS")) -// { -// Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); -// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); -// } -// if (lobbyCustomLocs.containsKey("TOP_KILLS")) -// { -// Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); -// Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); -// } -// } -// } + if (manager.IsRewardStats()) + { + if (manager.GetLobby() instanceof NewGameLobbyManager) + { + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + } + } } private void generateLoot() @@ -274,10 +296,10 @@ public class CastleAssaultTDM extends TeamGame GameTeam red = GetTeam(ChatColor.RED); GameTeam blue = GetTeam(ChatColor.AQUA); Scoreboard.write(red.GetFormattedName() + " Team Kills"); - Scoreboard.write(_teamKills.get(red) + "/50"); + Scoreboard.write(_teamKills.get(red) + "/" + KILLS_TO_WIN); Scoreboard.writeNewLine(); Scoreboard.write(blue.GetFormattedName() + " Team Kills"); - Scoreboard.write(_teamKills.get(blue) + "/50"); + Scoreboard.write(_teamKills.get(blue) + "/" + KILLS_TO_WIN); Scoreboard.draw(); } @@ -363,12 +385,16 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) { - int crowns = 0; - for (GemData data : GetGems(player).values()) + if (data.getKey().equals("Kills")) { - crowns += data.Gems; + crowns += data.getValue().Gems; } + } + + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { @@ -376,7 +402,7 @@ public class CastleAssaultTDM extends TeamGame } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { @@ -387,22 +413,6 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - if (GetKit(player) != null) - { - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } - } } } SetState(GameState.End); @@ -433,7 +443,7 @@ public class CastleAssaultTDM extends TeamGame GameTeam red = GetTeam(ChatColor.RED); GameTeam blue = GetTeam(ChatColor.AQUA); - if (_teamKills.get(blue).intValue() >= 50) + if (_teamKills.get(blue).intValue() >= KILLS_TO_WIN) { AnnounceEnd(blue); writeFinalScoreboard(blue.GetColor() + blue.GetName(), _teamKills.get(blue)); @@ -454,12 +464,16 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) { - int crowns = 0; - for (GemData data : GetGems(player).values()) + if (data.getKey().equals("Kills")) { - crowns += data.Gems; + crowns += data.getValue().Gems; } + } + + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { @@ -467,7 +481,7 @@ public class CastleAssaultTDM extends TeamGame } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { @@ -478,25 +492,12 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } } } SetState(GameState.End); return; } - if (_teamKills.get(red).intValue() >= 50) + if (_teamKills.get(red).intValue() >= KILLS_TO_WIN) { AnnounceEnd(red); writeFinalScoreboard(red.GetColor() + red.GetName(), _teamKills.get(red)); @@ -517,12 +518,16 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 10, "Participation", false, false); } + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) { - int crowns = 0; - for (GemData data : GetGems(player).values()) + if (data.getKey().equals("Kills")) { - crowns += data.Gems; + crowns += data.getValue().Gems; } + } + + { int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); if (streak >= 2 && streak < 4) { @@ -530,7 +535,7 @@ public class CastleAssaultTDM extends TeamGame } else if (streak >= 4 && streak < 6) { - AddGems(player, crowns, streak + " Player Kill Streak", false, false); + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); } else if (streak >= 6 && streak < 8) { @@ -541,19 +546,6 @@ public class CastleAssaultTDM extends TeamGame AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); } } - - KitPlayer kit = (KitPlayer) GetKit(player); - int kitLevel = kit.getUpgradeLevel(player.getUniqueId()); - if (kitLevel > 0) - { - int crowns = 0; - for (GemData data : GetGems(player).values()) - { - crowns += data.Gems; - } - - AddGems(player, (0.5 * kitLevel) * crowns, kit.GetName() + " Kit Level Bonus", false, false); - } } } SetState(GameState.End); @@ -587,10 +579,10 @@ public class CastleAssaultTDM extends TeamGame Manager.GetDamage().SetEnabled(true); Manager.GetExplosion().setEnabled(true); Manager.GetCreature().SetDisableCustomDrops(false); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_WINS"); - Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_KILLS"); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java index 0cc108f8d..02f17267f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java @@ -104,10 +104,16 @@ public class TeamKing public boolean handleDamage(String player, double damage) { - if (!UtilTime.elapsed(_lastDamage, 400)) + return handleDamage(player, damage, false); + } + + public boolean handleDamage(String player, double damage, boolean force) + { + if (!UtilTime.elapsed(_lastDamage, 400) && !force) { return false; } + _lastDamager = player; _lastDamage = System.currentTimeMillis(); @@ -119,4 +125,4 @@ public class TeamKing return true; } -} \ No newline at end of file +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java index d5b49974d..986bfb915 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java @@ -65,36 +65,36 @@ public class KitFighter extends KitPlayer if (level == 0) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); } else if (level == 1) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); } else if (level == 2) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); } else if (level == 3) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); } else if (level == 4) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").build()); } else if (level == 5) { player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); - player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").setLore(C.cGold + "Kit Item").build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").build()); } player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java index 1b90a1793..ac445dd49 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java @@ -39,7 +39,7 @@ public abstract class KitPlayer extends ProgressingKit protected void giveRegeneration(Player player) { - player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 3, 3)); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 5, 3)); } @Override From 672ada3f31c06ef8043091de8ca2bb26f7ce64d0 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Tue, 16 May 2017 21:14:47 -0400 Subject: [PATCH 122/170] Add Castle Assault TDM to compass --- .../mineplex/hub/server/ServerManager.java | 5 ++++ .../hub/server/ui/ServerGameMenu.java | 25 +++++++++++++++---- .../server/ui/button/SelectCATDMButton.java | 23 +++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index f72c95a65..cc37b55a6 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -792,6 +792,11 @@ public class ServerManager extends MiniPlugin implements BrawlShopProvider { return _serverNpcShopMap.get("Castle Assault"); } + + public ShopBase getCastleAssaultTDMShop() + { + return _serverNpcShopMap.get("Castle Assault TDM"); + } public ShopBase getCastleSiegeShop() { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java index 00498e1d3..07e52532f 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -22,6 +22,7 @@ import mineplex.hub.server.ui.button.SelectBLDButton; import mineplex.hub.server.ui.button.SelectBRButton; import mineplex.hub.server.ui.button.SelectBawkButton; import mineplex.hub.server.ui.button.SelectCAButton; +import mineplex.hub.server.ui.button.SelectCATDMButton; import mineplex.hub.server.ui.button.SelectCLANSButton; import mineplex.hub.server.ui.button.SelectCSButton; import mineplex.hub.server.ui.button.SelectCTFButton; @@ -62,7 +63,7 @@ public class ServerGameMenu extends ShopPageBase @Override protected void buildPage() { - add(1, Material.EGG, C.cYellowB + "Bawk Bawk Battles " + C.cGray + "Challenges", new String[] + add(0, Material.EGG, C.cYellowB + "Bawk Bawk Battles " + C.cGray + "Challenges", new String[] { C.Reset + "", C.Reset + "Follow Bawk Bawk's instructions", @@ -70,16 +71,25 @@ public class ServerGameMenu extends ShopPageBase C.Reset + "If you lose, chickens will devour you!" }, "BBB", "Bawk_Bawk_Battles", new SelectBawkButton(this)); - add(3, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault " + C.cGray + "Fast Paced PvP", new String[] + add(2, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault " + C.cGray + "Fast Paced PvP", new String[] { - (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", + (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW UPDATES", C.Reset + "", C.Reset + "Combatants must battle to", C.Reset + "win the day for their king", C.Reset + "at all costs!", }, "CA", "Castle_Assault", new SelectCAButton(this)); + + add(4, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault TDM " + C.cGray + "Team PvP", new String[] + { + (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", + C.Reset + "", + C.Reset + "Combatants must battle to", + C.Reset + "win glory for their team", + C.Reset + "by slaying the enemy!", + }, "CATDM", "Castle_Assault_TDM", new SelectCATDMButton(this)); - add(5, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] + add(6, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] { C.Reset + "", C.Reset + "Memorize Gwen the Guardian's builds", @@ -87,7 +97,7 @@ public class ServerGameMenu extends ShopPageBase C.Reset + "The least correct builder is eliminated.", }, "SB", "Speed_Builders", new SelectSBButton(this)); - add(7, Material.TNT, C.cYellowB + "Dragon Escape " + C.cGray + "Fast Paced Parkour", new String[] + add(8, Material.TNT, C.cYellowB + "Dragon Escape " + C.cGray + "Fast Paced Parkour", new String[] { (_extraValue ? C.cAquaB : C.cWhiteB) + "FEATURED ARCADE GAME", C.Reset + "", @@ -645,6 +655,11 @@ public class ServerGameMenu extends ShopPageBase { getPlugin().getCastleAssaultShop().attemptShopOpen(player); } + + public void openCATDM(Player player) + { + getPlugin().getCastleAssaultTDMShop().attemptShopOpen(player); + } public void openCS(Player player) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java new file mode 100644 index 000000000..409d0c4b4 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java @@ -0,0 +1,23 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectCATDMButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectCATDMButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.openCATDM(player); + } +} From eb0e9c050430f3d8bd6a34c3961727aefedfbb24 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Tue, 16 May 2017 21:19:20 -0400 Subject: [PATCH 123/170] Make speed potions level 1 and drinkable --- .../game/arcade/game/games/castleassault/CastleAssault.java | 2 +- .../game/arcade/game/games/castleassault/CastleAssaultTDM.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index d06c8f042..38c18a46d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -239,7 +239,7 @@ public class CastleAssault extends TeamGame _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); } { - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)8194).build(), 2); _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); } { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java index 71ead5cc4..959288efe 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -215,7 +215,7 @@ public class CastleAssaultTDM extends TeamGame _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); } { - _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16418).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)8194).build(), 2); _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); } { From f69203884c850488ab535a4cce32860acf98d013 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Tue, 16 May 2017 21:23:46 -0400 Subject: [PATCH 124/170] Only allow kills to damage king/crystals if tnt has spawned at least once --- .../games/castleassault/CastleAssault.java | 80 +++++++++++-------- 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java index 38c18a46d..9d651ad84 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -135,6 +135,8 @@ public class CastleAssault extends TeamGame private boolean _writeScoreboard = true; + private boolean _killsAreObjective = false; + @SuppressWarnings("deprecation") public CastleAssault(ArcadeManager manager) { @@ -636,6 +638,13 @@ public class CastleAssault extends TeamGame } _tntSpawner.update(); + if (!_killsAreObjective) + { + if (_tntSpawner.isSpawned()) + { + _killsAreObjective = true; + } + } } if (InProgress()) { @@ -864,53 +873,56 @@ public class CastleAssault extends TeamGame } AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); - _teamKills.merge(GetTeam(player), 1, Integer::sum); - if (GetTeam(player).GetColor() == ChatColor.RED) + if (_killsAreObjective) { - GameTeam enemy = GetTeam(ChatColor.AQUA); - TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); - if (crystals.length > 0) + _teamKills.merge(GetTeam(player), 1, Integer::sum); + if (GetTeam(player).GetColor() == ChatColor.RED) { - if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + GameTeam enemy = GetTeam(ChatColor.AQUA); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) { - crystals[UtilMath.r(crystals.length)].destroy(); - if (crystals.length > 1) + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) { - Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); - } - else - { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } } } + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } } else { - _kings.get(enemy).handleDamage(player.getName(), 10, true); - } - } - else - { - GameTeam enemy = GetTeam(ChatColor.RED); - TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); - if (crystals.length > 0) - { - if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + GameTeam enemy = GetTeam(ChatColor.RED); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) { - crystals[UtilMath.r(crystals.length)].destroy(); - if (crystals.length > 1) + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) { - Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); - } - else - { - Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } } } - } - else - { - _kings.get(enemy).handleDamage(player.getName(), 10, true); + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } } } From 2a7fea59367059ca7e62bd1fca1f6590969db61a Mon Sep 17 00:00:00 2001 From: cnr Date: Wed, 17 May 2017 19:38:39 -0600 Subject: [PATCH 125/170] Fix Anticheat ban message --- Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index a9d18dbcf..764ffa8b9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -210,7 +210,7 @@ public class AntiHack extends MiniPlugin CoreClient coreClient = _clientManager.Get(player); String id = generateId(); - String finalMessage = "[GWEN Cheat Detection]\n\nToken: " + id; + String finalMessage = "[GWEN Cheat Detection]\n\nBan Token:\n" + org.bukkit.ChatColor.GRAY + id; JsonObject custom = new JsonObject(); custom.addProperty("ban-reason", CheckManager.getCheckSimpleName(cause)); if (gep) From 06a6d1914d4b8cd6c64b100981cecc923bbff8e4 Mon Sep 17 00:00:00 2001 From: cnr Date: Wed, 17 May 2017 20:03:54 -0600 Subject: [PATCH 126/170] Add new words to DMT and MB --- .../game/arcade/game/games/build/Build.java | 33 ++++++++++++++++++- .../game/arcade/game/games/draw/Draw.java | 33 ++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java index 1a0458b5d..1a9bb27c5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java @@ -239,7 +239,38 @@ public class Build extends Game "Clown", "Windmill", "Alligator", "Police", "Igloo", "Gift", "Bumblebee", "Jellyfish", "Speedboat", "Fall", "Summer", "Autumn", "Winter", "Disco", "Moose", - "Water Gun", "Astronaut", "Wither", "Meteor" + "Water Gun", "Astronaut", "Wither", "Meteor", + "Airplane", "Alarm clock", "Alien", "Alligator", "Ant", "Apple", "Arm", "Autumn", "Baby", "Ball", + "Balloon", "Banana", "Barn", "Base", "Baseball", "Basketball", "Bat", "Bathroom", "Battery", "Beach", + "Bear", "Beaver", "Bed", "Beehive", "Bell", "Bicycle", "Bike", "Bird", "Birthday cake", "Blocks", + "Boat", "Bone", "Book", "Boot", "Bottle", "Bowtie", "Boy", "Bracelet", "Brain", "Branch", + "Bread", "Bridge", "Bubble", "Bug", "Bunny", "Bus", "Cage", "Cake", "Camera", "Cape", + "Carrot", "Castle", "Cat", "Cave", "Chair", "Chalk", "Cheek", "Cheese", "Cheeseburger", "Cherry", + "Chess", "Chicken", "Chin", "Christmas", "Circle", "Circus", "Clock", "Cloud", "Coal", "Coat", + "Coconut", "Computer", "Cone", "Cookie", "Corn", "Cow", "Crab", "Crib", "Cup", "Cupcake", + "Desert", "Desk", "Dinosaur", "Dog", "Doll", "Dominoes", "Door", "Doormat", "Drum", "Duck", + "Ear", "Ears", "Egg", "Electricity", "Elephant", "Eraser", "Eyes", "Face", "Farm", "Fishing pole", + "Fist", "Flamingo", "Flashlight", "Flower", "Flute", "Fly", "Football", "Forest", "Fountain", "Frenchfries", + "Frog", "Garbage", "Garden", "Gate", "Ghost", "Gingerbread man", "Giraffe", "Girl", "Glasses", "Grapes", + "Grass", "Graveyard", "Hair dryer", "Halloween", "Hat", "Head", "Heart", "Hippo", "Hockey", "Hook", + "Hopscotch", "Horse", "Hospital", "House", "Hula hoop", "Ice", "Icecream", "Jacket", "Jar", "Jellyfish", + "Jungle", "Kangaroo", "Key", "Kitchen", "Kite", "Knot", "Lamp", "Lawnmower", "Leaf", "Light", + "Lightbulb", "Lighthouse", "Lightsaber", "Lips", "Lipstick", "Lobster", "Lollipop", "Mail", "Mailman", "Mattress", + "Milk", "Money", "Monkey", "Moon", "Mosquito", "Mouse", "Mouth", "Muffin", "Mushroom", "Music", + "Nail", "Newspaper", "Nightmare", "Nose", "Ocean", "Orange", "Owl", "Pajamas", "Palace", "Park", + "Party", "Peach", "Peanut", "Pen", "Pencil", "Penguin", "Person", "Photograph", "Piano", "Pie", + "Pig", "Pillow", "Pineapple", "Ping pong", "Pinwheel", "Pirate", "Pizza", "Plate", "Pool Party", "Popcorn", + "Popsicle", "Potato", "Pretzel", "Prison", "Puppet", "Purse", "Queen", "Rain", "Rainbow", "Restaurant", + "Rhinoceros", "Ring", "River", "Road", "Robot", "Rocket", "Rocking chair", "Roof", "Round", "Rug", + "Ruins", "Saddle", "Sailboat", "Salt and pepper", "Scale", "School", "Scissors", "Seahorse", "Seashell", "Seesaw", + "Shark", "Sheep", "Shirt", "Shoe", "Shopping cart", "Shovel", "Skate", "Skateboard", "Ski", "Skirt", + "Slide", "Smile", "Snail", "Snake", "Snowball", "Snowflake", "Snowman", "Soap", "Socks", "Soda", + "Song", "Spaceship", "Spider", "Spider web", "Spoon", "Spring", "Stage", "Stairs", "Star", "State", + "Statue", "Stingray", "Stoplight", "Storm", "Suitcase", "Summer", "Sun", "Sunflower", "Swimming pool", "Swing", + "Swordfish", "Tail", "Taxi", "Teapot", "Telephone", "Thief", "Toast", "Toothbrush", "Torch", "Treasure", + "Tree", "Truck", "Trumpet", "Turtle", "TV", "Vest", "Violin", "Volcano", "Washing machine", "Water", + "Waterfall", "Watering can", "Whale", "Whisk", "Whistle", "Windmill", "Winter", "Worm", "Wrench", "Yo-yo", + "Zoo", }; _christmasWords = new String[] diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java index 457fcb5ce..b2f2ba4e7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java @@ -188,7 +188,38 @@ public class Draw extends SoloGame "Piano", "Guitar", "Trumpet", "Drums", "Flute", "Helicopter", "Plane", "Football", "Tennis", "Hockey", "Water", "Ocean", "Microsoft", "Twitter", "Godzilla", "Building", "House", "Rainbow", "Barbie", "Girl", "Boy", "Children", "Bomb", "Explosion", "Gun", "Tank", "Penguin", "Eagle", "America", "Kangaroo", "Sea", "Raspberry", - "Strawberry", "Jam", "Sandwich", "Owl", "Watermelon", "Australia", "Canada", "United States", "Diary" + "Strawberry", "Jam", "Sandwich", "Owl", "Watermelon", "Australia", "Canada", "United States", "Diary", + "Airplane", "Alarm clock", "Alien", "Alligator", "Ant", "Apple", "Arm", "Autumn", "Baby", "Ball", + "Balloon", "Banana", "Barn", "Base", "Baseball", "Basketball", "Bat", "Bathroom", "Battery", "Beach", + "Bear", "Beaver", "Bed", "Beehive", "Bell", "Bicycle", "Bike", "Bird", "Birthday cake", "Blocks", + "Boat", "Bone", "Book", "Boot", "Bottle", "Bowtie", "Boy", "Bracelet", "Brain", "Branch", + "Bread", "Bridge", "Bubble", "Bug", "Bunny", "Bus", "Cage", "Cake", "Camera", "Cape", + "Carrot", "Castle", "Cat", "Cave", "Chair", "Chalk", "Cheek", "Cheese", "Cheeseburger", "Cherry", + "Chess", "Chicken", "Chin", "Christmas", "Circle", "Circus", "Clock", "Cloud", "Coal", "Coat", + "Coconut", "Computer", "Cone", "Cookie", "Corn", "Cow", "Crab", "Crib", "Cup", "Cupcake", + "Desert", "Desk", "Dinosaur", "Dog", "Doll", "Dominoes", "Door", "Doormat", "Drum", "Duck", + "Ear", "Ears", "Egg", "Electricity", "Elephant", "Eraser", "Eyes", "Face", "Farm", "Fishing pole", + "Fist", "Flamingo", "Flashlight", "Flower", "Flute", "Fly", "Football", "Forest", "Fountain", "Frenchfries", + "Frog", "Garbage", "Garden", "Gate", "Ghost", "Gingerbread man", "Giraffe", "Girl", "Glasses", "Grapes", + "Grass", "Graveyard", "Hair dryer", "Halloween", "Hat", "Head", "Heart", "Hippo", "Hockey", "Hook", + "Hopscotch", "Horse", "Hospital", "House", "Hula hoop", "Ice", "Icecream", "Jacket", "Jar", "Jellyfish", + "Jungle", "Kangaroo", "Key", "Kitchen", "Kite", "Knot", "Lamp", "Lawnmower", "Leaf", "Light", + "Lightbulb", "Lighthouse", "Lightsaber", "Lips", "Lipstick", "Lobster", "Lollipop", "Mail", "Mailman", "Mattress", + "Milk", "Money", "Monkey", "Moon", "Mosquito", "Mouse", "Mouth", "Muffin", "Mushroom", "Music", + "Nail", "Newspaper", "Nightmare", "Nose", "Ocean", "Orange", "Owl", "Pajamas", "Palace", "Park", + "Party", "Peach", "Peanut", "Pen", "Pencil", "Penguin", "Person", "Photograph", "Piano", "Pie", + "Pig", "Pillow", "Pineapple", "Ping pong", "Pinwheel", "Pirate", "Pizza", "Plate", "Pool Party", "Popcorn", + "Popsicle", "Potato", "Pretzel", "Prison", "Puppet", "Purse", "Queen", "Rain", "Rainbow", "Restaurant", + "Rhinoceros", "Ring", "River", "Road", "Robot", "Rocket", "Rocking chair", "Roof", "Round", "Rug", + "Ruins", "Saddle", "Sailboat", "Salt and pepper", "Scale", "School", "Scissors", "Seahorse", "Seashell", "Seesaw", + "Shark", "Sheep", "Shirt", "Shoe", "Shopping cart", "Shovel", "Skate", "Skateboard", "Ski", "Skirt", + "Slide", "Smile", "Snail", "Snake", "Snowball", "Snowflake", "Snowman", "Soap", "Socks", "Soda", + "Song", "Spaceship", "Spider", "Spider web", "Spoon", "Spring", "Stage", "Stairs", "Star", "State", + "Statue", "Stingray", "Stoplight", "Storm", "Suitcase", "Summer", "Sun", "Sunflower", "Swimming pool", "Swing", + "Swordfish", "Tail", "Taxi", "Teapot", "Telephone", "Thief", "Toast", "Toothbrush", "Torch", "Treasure", + "Tree", "Truck", "Trumpet", "Turtle", "TV", "Vest", "Violin", "Volcano", "Washing machine", "Water", + "Waterfall", "Watering can", "Whale", "Whisk", "Whistle", "Windmill", "Winter", "Worm", "Wrench", "Yo-yo", + "Zoo" }; _christmasWords = new String[] From 500367b4739bc41863269421dff674d942ff8396 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 May 2017 03:13:18 +0100 Subject: [PATCH 127/170] Premtive hotfix --- .../mineplex/core/common/util/UtilEnt.java | 6 +- .../perks/creeper/PerkCreeperExplode.java | 1 + .../smash/perks/magmacube/PerkMagmaBlast.java | 4 +- .../smash/perks/magmacube/PerkMagmaBoost.java | 60 +++++++++---------- .../smash/perks/pig/PerkPigBaconBounce.java | 2 +- .../perks/witherskeleton/PerkWitherImage.java | 3 + 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java index 635bedba2..580b337f5 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java @@ -694,9 +694,9 @@ public class UtilEnt return ent.isOnGround(); } - AxisAlignedBB box = ((CraftEntity)ent).getHandle().getBoundingBox().shrink(0.05, 0, 0.05); - Location bottom_corner_1 = new Location(ent.getWorld(), box.a, ent.getLocation().getY()-0.05, box.c); - Location bottom_corner_2 = new Location(ent.getWorld(), box.d, ent.getLocation().getY()-0.05, box.f); + AxisAlignedBB box = ((CraftEntity)ent).getHandle().getBoundingBox(); + Location bottom_corner_1 = new Location(ent.getWorld(), box.a, ent.getLocation().getY()-0.1, box.c); + Location bottom_corner_2 = new Location(ent.getWorld(), box.d, ent.getLocation().getY()-0.1, box.f); for(Block b : UtilBlock.getInBoundingBox(bottom_corner_1, bottom_corner_2)){ if(UtilBlock.solid(b)) return true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index d307030d9..911b45a06 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -257,6 +257,7 @@ public class PerkCreeperExplode extends SmashPerk } _active.remove(player.getUniqueId()); + DecreaseSize(player); UtilPlayer.message(player, F.main("Skill", "You cancelled " + F.skill(GetName()) + ".")); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java index 0be61eca6..a5ea688f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java @@ -175,7 +175,9 @@ public class PerkMagmaBlast extends Perk { return; } - + + proj.remove(); + Player shooter = (Player) proj.getShooter(); // Velocity Players Map hitMap = UtilPlayer.getInRadius(proj.getLocation(), _velocityRadius); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java index 7b2030ba0..a11ec58f0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java @@ -1,15 +1,5 @@ package nautilus.game.arcade.game.games.smash.perks.magmacube; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import nautilus.game.arcade.game.games.smash.perks.PerkSmashStats; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; - import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -21,14 +11,26 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; - import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.kit.Perk; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; public class PerkMagmaBoost extends Perk { + private static final ItemStack BOOTS = new ItemStack(Material.IRON_BOOTS); + private static final ItemStack HELMET = new ItemStack(Material.IRON_HELMET); + private int _maxStacks; private Map _kills = new HashMap<>(); @@ -60,18 +62,7 @@ public class PerkMagmaBoost extends Perk { Player killed = (Player) event.GetEvent().getEntity(); - if (_kills.remove(killed.getUniqueId()) != null) - { - for (Perk perk : Kit.GetPerks()) - { - if (perk instanceof PerkSmashStats) - { - PerkSmashStats perkSmashStats = (PerkSmashStats) perk; - perkSmashStats.setArmor(Double.valueOf(_spreadsheet.getDataMap().get(_spreadsheet.getKey(Kit, perkSmashStats, "Armor")))); - break; - } - } - } + _kills.remove(killed.getUniqueId()); if (event.GetLog().GetKiller() == null) { @@ -102,21 +93,24 @@ public class PerkMagmaBoost extends Perk size = Math.min(_maxStacks, size); + // Adjust armour + if (size == 1) + { + killer.getInventory().setBoots(BOOTS); + } + else if (size == 2) + { + } + else if (size == 3) + { + killer.getInventory().setHelmet(HELMET); + } + _kills.put(key, size); slime.SetSize(size + 1); Manager.GetDisguise().updateDisguise(slime); - for (Perk perk : Kit.GetPerks()) - { - if (perk instanceof PerkSmashStats) - { - PerkSmashStats perkSmashStats = (PerkSmashStats) perk; - perkSmashStats.setArmor(perkSmashStats.getArmour() + 0.5); - break; - } - } - killer.setExp(0.99F * (size / (float) _maxStacks)); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java index ff0a0b82f..720dc9145 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java @@ -121,7 +121,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown // Launch Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.PORK, (byte) 0, 1, "Bacon" + System.currentTimeMillis())); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1f); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, .8F); ent.setPickupDelay(9999); // Sound diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java index fd39215b8..0c3c73bb9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java @@ -33,6 +33,7 @@ import mineplex.core.utils.UtilVariant; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import org.bukkit.util.Vector; public class PerkWitherImage extends SmashPerk { @@ -152,6 +153,8 @@ public class PerkWitherImage extends SmashPerk } Skeleton skel = _skeletons.get(player.getUniqueId()); + Vector oldSkeletonVector = skel.getVelocity().clone(); + Vector oldPlayerVector = player.getVelocity().clone(); Location loc = skel.getLocation(); skel.teleport(player.getLocation()); From 3794686f588e5ad6ae65b8ccd0f6c53c3366017b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 May 2017 03:13:31 +0100 Subject: [PATCH 128/170] Velocity and armour fix --- .../arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java | 2 ++ .../game/games/smash/perks/witherskeleton/PerkWitherImage.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java index a11ec58f0..49256518c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java @@ -29,6 +29,7 @@ public class PerkMagmaBoost extends Perk { private static final ItemStack BOOTS = new ItemStack(Material.IRON_BOOTS); + private static final ItemStack CHESTPLATE = new ItemStack(Material.IRON_CHESTPLATE); private static final ItemStack HELMET = new ItemStack(Material.IRON_HELMET); private int _maxStacks; @@ -100,6 +101,7 @@ public class PerkMagmaBoost extends Perk } else if (size == 2) { + killer.getInventory().setChestplate(CHESTPLATE); } else if (size == 3) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java index 0c3c73bb9..605ea110c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java @@ -158,7 +158,9 @@ public class PerkWitherImage extends SmashPerk Location loc = skel.getLocation(); skel.teleport(player.getLocation()); + UtilAction.velocity(skel, oldPlayerVector); player.teleport(loc); + UtilAction.velocity(player, oldSkeletonVector); // Sound player.getWorld().playSound(player.getLocation(), Sound.WITHER_SPAWN, 1f, 2f); From f565b0a9dbf9b3ad1e4cc2f0707d0d5777e2334b Mon Sep 17 00:00:00 2001 From: cnr Date: Thu, 18 May 2017 21:46:18 -0500 Subject: [PATCH 129/170] Add Super Smash Mobs Training to compass and NPC menus --- .../mineplex/hub/server/ui/ServerNpcShop.java | 4 +- .../ui/SuperSmashMobsServerTypePage.java | 54 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java index eb087afa5..4bda13c2c 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java @@ -25,7 +25,6 @@ public class ServerNpcShop extends ShopBase { switch (_serverGroup.getPrefix().toUpperCase()) { - case "SSM": case "SKY": case "HG": return new ServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player, _serverGroup); @@ -39,6 +38,9 @@ public class ServerNpcShop extends ShopBase case "SF": return new SkyfallServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player); + case "SSM": + return new SuperSmashMobsServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player, _serverGroup); + default: return new ServerNpcPage(getPlugin(), this, getClientManager(), getDonationManager(), _serverGroup.getServerNpcName(), player, _serverGroup.getPrefix()); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java new file mode 100644 index 000000000..f2c611800 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java @@ -0,0 +1,54 @@ +package mineplex.hub.server.ui; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.donation.DonationManager; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.shop.page.ShopPageBase; +import mineplex.hub.server.ServerManager; +import mineplex.serverdata.data.ServerGroup; + +public class SuperSmashMobsServerTypePage extends ShopPageBase + +{ + private final ServerGroup _serverGroup; + + public SuperSmashMobsServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, + DonationManager donationManager, Player player, ServerGroup group) + { + super(plugin, shop, clientManager, donationManager, "Super Smash Mobs ", player, 27); + _serverGroup = group; + + buildPage(); + } + + @Override + protected void buildPage() + { + setItem(12, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 4).setTitle(C.Reset + C.cGold + "Play " + C.cYellow + "Super Smash Mobs") + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cGreen + "Click to Play", + }).build()); + + setItem(14, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3).setTitle(C.Reset + C.cYellow + "Super Smash Mobs " + C.cGold + "Training") + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cGreen + "Click to Play", + }).build()); + + getButtonMap().put(12, (player, __) -> getShop().openPageForPlayer(player, new ServerTypePage(getPlugin(), getShop(), getClientManager(), getDonationManager(), player, _serverGroup))); + getButtonMap().put(14, (player, __) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "SSM Training", player, "SSMT"))); + } + + public void Update() + { + getButtonMap().clear(); + buildPage(); + } +} From c60d357cfedc42497bea88ded8be0992601e2461 Mon Sep 17 00:00:00 2001 From: cnr Date: Fri, 19 May 2017 14:53:40 -0500 Subject: [PATCH 130/170] Fix AntiHack quick-logout NPE --- .../src/mineplex/core/antihack/AntiHack.java | 13 +++++++++---- .../core/antihack/actions/BanwaveAction.java | 3 ++- .../core/antihack/actions/GEPBanAction.java | 4 +++- .../core/antihack/actions/ImmediateBanAction.java | 6 ++++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index 764ffa8b9..ea10db00a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -201,7 +201,7 @@ public class AntiHack extends MiniPlugin runSync(() -> _banned.remove(uuid)); } - public void doBan(Player player, Class cause, boolean gep) + public void doBan(Player player, Class cause, boolean gep, int hoursBanned) { runSync(() -> { @@ -227,7 +227,7 @@ public class AntiHack extends MiniPlugin new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish(); }); - _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, getHoursBanned(player, cause), true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, hoursBanned, true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -266,7 +266,7 @@ public class AntiHack extends MiniPlugin Consumer> doPunish = after -> { - _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getHoursBanned(player, CheckManager.getCheckBySimpleName(info.getHackType())), true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getHoursBanned(player), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -346,6 +346,11 @@ public class AntiHack extends MiniPlugin { PunishClient punishClient = require(Punish.class).GetClient(player.getName()); + if (punishClient == null) + { + return -1; + } + int totalPunishments = 0; if (punishClient.GetPunishments().containsKey(Category.Hacking)) @@ -362,7 +367,7 @@ public class AntiHack extends MiniPlugin return totalPunishments; } - public int getHoursBanned(Player player, Class check) + public int getHoursBanned(Player player) { switch (getPunishments(player)) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java index 6840ec600..1deaf4a35 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java @@ -12,6 +12,7 @@ import mineplex.core.common.util.UtilServer; public class BanwaveAction extends AntiHackAction { + private final AntiHack _antiHack = Managers.require(AntiHack.class); private static final int BAN_DELAY_MINIMUM_MINUTES = 30; private static final int BAN_DELAY_MAXIMUM_MINUTES = (int) TimeUnit.MINUTES.convert(2, TimeUnit.HOURS); @@ -25,7 +26,7 @@ public class BanwaveAction extends AntiHackAction { if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); return; } if (event.getViolations() >= this.getMinVl()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java index 0fbaa3377..6c109e68c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java @@ -7,6 +7,8 @@ import mineplex.core.antihack.AntiHack; public class GEPBanAction extends AntiHackAction { + private final AntiHack _antiHack = Managers.require(AntiHack.class); + public GEPBanAction(int vl) { super(vl); @@ -17,7 +19,7 @@ public class GEPBanAction extends AntiHackAction { if (event.getViolations() >= this.getMinVl() && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); } } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java index 1016ba9c5..2f86d524d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java @@ -7,6 +7,8 @@ import mineplex.core.antihack.AntiHack; public class ImmediateBanAction extends AntiHackAction { + private final AntiHack _antiHack = Managers.require(AntiHack.class); + public ImmediateBanAction(int vl) { super(vl); @@ -17,12 +19,12 @@ public class ImmediateBanAction extends AntiHackAction { if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); return; } if (event.getViolations() >= this.getMinVl()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), false); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), false, _antiHack.getHoursBanned(event.getPlayer())); } } } From f1ac67f049a1cd250db85e93a65593c8af2b63a3 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 19 May 2017 21:55:51 +0100 Subject: [PATCH 131/170] Fix skeletons dropping items --- .../game/games/alieninvasion/AlienInvasion.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 0e0e846ba..8f8fc48bb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -22,6 +22,7 @@ import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; @@ -362,6 +363,17 @@ public class AlienInvasion extends SoloGame } } + @EventHandler + public void itemSpawn(ItemSpawnEvent event) + { + if (!IsLive()) + { + return; + } + + event.setCancelled(true); + } + @Override public void EndCheck() { From 85993053aa3dd84a5137d5f4db181e852846ff47 Mon Sep 17 00:00:00 2001 From: cnr Date: Fri, 19 May 2017 23:16:39 -0500 Subject: [PATCH 132/170] Fix circular Anticheat dependency --- .../src/mineplex/core/antihack/actions/BanwaveAction.java | 3 ++- .../src/mineplex/core/antihack/actions/GEPBanAction.java | 4 ++-- .../mineplex/core/antihack/actions/ImmediateBanAction.java | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java index 1deaf4a35..f58f843a9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java @@ -12,7 +12,6 @@ import mineplex.core.common.util.UtilServer; public class BanwaveAction extends AntiHackAction { - private final AntiHack _antiHack = Managers.require(AntiHack.class); private static final int BAN_DELAY_MINIMUM_MINUTES = 30; private static final int BAN_DELAY_MAXIMUM_MINUTES = (int) TimeUnit.MINUTES.convert(2, TimeUnit.HOURS); @@ -24,6 +23,8 @@ public class BanwaveAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java index 6c109e68c..4f09f49f0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java @@ -7,8 +7,6 @@ import mineplex.core.antihack.AntiHack; public class GEPBanAction extends AntiHackAction { - private final AntiHack _antiHack = Managers.require(AntiHack.class); - public GEPBanAction(int vl) { super(vl); @@ -17,6 +15,8 @@ public class GEPBanAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= this.getMinVl() && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java index 2f86d524d..6062d9629 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java @@ -7,8 +7,6 @@ import mineplex.core.antihack.AntiHack; public class ImmediateBanAction extends AntiHackAction { - private final AntiHack _antiHack = Managers.require(AntiHack.class); - public ImmediateBanAction(int vl) { super(vl); @@ -17,6 +15,8 @@ public class ImmediateBanAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); From 474c2e78f2b710de7cf3caf172e642954da27d26 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 20 May 2017 17:32:44 +0100 Subject: [PATCH 133/170] Check to make user the player has the itemstack when cashing out --- .../src/mineplex/gemhunters/loot/LootModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java index ea7dc1d4d..dbff05dc6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java @@ -622,7 +622,7 @@ public class LootModule extends MiniPlugin { LootItemReward reward = iterator.next(); - if (player.equals(reward.getPlayer())) + if (player.equals(reward.getPlayer()) && player.getInventory().contains(reward.getItemStack())) { reward.success(); iterator.remove(); From 670e9db9d2e2c306f17762e8bd0007c0631f96d0 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 20 May 2017 17:33:00 +0100 Subject: [PATCH 134/170] Add Region to the slack logging --- .../src/mineplex/gemhunters/util/SlackRewardBot.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java index 9ae99966a..923bae01e 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java @@ -7,6 +7,7 @@ import mineplex.core.slack.SlackAPI; import mineplex.core.slack.SlackMessage; import mineplex.core.slack.SlackTeam; import mineplex.gemhunters.loot.rewards.LootItemReward; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.net.MalformedURLException; @@ -34,10 +35,10 @@ public class SlackRewardBot { SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), "Rewarding a " + reward.getClass().getSimpleName() + - "\nName: " + reward.getItemStack().getItemMeta().getDisplayName() + + "\nName: " + ChatColor.stripColor(reward.getItemStack().getItemMeta().getDisplayName()) + "\nPlayer: " + player.getName() + "\nStatus: *" + status + "*" + - "\nServer: " + UtilServer.getServerName() + + "\nServer: " + UtilServer.getServerName() + " " + UtilServer.getRegion().toString() + "\nTPS: " + FORMAT.format(_lag.getTicksPerSecond())), true); } From 40543a50346dca520c9d79fbaa34063895ad571b Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 22 May 2017 23:00:22 +0100 Subject: [PATCH 135/170] Fix gametype import --- .../Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 8b1f9bed8..27c8bde8c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -1,6 +1,7 @@ package nautilus.game.arcade; import nautilus.game.arcade.game.games.alieninvasion.AlienInvasion; +import nautilus.game.arcade.game.games.smash.SuperSmashTraining; import org.bukkit.Material; import mineplex.core.common.MinecraftVersion; @@ -186,6 +187,7 @@ public enum GameType Smash(SoloSuperSmash.class, GameDisplay.Smash), SmashDomination(SuperSmashDominate.class, GameDisplay.SmashDomination), SmashTeams(TeamSuperSmash.class, GameDisplay.SmashTeams, new GameType[]{GameType.Smash}, false), + SmashTraining(SuperSmashTraining.class, GameDisplay.SmashTraining), Snake(Snake.class, GameDisplay.Snake), SneakyAssassins(SneakyAssassins.class, GameDisplay.SneakyAssassins), SnowFight(SnowFight.class, GameDisplay.SnowFight), From 3701d2d9501b3a49a427178a66025fddef5683b8 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 24 May 2017 18:30:41 +0100 Subject: [PATCH 136/170] Remove pointless messages --- .../Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index dd03e2d54..f1cde0ae6 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -154,9 +154,6 @@ public class AlienInvasion extends MiniPlugin { player.playSound(player.getLocation(), Sound.AMBIENCE_CAVE, 1, 0.5F); } - - UtilTextMiddle.display(C.cGreenB + "Alien Invasion", "Event is starting!", 10, 40, 10); - Bukkit.broadcastMessage(F.main("Alien", "")); } public void sendPlayerToInstance(Player player) From 94e97daede580c4b9ace2aed131930729cd338ab Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 24 May 2017 18:39:16 +0100 Subject: [PATCH 137/170] Add a nice message to the alien speak --- .../Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index f1cde0ae6..24c7ef95d 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -82,7 +82,8 @@ public class AlienInvasion extends MiniPlugin "I believe", "I wonder if anyone can see these messages", "Get involved", - "Ruff" + "Ruff", + "Hey you, I see you using the game log output. You should totally go to Moppletop's wall on enjin and say HOI" }; private static final ItemStack HELMET = new ItemStack(Material.GLASS); From a134c1da5c35fe0c6a8661799af727b6169b3264 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 24 May 2017 19:19:52 +0100 Subject: [PATCH 138/170] Sign off changes --- .../core/achievement/Achievement.java | 4 +-- .../mineplex/hub/modules/AlienInvasion.java | 27 +++++++++++++++---- .../game/games/alieninvasion/Alien.java | 16 ++++++++--- .../games/alieninvasion/AlienInvasion.java | 4 +++ .../games/alieninvasion/PhaserProjectile.java | 4 ++- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 8c51b6256..46a50a3e4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -64,11 +64,11 @@ public enum Achievement new int[]{200}, AchievementCategory.HOLIDAY), - GLOBAL_ALIEN_INVASION("2017 Alien Invasion", 4000, + GLOBAL_ALIEN_INVASION("2017 Alien Hub Defender", 4000, new String[]{"Global.Alien Invasion 2017"}, new String[]{"Kill 50 Aliens in the Lobby,", "during the Alien Invasion event"}, - new int[]{50}, + new int[]{300}, AchievementCategory.HOLIDAY), //Bridges diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 24c7ef95d..3365055c8 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -10,22 +10,37 @@ import mineplex.core.common.Rank; import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.SchematicData; import mineplex.core.common.block.schematic.UtilSchematic; -import mineplex.core.common.util.*; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.creature.Creature; import mineplex.core.stats.StatsManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilVariant; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.DyeColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.*; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Skeleton; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.PlayerInteractAtEntityEvent; -import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockVector; @@ -153,8 +168,10 @@ public class AlienInvasion extends MiniPlugin for (Player player : Bukkit.getOnlinePlayers()) { - player.playSound(player.getLocation(), Sound.AMBIENCE_CAVE, 1, 0.5F); + player.playSound(player.getLocation(), Sound.ENDERDRAGON_DEATH, 1, 0.5F); } + + UtilTextMiddle.display(C.cGreen + "Aliens Are Invading", "Defend the Hub!"); } public void sendPlayerToInstance(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java index bf5c6aced..a4847c4eb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; public class Alien { @@ -65,14 +66,23 @@ public class Alien _theta += Math.PI / 30; - if (Math.random() < 0.95) + if (Math.random() < 0.9) { return; } - for (Player player : UtilPlayer.getNearby(_skeleton.getLocation(), 15)) + Vector last = null; + + for (Player player : UtilPlayer.getNearby(_skeleton.getLocation(), 20)) { - new PhaserProjectile(_manager, _skeleton, UtilAlg.getTrajectory(_skeleton.getEyeLocation(), player.getEyeLocation())); + last = UtilAlg.getTrajectory(_skeleton.getEyeLocation(), player.getEyeLocation()); + + new PhaserProjectile(_manager, _skeleton, last); + } + + if (last != null) + { + UtilEnt.CreatureLook(_skeleton, last); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index b45b3fac7..e5f493b63 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -14,6 +14,7 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; import nautilus.game.arcade.game.games.dragonescape.DragonScore; +import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -77,6 +78,9 @@ public class AlienInvasion extends SoloGame HungerSet = 20; manager.GetCreature().SetDisableCustomDrops(true); + + new CompassModule() + .register(this); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java index 29db79099..6190fc95e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -63,8 +63,10 @@ public class PhaserProjectile implements Listener damager.playSound(damager.getLocation(), Sound.CHICKEN_EGG_POP, 1, 0.7F); } + event.SetCancelled("Blaster Snowball"); + UtilParticle.PlayParticle(ParticleType.CLOUD, projectile.getLocation(), 0.5F, 0.5F, 0.5F, 0.05F, 5, ViewDist.NORMAL); - _manager.GetDamage().NewDamageEvent(damagee, damager, projectile, DamageCause.CUSTOM, 2, false, true, true, UtilEnt.getName(damager), "Blaster"); + _manager.GetDamage().NewDamageEvent(damagee, damager, projectile, DamageCause.CUSTOM, 4, false, true, true, UtilEnt.getName(damager), "Blaster"); UtilServer.Unregister(this); } From fd1cd148cb0e068b545d837075293bccacd83f56 Mon Sep 17 00:00:00 2001 From: cnr Date: Wed, 24 May 2017 20:43:08 -0500 Subject: [PATCH 139/170] Implement Alien Event service calls on Hub/Arcade --- .../common/api/mothership/Mothership.java | 57 ++++++++++ .../api/mothership/MothershipCommand.java | 18 ++++ .../mineplex/hub/modules/AlienInvasion.java | 100 +++++++++++++----- .../games/alieninvasion/AlienInvasion.java | 59 +++++++---- 4 files changed, 187 insertions(+), 47 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java new file mode 100644 index 000000000..356a7a197 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java @@ -0,0 +1,57 @@ +package mineplex.core.common.api.mothership; + +import java.util.UUID; + +import org.bukkit.Bukkit; + +import mineplex.core.common.api.ApiHost; +import mineplex.core.common.api.ApiWebCall; +import mineplex.core.common.util.UtilServer; + +public class Mothership +{ + private static final ApiWebCall API_BASE = new ApiWebCall("http://" + ApiHost.getAPIHost("MOTHERSHIP").getHost() + ":" + ApiHost.getAPIHost("MOTHERSHIP").getPort() + "/"); + + public static void addPlayer(UUID uuid, Runnable afterward) + { + UtilServer.runAsync(() -> + { + Boolean response = API_BASE.get("addPlayer/" + uuid.toString(), Boolean.class); + if (response == null) + { + System.out.println("!!! Issue adding player to Mothership server !!!"); + } + UtilServer.runSync(afterward); + }); + } + + public static boolean isWhitelisted(UUID uuid) + { + if (Bukkit.isPrimaryThread()) + { + throw new IllegalStateException("This method MUST NOT be called from the main thread!"); + } + + Boolean response = API_BASE.get("getPlayer/" + uuid.toString(), Boolean.class); + if (response == null) + { + System.out.println("!!! Issue retrieving player whitelist status. Allowing them in anyway! !!!"); + } + return response == null || response; + } + + public static boolean shouldStartEvent() + { + if (Bukkit.isPrimaryThread()) + { + throw new IllegalStateException("This method MUST NOT be called from the main thread"); + } + + Boolean response = API_BASE.get("startEvent/" + UtilServer.getRegion().toString() + "/" + UtilServer.getServerName(), Boolean.class); + if (response == null) + { + System.out.println("!!! Issue checking whether server should start event. Keeping event disabled! !!!"); + } + return response != null && response; + } +} diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java new file mode 100644 index 000000000..cf04491b8 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java @@ -0,0 +1,18 @@ +package mineplex.core.common.api.mothership; + +import mineplex.serverdata.commands.ServerCommand; + +public class MothershipCommand extends ServerCommand +{ + private Action action; + + public Action getAction() + { + return action; + } + + public enum Action + { + CLEANUP, START + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 3365055c8..8ef447077 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -1,29 +1,10 @@ package mineplex.hub.modules; -import mineplex.core.MiniPlugin; -import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.achievement.Achievement; -import mineplex.core.blockrestore.BlockRestore; -import mineplex.core.command.CommandBase; -import mineplex.core.common.Pair; -import mineplex.core.common.Rank; -import mineplex.core.common.block.schematic.Schematic; -import mineplex.core.common.block.schematic.SchematicData; -import mineplex.core.common.block.schematic.UtilSchematic; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.creature.Creature; -import mineplex.core.stats.StatsManager; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.utils.UtilVariant; +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; @@ -44,10 +25,35 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockVector; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; +import mineplex.core.Managers; +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.achievement.Achievement; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Pair; +import mineplex.core.common.Rank; +import mineplex.core.common.api.mothership.Mothership; +import mineplex.core.common.api.mothership.MothershipCommand; +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.SchematicData; +import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.creature.Creature; +import mineplex.core.stats.StatsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; +import mineplex.hub.server.ServerManager; +import mineplex.serverdata.commands.ServerCommandManager; @ReflectivelyCreateMiniPlugin public class AlienInvasion extends MiniPlugin @@ -105,6 +111,7 @@ public class AlienInvasion extends MiniPlugin private final BlockRestore _restore; private final Creature _creature; private final StatsManager _stats; + private final ServerManager _serverManager; private final World _world; @@ -124,6 +131,7 @@ public class AlienInvasion extends MiniPlugin _restore = require(BlockRestore.class); _creature = require(Creature.class); _stats = require(StatsManager.class); + _serverManager = Managers.get(ServerManager.class); _world = Bukkit.getWorld("world"); @@ -147,10 +155,39 @@ public class AlienInvasion extends MiniPlugin stopAnimation(); } }); + ServerCommandManager.getInstance().registerCommandType("mothership", MothershipCommand.class, command -> + { + switch (command.getAction()) + { + case START: + if (Mothership.shouldStartEvent()) + { + runSync(this::startAnimation); + } + break; + + case CLEANUP: + runSync(this::stopAnimation); + break; + } + }); + + runAsync(() -> + { + if (Mothership.shouldStartEvent()) + { + runSync(this::startAnimation); + } + }); } public void startAnimation() { + if (_active) + { + return; + } + try { _schematic = UtilSchematic.loadSchematic(new File(SCHEMATIC_PATH)); @@ -176,11 +213,16 @@ public class AlienInvasion extends MiniPlugin public void sendPlayerToInstance(Player player) { - player.sendMessage("Imagine you are being sent to a game server, ooooo spooky"); + Mothership.addPlayer(player.getUniqueId(), () -> _serverManager.selectServer(player, "UFO")); } public void stopAnimation() { + if (!_active) + { + return; + } + _active = false; for (Block block : _ufoBlocks) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index e5f493b63..0e3db481e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -1,21 +1,13 @@ package nautilus.game.arcade.game.games.alieninvasion; -import mineplex.core.common.Pair; -import mineplex.core.common.util.*; -import mineplex.core.titles.tracks.Track; -import mineplex.core.titles.tracks.TrackManager; -import mineplex.core.titles.tracks.award.AlienInvasionTrack; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.utils.UtilVariant; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.SoloGame; -import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; -import nautilus.game.arcade.game.games.dragonescape.DragonScore; -import nautilus.game.arcade.game.modules.compass.CompassModule; -import nautilus.game.arcade.kit.Kit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; + import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -26,12 +18,34 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; -import java.util.*; -import java.util.Map.Entry; +import mineplex.core.common.Pair; +import mineplex.core.common.api.mothership.Mothership; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.titles.tracks.Track; +import mineplex.core.titles.tracks.TrackManager; +import mineplex.core.titles.tracks.award.AlienInvasionTrack; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; +import nautilus.game.arcade.game.games.dragonescape.DragonScore; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; public class AlienInvasion extends SoloGame { @@ -83,6 +97,15 @@ public class AlienInvasion extends SoloGame .register(this); } + @EventHandler + public void onJoin(AsyncPlayerPreLoginEvent event) + { + if (!Mothership.isWhitelisted(event.getUniqueId())) + { + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, "You must join by finding a UFO!"); + } + } + @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) From 5ae32de83cf0ac80cd61700cab1333d7c35a750c Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 23 May 2017 20:38:38 +0100 Subject: [PATCH 140/170] Reduce the cooldown from 6 to 3 seconds --- .../nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java index 0cf783f9a..e7c0ebbb2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java @@ -29,7 +29,7 @@ public class KitJumper extends ProgressingKit }; private static final Perk[] PERKS = { - new PerkDoubleJump("Double Jump", 1.2, 1.2, false, 6000, true), + new PerkDoubleJump("Double Jump", 1.2, 1.2, false, 3000, true), new PerkDummy("Feathered Boots", Collections.singletonList(C.cGray + "You take no fall damage.").toArray(new String[1])), new PerkCraftman() }; From fbd39092f8b51103634dcfd707f4b446a59c321a Mon Sep 17 00:00:00 2001 From: cnr Date: Thu, 25 May 2017 04:47:35 -0500 Subject: [PATCH 141/170] Add delay for should-start-invasion check --- .../src/mineplex/hub/modules/AlienInvasion.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 8ef447077..65edeb885 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -160,10 +160,13 @@ public class AlienInvasion extends MiniPlugin switch (command.getAction()) { case START: - if (Mothership.shouldStartEvent()) + runAsync(() -> { - runSync(this::startAnimation); - } + if (Mothership.shouldStartEvent()) + { + runSync(this::startAnimation); + } + }, 20L); break; case CLEANUP: From b46464babeea08c387b8a2e3294f3bbb7fb31029 Mon Sep 17 00:00:00 2001 From: cnr Date: Thu, 25 May 2017 22:42:04 -0500 Subject: [PATCH 142/170] Reduce UFO beam radius from 5 -> 3 blocks --- .../Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 65edeb885..2d510d969 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -338,7 +338,7 @@ public class AlienInvasion extends MiniPlugin for (Player player : Bukkit.getOnlinePlayers()) { - if (UtilMath.offsetSquared(player.getLocation(), _beam) > 25) + if (UtilMath.offsetSquared(player.getLocation(), _beam) > 9) { continue; } From 4a7ca75b242c36ad2ff1fe92fa39ecb1b3da887e Mon Sep 17 00:00:00 2001 From: cnr Date: Fri, 26 May 2017 18:08:24 -0500 Subject: [PATCH 143/170] Open UFO event for the weekend --- .../common/api/mothership/Mothership.java | 57 ------------------- .../mineplex/hub/modules/AlienInvasion.java | 32 +---------- .../games/alieninvasion/AlienInvasion.java | 11 ---- 3 files changed, 2 insertions(+), 98 deletions(-) delete mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java deleted file mode 100644 index 356a7a197..000000000 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/Mothership.java +++ /dev/null @@ -1,57 +0,0 @@ -package mineplex.core.common.api.mothership; - -import java.util.UUID; - -import org.bukkit.Bukkit; - -import mineplex.core.common.api.ApiHost; -import mineplex.core.common.api.ApiWebCall; -import mineplex.core.common.util.UtilServer; - -public class Mothership -{ - private static final ApiWebCall API_BASE = new ApiWebCall("http://" + ApiHost.getAPIHost("MOTHERSHIP").getHost() + ":" + ApiHost.getAPIHost("MOTHERSHIP").getPort() + "/"); - - public static void addPlayer(UUID uuid, Runnable afterward) - { - UtilServer.runAsync(() -> - { - Boolean response = API_BASE.get("addPlayer/" + uuid.toString(), Boolean.class); - if (response == null) - { - System.out.println("!!! Issue adding player to Mothership server !!!"); - } - UtilServer.runSync(afterward); - }); - } - - public static boolean isWhitelisted(UUID uuid) - { - if (Bukkit.isPrimaryThread()) - { - throw new IllegalStateException("This method MUST NOT be called from the main thread!"); - } - - Boolean response = API_BASE.get("getPlayer/" + uuid.toString(), Boolean.class); - if (response == null) - { - System.out.println("!!! Issue retrieving player whitelist status. Allowing them in anyway! !!!"); - } - return response == null || response; - } - - public static boolean shouldStartEvent() - { - if (Bukkit.isPrimaryThread()) - { - throw new IllegalStateException("This method MUST NOT be called from the main thread"); - } - - Boolean response = API_BASE.get("startEvent/" + UtilServer.getRegion().toString() + "/" + UtilServer.getServerName(), Boolean.class); - if (response == null) - { - System.out.println("!!! Issue checking whether server should start event. Keeping event disabled! !!!"); - } - return response != null && response; - } -} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 2d510d969..8e022d3fb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -33,8 +33,6 @@ import mineplex.core.blockrestore.BlockRestore; import mineplex.core.command.CommandBase; import mineplex.core.common.Pair; import mineplex.core.common.Rank; -import mineplex.core.common.api.mothership.Mothership; -import mineplex.core.common.api.mothership.MothershipCommand; import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.SchematicData; import mineplex.core.common.block.schematic.UtilSchematic; @@ -53,7 +51,6 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilVariant; import mineplex.hub.server.ServerManager; -import mineplex.serverdata.commands.ServerCommandManager; @ReflectivelyCreateMiniPlugin public class AlienInvasion extends MiniPlugin @@ -155,33 +152,8 @@ public class AlienInvasion extends MiniPlugin stopAnimation(); } }); - ServerCommandManager.getInstance().registerCommandType("mothership", MothershipCommand.class, command -> - { - switch (command.getAction()) - { - case START: - runAsync(() -> - { - if (Mothership.shouldStartEvent()) - { - runSync(this::startAnimation); - } - }, 20L); - break; - case CLEANUP: - runSync(this::stopAnimation); - break; - } - }); - - runAsync(() -> - { - if (Mothership.shouldStartEvent()) - { - runSync(this::startAnimation); - } - }); + startAnimation(); } public void startAnimation() @@ -216,7 +188,7 @@ public class AlienInvasion extends MiniPlugin public void sendPlayerToInstance(Player player) { - Mothership.addPlayer(player.getUniqueId(), () -> _serverManager.selectServer(player, "UFO")); + _serverManager.selectServer(player, "UFO"); } public void stopAnimation() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 0e3db481e..35739e898 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -18,13 +18,11 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.ItemSpawnEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; import mineplex.core.common.Pair; -import mineplex.core.common.api.mothership.Mothership; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAlg; @@ -97,15 +95,6 @@ public class AlienInvasion extends SoloGame .register(this); } - @EventHandler - public void onJoin(AsyncPlayerPreLoginEvent event) - { - if (!Mothership.isWhitelisted(event.getUniqueId())) - { - event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, "You must join by finding a UFO!"); - } - } - @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) From aa271a1bd36087f37dd1161c54ce0fe2579052ad Mon Sep 17 00:00:00 2001 From: cnr Date: Fri, 26 May 2017 18:20:27 -0500 Subject: [PATCH 144/170] Enable double XP + gems + shards for the weekend --- .../src/nautilus/game/arcade/game/Game.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 80329fe3f..5ee697db6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -256,7 +256,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed public long PrepareTime = 9000; public boolean PlaySoundGameStart = true; - public double XpMult = 1; + public double XpMult = 2; public boolean SpeedMeasurement = false; @@ -278,7 +278,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed // Gems public boolean CrownsEnabled = false; - public double GemMultiplier = 1; + public double GemMultiplier = 2; public boolean GemHunterEnabled = true; public boolean GemBoosterEnabled = true; public boolean GemDoubleEnabled = true; From e3f678d71d4f1c093e3ac2c98fcca488ebff1f7b Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 00:56:38 +0100 Subject: [PATCH 145/170] Bugs --- .../mineplex/core/achievement/Achievement.java | 2 +- .../arcade/game/games/alieninvasion/Alien.java | 2 +- .../game/games/alieninvasion/AlienInvasion.java | 16 +++++++++++++++- .../games/alieninvasion/PhaserProjectile.java | 8 +++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 46a50a3e4..3a08d170b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -66,7 +66,7 @@ public enum Achievement GLOBAL_ALIEN_INVASION("2017 Alien Hub Defender", 4000, new String[]{"Global.Alien Invasion 2017"}, - new String[]{"Kill 50 Aliens in the Lobby,", + new String[]{"Kill 300 Aliens in the Lobby,", "during the Alien Invasion event"}, new int[]{300}, AchievementCategory.HOLIDAY), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java index a4847c4eb..ffe7e847f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java @@ -42,7 +42,7 @@ public class Alien _stand.setPassenger(_skeleton); _stand.setRemoveWhenFarAway(false); - _skeleton.setMaxHealth(4); + _skeleton.setMaxHealth(3); _skeleton.setRemoveWhenFarAway(false); EntityEquipment equipment = _skeleton.getEquipment(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 0e3db481e..f2ce8350c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import nautilus.game.arcade.events.PlayerKitGiveEvent; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -20,6 +21,8 @@ import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; @@ -201,7 +204,6 @@ public class AlienInvasion extends SoloGame for (Player player : GetPlayers(true)) { - Manager.GetCondition().Factory().Invisible(GetName(), player, null, Integer.MAX_VALUE, 0, false, false, false); _score.add(new DragonScore(player, 0)); } @@ -222,6 +224,11 @@ public class AlienInvasion extends SoloGame _lastBeam = System.currentTimeMillis(); _nextBeam = 10000; + for (Player player : GetPlayers(true)) + { + player.sendMessage(F.main("Game", C.cYellow + "Double Tab Space to use your double jump!")); + } + ItemStack glass = new ItemStack(Material.GLASS); CreatureAllowOverride = true; @@ -240,6 +247,12 @@ public class AlienInvasion extends SoloGame CreatureAllowOverride = false; } + @EventHandler + public void invisibility(PlayerKitGiveEvent event) + { + Manager.GetCondition().Factory().Invisible(GetName(), event.getPlayer(), event.getPlayer(), 40, 0, false, false, false); + } + @EventHandler public void updateAliens(UpdateEvent event) { @@ -433,6 +446,7 @@ public class AlienInvasion extends SoloGame for (DragonScore score1 : _score) { + AddGems(score1.Player, score1.Score, "Map Progress", false, false); players.add(score1.Player); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java index 6190fc95e..d9ed703b8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -1,5 +1,7 @@ package nautilus.game.arcade.game.games.alieninvasion; +import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.common.util.F; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -22,6 +24,8 @@ import org.bukkit.util.Vector; public class PhaserProjectile implements Listener { + private static final int SHARDS_PER_HIT = 15; + private ArcadeManager _manager; private Projectile _projectile; @@ -60,13 +64,15 @@ public class PhaserProjectile implements Listener return; } + _manager.GetDonation().rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, damager, "Alien Hit", SHARDS_PER_HIT); damager.playSound(damager.getLocation(), Sound.CHICKEN_EGG_POP, 1, 0.7F); + damager.sendMessage(F.main("Game", "Hit an alien. +" + F.currency(GlobalCurrency.TREASURE_SHARD, SHARDS_PER_HIT) + ".")); } event.SetCancelled("Blaster Snowball"); UtilParticle.PlayParticle(ParticleType.CLOUD, projectile.getLocation(), 0.5F, 0.5F, 0.5F, 0.05F, 5, ViewDist.NORMAL); - _manager.GetDamage().NewDamageEvent(damagee, damager, projectile, DamageCause.CUSTOM, 4, false, true, true, UtilEnt.getName(damager), "Blaster"); + _manager.GetDamage().NewDamageEvent(damagee, damager, projectile, DamageCause.CUSTOM, 3, false, true, true, UtilEnt.getName(damager), "Blaster"); UtilServer.Unregister(this); } From 4d4988577e1c11c731e0435745079a37ac493140 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 01:01:16 +0100 Subject: [PATCH 146/170] Use a more sensible method of awarding shards --- .../arcade/game/games/alieninvasion/PhaserProjectile.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java index d9ed703b8..eee602a08 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -1,7 +1,5 @@ package nautilus.game.arcade.game.games.alieninvasion; -import mineplex.core.common.currency.GlobalCurrency; -import mineplex.core.common.util.F; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -64,9 +62,8 @@ public class PhaserProjectile implements Listener return; } - _manager.GetDonation().rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, damager, "Alien Hit", SHARDS_PER_HIT); + _manager.GetGame().AddGems(damager, SHARDS_PER_HIT, "Aliens Hit", false, true); damager.playSound(damager.getLocation(), Sound.CHICKEN_EGG_POP, 1, 0.7F); - damager.sendMessage(F.main("Game", "Hit an alien. +" + F.currency(GlobalCurrency.TREASURE_SHARD, SHARDS_PER_HIT) + ".")); } event.SetCancelled("Blaster Snowball"); From 27d92335666fce6450477107b3c35f034c945d72 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 01:05:02 +0100 Subject: [PATCH 147/170] While we're at it, change the easter egg achievement requirement --- .../src/mineplex/core/achievement/Achievement.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 3a08d170b..e9945effd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -59,9 +59,9 @@ public enum Achievement GLOBAL_EGG_HUNTER_2017("2017 Egg Hunter", 4000, new String[]{"Global.Easter Eggs 2017"}, - new String[]{"Find 200 Easter Egg Baskets,", + new String[]{"Find 35 Easter Egg Baskets,", "during Easter 2017"}, - new int[]{200}, + new int[]{35}, AchievementCategory.HOLIDAY), GLOBAL_ALIEN_INVASION("2017 Alien Hub Defender", 4000, From ffa2a736ec00a9d8a680f30eb5946c2d18eb9e9f Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 17:03:52 +0100 Subject: [PATCH 148/170] Give players an omega chest for completing the event --- .../game/games/alieninvasion/AlienInvasion.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 898f5490a..9d56c072a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -371,6 +371,19 @@ public class AlienInvasion extends SoloGame // Reward title if (score.Score == _path.size() - 1) { + Manager.getInventoryManager().addItemToInventory(success -> + { + if (success) + { + player.sendMessage(F.main("Game", "Unlocked 1 " + C.cAqua + "Omega Chest" + C.mBody + ".")); + } + else + { + player.sendMessage(F.main("Game", "Failed to give you your Omega Chest, you should inform a staff member!")); + } + + }, player, "Omega Chest", 1); + TrackManager trackManager = Manager.getTrackManager(); Track track = trackManager.getTrack(AlienInvasionTrack.class); From 5bdcd3474fcd8bd58659f3cbb21f31a4d94d363c Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 18:23:53 +0100 Subject: [PATCH 149/170] Only give the chest once --- .../games/alieninvasion/AlienInvasion.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 9d56c072a..541d02c34 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -70,6 +70,7 @@ public class AlienInvasion extends SoloGame return 0; }; + private static final String GAME_COMPLETED_STAT = "Alien Invasion Chest Given"; private final List _sources = new ArrayList<>(); private final List _targets = new ArrayList<>(); @@ -371,18 +372,23 @@ public class AlienInvasion extends SoloGame // Reward title if (score.Score == _path.size() - 1) { - Manager.getInventoryManager().addItemToInventory(success -> + if (Manager.GetStatsManager().Get(player).getStat(GAME_COMPLETED_STAT) > 0) { - if (success) - { - player.sendMessage(F.main("Game", "Unlocked 1 " + C.cAqua + "Omega Chest" + C.mBody + ".")); - } - else - { - player.sendMessage(F.main("Game", "Failed to give you your Omega Chest, you should inform a staff member!")); - } + Manager.GetStatsManager().incrementStat(player, GAME_COMPLETED_STAT, 1); - }, player, "Omega Chest", 1); + Manager.getInventoryManager().addItemToInventory(success -> + { + if (success) + { + player.sendMessage(F.main("Game", "Unlocked 1 " + C.cAqua + "Omega Chest" + C.mBody + ".")); + } + else + { + player.sendMessage(F.main("Game", "Failed to give you your Omega Chest, you should inform a staff member!")); + } + + }, player, "Omega Chest", 1); + } TrackManager trackManager = Manager.getTrackManager(); Track track = trackManager.getTrack(AlienInvasionTrack.class); From 18197de7be7536c6f4e3ae3ec63f69d430523a06 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 May 2017 18:24:51 +0100 Subject: [PATCH 150/170] Correct operator... --- .../game/arcade/game/games/alieninvasion/AlienInvasion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index 541d02c34..e061f2ff0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -372,7 +372,7 @@ public class AlienInvasion extends SoloGame // Reward title if (score.Score == _path.size() - 1) { - if (Manager.GetStatsManager().Get(player).getStat(GAME_COMPLETED_STAT) > 0) + if (Manager.GetStatsManager().Get(player).getStat(GAME_COMPLETED_STAT) == 0) { Manager.GetStatsManager().incrementStat(player, GAME_COMPLETED_STAT, 1); From e51818c15d88c1e5b2aad388c0c2722074068266 Mon Sep 17 00:00:00 2001 From: cnr Date: Sun, 28 May 2017 02:08:17 -0500 Subject: [PATCH 151/170] Reduce alien shard reward to 5 per hit and make lobbies nighttime --- .../game/games/alieninvasion/AlienInvasion.java | 11 ++++++++--- .../game/games/alieninvasion/PhaserProjectile.java | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java index e061f2ff0..a89a178f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -8,10 +8,11 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; -import nautilus.game.arcade.events.PlayerKitGiveEvent; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; @@ -20,8 +21,6 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Team; @@ -42,6 +41,7 @@ import mineplex.core.utils.UtilVariant; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerKitGiveEvent; import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; import nautilus.game.arcade.game.games.dragonescape.DragonScore; @@ -97,6 +97,11 @@ public class AlienInvasion extends SoloGame new CompassModule() .register(this); + + for (World world : Bukkit.getWorlds()) + { + world.setTime(18000); + } } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java index eee602a08..4d9c61e4b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -22,7 +22,7 @@ import org.bukkit.util.Vector; public class PhaserProjectile implements Listener { - private static final int SHARDS_PER_HIT = 15; + private static final int SHARDS_PER_HIT = 5; private ArcadeManager _manager; private Projectile _projectile; From f1bad41e89d1c3d3a5ba537e9e11f2be9ad0da11 Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 29 May 2017 22:44:54 -0500 Subject: [PATCH 152/170] Revert "Enable double XP + gems + shards for the weekend" This reverts commit aa271a1bd36087f37dd1161c54ce0fe2579052ad. --- .../src/nautilus/game/arcade/game/Game.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 5ee697db6..80329fe3f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -256,7 +256,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed public long PrepareTime = 9000; public boolean PlaySoundGameStart = true; - public double XpMult = 2; + public double XpMult = 1; public boolean SpeedMeasurement = false; @@ -278,7 +278,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed // Gems public boolean CrownsEnabled = false; - public double GemMultiplier = 2; + public double GemMultiplier = 1; public boolean GemHunterEnabled = true; public boolean GemBoosterEnabled = true; public boolean GemDoubleEnabled = true; From 1a59c050d313962f3b3907422be38773c3b2955c Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 29 May 2017 22:45:54 -0500 Subject: [PATCH 153/170] Disable Alien Invasion event --- Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 13f2ee2b0..a4b0a0b88 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -1,6 +1,5 @@ package mineplex.hub; -import mineplex.hub.modules.AlienInvasion; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -248,7 +247,6 @@ public class Hub extends JavaPlugin implements IRelation require(AprilFoolsTreasureHunt.class); } require(TwitchIntegrationFix.class); - require(AlienInvasion.class); } @Override From 2895397aecc475d299f5cd9171e05bb6f1167eeb Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 15:13:50 -0400 Subject: [PATCH 154/170] Implement CMA rank --- Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java index 8d5cd7db5..56c5a5e63 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java @@ -20,6 +20,7 @@ public enum Rank CMOD("C.Mod", "cmod", ChatColor.GOLD, "Clans Moderators are members of the Clans Management Senior Mod team. \nTheir duties include moderation and support within the Clans servers. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), EVENT_MODERATOR("Sr.Mod", "srmod_event", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), SNR_MODERATOR("Sr.Mod", "srmod", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), + CMA("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), MODERATOR("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), HELPER("Trainee", "train", ChatColor.GOLD, "Trainees are moderators-in-training. \nTheir duties include enforcing the rules and \nproviding help to anyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 24, DyeColor.ORANGE), MAPLEAD("MapLead", "mapl", ChatColor.BLUE, "Map Leaders are leaders of the Mineplex Build Team. \nThey oversee the creation of new maps and manage Builders.", 25, DyeColor.BLUE), From cd8e805435543f8c3951333c7a3bde8d844d31e6 Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 15:30:18 -0400 Subject: [PATCH 155/170] Give CMA access to unfreeze --- .../game/clans/clans/ban/commands/UnfreezeCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java index 7114d0e79..13e4aa098 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java @@ -16,7 +16,7 @@ public class UnfreezeCommand extends CommandBase { public UnfreezeCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "unfreeze"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "unfreeze"); } @Override @@ -41,4 +41,4 @@ public class UnfreezeCommand extends CommandBase Plugin.unfreeze(target, caller); } } -} \ No newline at end of file +} From 1adb4b8239eae251a7c64b9e13ac66b42446408c Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 15:31:30 -0400 Subject: [PATCH 156/170] Give cma access to freeze --- .../mineplex/game/clans/clans/ban/commands/FreezeCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java index fedad6275..1a75c70d7 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java @@ -16,7 +16,7 @@ public class FreezeCommand extends CommandBase { public FreezeCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "freeze"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "freeze"); } @Override @@ -41,4 +41,4 @@ public class FreezeCommand extends CommandBase Plugin.freeze(target, caller); } } -} \ No newline at end of file +} From 57f2f7b68679dba3099e103687f518828f3e683a Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 15:32:29 -0400 Subject: [PATCH 157/170] Give cma access to clans punishments --- .../mineplex/game/clans/clans/ban/commands/ClansBanCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java index 6cca5d188..3275072c5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java @@ -13,7 +13,7 @@ public class ClansBanCommand extends CommandBase { public ClansBanCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "cbans", "cb", "cban", "cp", "cpunish", "clanspunish", "clanpunish"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "cbans", "cb", "cban", "cp", "cpunish", "clanspunish", "clanpunish"); } @Override From f793539cc4125e032e004b93848c250cc163400c Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 15:37:59 -0400 Subject: [PATCH 158/170] Allow cma to see freeze/unfreeze information --- .../mineplex/game/clans/clans/ban/ClansBanManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java index 56c12bdec..8b3d18877 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java @@ -117,7 +117,7 @@ public class ClansBanManager extends MiniPlugin event.getPlayer().removePotionEffect(PotionEffectType.JUMP); for (Player staff : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(staff, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(staff, F.main(getName(), F.elem(event.getPlayer().getName()) + " has logged out while frozen!")); } @@ -266,7 +266,7 @@ public class ClansBanManager extends MiniPlugin player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 999999, -10)); for (Player alert : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(alert, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(alert, F.main(getName(), F.elem(player.getName()) + " has been frozen by " + F.elem(staff.getName()) + "!")); } @@ -287,7 +287,7 @@ public class ClansBanManager extends MiniPlugin player.removePotionEffect(PotionEffectType.JUMP); for (Player alert : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(alert, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(alert, F.main(getName(), F.elem(player.getName()) + " has been unfrozen by " + F.elem(staff.getName()) + "!")); continue; @@ -312,4 +312,4 @@ public class ClansBanManager extends MiniPlugin callback.run(target); } -} \ No newline at end of file +} From e50198271241cb7d30bf791ed1dadd9f72f2ba7a Mon Sep 17 00:00:00 2001 From: Alexander Meech Date: Wed, 24 May 2017 18:40:45 -0400 Subject: [PATCH 159/170] Update cma scoreboard id --- Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java index 56c5a5e63..6f4602a11 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java @@ -20,7 +20,7 @@ public enum Rank CMOD("C.Mod", "cmod", ChatColor.GOLD, "Clans Moderators are members of the Clans Management Senior Mod team. \nTheir duties include moderation and support within the Clans servers. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), EVENT_MODERATOR("Sr.Mod", "srmod_event", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), SNR_MODERATOR("Sr.Mod", "srmod", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), - CMA("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), + CMA("Mod", "cma", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), MODERATOR("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), HELPER("Trainee", "train", ChatColor.GOLD, "Trainees are moderators-in-training. \nTheir duties include enforcing the rules and \nproviding help to anyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 24, DyeColor.ORANGE), MAPLEAD("MapLead", "mapl", ChatColor.BLUE, "Map Leaders are leaders of the Mineplex Build Team. \nThey oversee the creation of new maps and manage Builders.", 25, DyeColor.BLUE), From b9af3a8dfb9156cf4b07588fcc54a3efc859f8fe Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 29 May 2017 22:49:01 -0500 Subject: [PATCH 160/170] Sort CMA in the tab list next to Mod --- Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java index 6f4602a11..43fdbacdc 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java @@ -20,7 +20,7 @@ public enum Rank CMOD("C.Mod", "cmod", ChatColor.GOLD, "Clans Moderators are members of the Clans Management Senior Mod team. \nTheir duties include moderation and support within the Clans servers. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), EVENT_MODERATOR("Sr.Mod", "srmod_event", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), SNR_MODERATOR("Sr.Mod", "srmod", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), - CMA("Mod", "cma", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), + CMA("Mod", "mod_cma", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), MODERATOR("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), HELPER("Trainee", "train", ChatColor.GOLD, "Trainees are moderators-in-training. \nTheir duties include enforcing the rules and \nproviding help to anyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 24, DyeColor.ORANGE), MAPLEAD("MapLead", "mapl", ChatColor.BLUE, "Map Leaders are leaders of the Mineplex Build Team. \nThey oversee the creation of new maps and manage Builders.", 25, DyeColor.BLUE), From 2fc423306b526f3b9481dd6c7b8d2a13f3e75f68 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sat, 27 May 2017 13:18:40 -0400 Subject: [PATCH 161/170] Add appropriate starter level for multi-tiered achievements with level names to fix incorrect array length --- .../core/achievement/Achievement.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index e9945effd..1d1dd47c4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -412,8 +412,8 @@ public enum Achievement new String[]{"Earn Kill Streak Rewards"}, new int[][]{new int[]{0, 50, 500}, new int[]{0, 100, 750}, new int[]{0, 150, 1000}, new int[]{0, 200, 1500}, new int[]{0, 400, 2000}, new int[]{0, 500, 2500}, new int[]{0, 1000, 3000}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4000}, new int[]{0, 5000, 100000}}, new int[]{10, 20, 50, 100, 200, 250, 500, 750, 1000, 2000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_FIRST_BLOOD("First Blood", 0, @@ -421,8 +421,8 @@ public enum Achievement new String[]{"Obtain the first kill in a Match"}, new int[][]{new int[]{0, 100, 100}, new int[]{0, 150, 200}, new int[]{0, 200, 300}, new int[]{0, 250, 400}, new int[]{0, 500, 500}}, new int[]{2, 5, 10, 25, 50}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_FIGHTER_KIT("Fighter", 0, @@ -430,8 +430,8 @@ public enum Achievement new String[]{"Kill opponents while wearing the Fighter Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_TANK_KIT("Tank", 0, @@ -439,8 +439,8 @@ public enum Achievement new String[]{"Kill opponents while wearing the Tank Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_ARCHER_KIT("Archer", 0, @@ -448,8 +448,8 @@ public enum Achievement new String[]{"Kill opponents while wearing the Archer Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_DEMOLITIONIST_KIT("Demolitionist", 0, @@ -457,8 +457,8 @@ public enum Achievement new String[]{"Kill opponents while wearing the Demolitionist Kit"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), CASTLE_ASSAULT_WINNER("Assault", 0, @@ -466,8 +466,8 @@ public enum Achievement new String[]{"Win games of Castle Assault"}, new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, new int[]{2, 5, 25, 50, 100, 150, 250, 500, 1000, 2000}, - "Novice I", - new String[]{"Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, AchievementCategory.CASTLE_ASSAULT), //Champions From 2c6112347a1dd5635f910f18ca23f296b8151d34 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 00:13:49 -0500 Subject: [PATCH 162/170] Add Bob Ross Morph --- .../mineplex/core/common/skin/SkinData.java | 1 + .../mineplex/core/gadget/GadgetManager.java | 2 + .../gadget/gadgets/morph/MorphBobRoss.java | 507 ++++++++++++++++++ 3 files changed, 510 insertions(+) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java index 55d6fd4ab..88dde15c3 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java @@ -67,6 +67,7 @@ public class SkinData public final static SkinData LEPRECHAUN = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODc4NzI5Mjg1ODIsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80ZTBkZjZhZGNiNzkzMzM5ZjFhOGNkM2E0ZGQ2ZThjNGQ2ZWFjYmU5NWMzZDA5OTI4NDMyMWFiZGI5MTgwOSJ9fX0=", "cyIYHTdzvVBOyYoiJZTvNS8Et5pzqBNxuz6GQspE2lBkW2Bj82JNv5oczsf3oxYAG4zxdb96G8+7UKBmoJdvx0x6UD7Dk0dnKrwpXfOhe+jRxtwMGMsdYCb8URWaoIoeKpxdCmAtjgV6FI8zDy2Yzi+MF4O9e4VqH0tMBoD2/CZScQwNEzc4YXf2M2fglKn9uK2+xrgLV+XS+SNdIn7BRiNlQf96u6N2G0lO+eb09LbIfIgAgfnyLiARccWa+VNo6gwlCFyRMnwOlgqxL5XA5Um4kkx2ZReRRCDFQ4NV5eLBktLd5wpECyOuY7v7S3zLqwbhwG47gS8hnXqmtHG5RW0RUQZEryg638Cw7hwr2k09iStfok8WeZUIJ+fuUWgdArvbtN36a2pCXyFdqzp+E8xzSF4E9SQv0K+1lNj+w4L58dh8pddeKK8m5bpjINj4xZ6nf7reWYQAX/imVNYTXTW8JqYnF+++xViBwmfeeM3PmEg+wyTduh+M25nyhGcqn5l+UyQ9aMzzdNs2aEdx12fOm1sOFXjHrHWeo6ciEm7sY1SDjiJ99VVXuGHCJWBtxq/B+c+vC/Cj8itEYOetwe5NKrgI99pZjG+KiRr4L0n8/NA3Px7SbKUUpHse80pNMjGfFW4pAOyFXJaKHrObWT2iL2AnTe+yfdY4sf/JZT4="); public final static SkinData BUGS_BUNNY = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTA0NzE5MDU2MTgsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84MmUyMjRkMGJkZGJmNjRiODIzMmUxNWRhNGRkN2NjN2NiYTYzM2NiODkyMTFhYjVjNDRhODU0ZjM1NDhlZWRiIn19fQ==", "QtM7YGNpqGcTnlUCTtQsQIEc8VGvL8cxWzAvN4LjYZrY4Fv15ysEVSPWPmRL/FJTRyUFCrJFO/0miVbuIEsGyUnsgHJAr9qkeyMvfD3+pZtKU1FkS58VNQkL/YaPDms7XPy1BPNo+ynQnVevdVCNDOvs2244Px3UljtuReBteKqL8QGMR1K6FFCQuKKvcvYsljdM8RV91r2yuT9UDxnzMRghWyRZuthvCeGL85g1LQxCnzJ0NUqIqCDrTWa8jeuncLnmRooKZYGsQjCAVOSFRk4KytD+fv8xgNK2igqBgVcqAINl5IjrFt7yyPQ2FVBbshETsjewusa6eZSBoy1Lc17G7bcndoOdwGMuztLjHPMzxFpIV1RkbZrngjcSTE/IQdSw79NlzMOEMKjE/34M7xcSnSZA1xwW33g+/xq+pNbqcXu85e7VXkziWDhHREp9ITT4YjrVdrss1yfYBzZgRmmLyaMpVmVsecKB9adpuZkhGzKIVrQHDGYEHoqoRnsRGJREdZQPxaSWp4+DSxpV/0oJXJWDz+XFztbcVbBcjBOD9kpFP0s+R5t1WA2B+jsf9J3LdsUUDbBiWikBwbAXKhHxTWWKv6OZLZovhgvGnW2lXQsHglEKuD7jE/mnFj4SF2qRO2N37AUjaG8AGQtTVhxW5JneIiBA0dbKIk06yoY="); public final static SkinData SLENDERMAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTA0NzUyNzk4NTUsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hMWNkOTI5OTFmYTRjZGQ2MGVlZDNhZTM3ZmI5NWRmZjFkNWNkOGNiZmYwYWFjMzE4MmQ0ODU2NDU5NTIzYyJ9fX0=", "OVqWFLCekyZcdGli6kPBKNh8/VYPhKZGNqlAvSOKc3RLgh4pIkI6TDPr/Y+VQdhz1wZozARFYSeoDJJJ4nZTi7gi3rVPG2rL1ZnKo7so5hdT8caEzSTRmgwPKzo03ZhEEsW9AEJo9mpiUxGSJdBlgEb9UgodpYFW1IjRC09CcBUqzRWP8QGZTSFSN5x9emQ97DyiFmt0NFWubHCKHdb7CExhchPRtbahL3hOEzPY8/Y+Irl9OZjx7jONE7O/sYItCuZoXc3FaTgCV0riiXHCgH2eA54s5TQVWumtp3FU7VIcKR6pm/o61+GusvqhNgdFNk9XSHWMUyp+HNU0R8sConZQN/eaVx9laJmUUb4zNZ7hX/hLYV+r9LFU1NXOeIZWJPShD+bYfZgEorIpD+EAL4BHht/f5e6a1IZUDBWb001PFibby2t9WWjoDVKz4McbxZ2Xui7EHKFG1K3biPibhWx6fvnOeJ2xW6UDIZcD+TCXwlW/knkFt44Xpyv3oNHk3UNkyrQgghd6qkc3gZHxP8PQCNvKIyK1I+pHR6JMZvSStp7ZQRDpvsvIUyOJvq+7Bs7lFYs8hcJHMzEB+8PYlH2k7P7iLuA6ZYFUmvOW1LLq0+hvxK96ZdNEsJdmMkVVTZBRw7vsZ4GPbkdp2cMOFH2lHcQj80xKqVbd43IqFDA="); + public final static SkinData BOB_ROSS = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTU2NjEyOTc2NTcsInByb2ZpbGVJZCI6IjdkYTJhYjNhOTNjYTQ4ZWU4MzA0OGFmYzNiODBlNjhlIiwicHJvZmlsZU5hbWUiOiJHb2xkYXBmZWwiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVhNzZhN2NlMzZlZGRiYmZhNWMzMmJhZmVhYmUyNmQ3ZWJlNWRlOTBkNzYyYzJmNWY3OTQ1ZTQ1ODUxOTU2ZDYifX19", "b7pUQSZ1UkMZJNSqdaBPGWfm+rfvFkEh58pBvYTG2RBPwVju1kKinb1LfsyYhFKlyPvL1jfqi30udmb0302QvE0SKg7p3txxULa3Hr94+eCJWFxrOxUNorRT9E+TurJxH6jimu6KW1p6goPn77/kgNaWb9xn3+E84+vH0z9ETjgc5G0aYLT+cSzThUorhvOQ7DRLfRgSWiFxfm3Er0g+waLfDEeNNAd6OJ5k3X+kgM/+V6QTIFofnZZ6NdZZInTARAVol2H0pRfQfAuVYfJyVyvA0uF+ZX+wlMuBTG1MeyWjZgI1iUKmGaQADXsAV796kT+Z+tAXpbRYYYZnxil5jx5P4druiHvaQfV2KK3lbKm2uH9M3SZr5d57C3V24BKRRWGS4C9INzgO8ORIIomes7kp0gECS4MnSMI6hcl0JsXVlaAy88BgmT/PKxM+3q4PCQE1N9fTCuhoil7vVYIU3uBXwFUE7NTAOUdBee+3TtMstIu2WP8rtEZBVpGH9CmomaLTCzPZSdXGY31goOFXSRYMNi8j4ykuBgP0qJqimipWH0rBF1bMdHqMu359h62tTLRKipHWXPxj4N8c/n1CVPYjuXH9X3f1HAU4DnET+v93Vb/uzbx8rXFrz6jLPwAjSlJ8Th3VE+4ey/ZBHWPB+SuHetN+e0r/LYxiqwwlnwI="); // Comments this out for now, so it doesn't load the player profile // A better way to do this would check for the properties when getting the skull or the skin diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index e35168a9b..e0d211e34 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.UUID; import java.util.function.Predicate; +import mineplex.core.gadget.gadgets.morph.MorphBobRoss; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -454,6 +455,7 @@ public class GadgetManager extends MiniPlugin addGadget(new MorphLoveDoctor(this)); addGadget(new MorphGoldPot(this)); addGadget(new MorphAwkwardRabbit(this)); + addGadget(new MorphBobRoss(this, _hologramManager)); // Particles addGadget(new ParticleFoot(this)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java new file mode 100644 index 000000000..57735951c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -0,0 +1,507 @@ +package mineplex.core.gadget.gadgets.morph; + +import java.time.Month; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; +import mineplex.core.hologram.Hologram; +import mineplex.core.hologram.HologramManager; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.ItemStack; + +import com.mojang.authlib.GameProfile; + +import mineplex.core.common.skin.SkinData; +import mineplex.core.disguise.disguises.DisguisePlayer; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.morph.managers.UtilMorph; +import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilGameProfile; + +/** + * Bob Ross morph for Power Play Club (June 2017) + */ +public class MorphBobRoss extends MorphGadget +{ + /** The inventory slot in which the paint brush is placed */ + private static final int PAINT_BRUSH_SLOT = 2; + + /** Max # of blocks that can be destroyed every half second */ + private static final int DESTROY_LIMIT = 20; + + /** The # of minutes for which paint blocks exist */ + private static final int PAINT_MINUTES = 1; + + /** Likelihood that a quote will be shown above a player every certain number of seconds */ + private static final double QUOTE_CHANCE = 0.03; + + /** Height above a player's location at which quotes are to be displayed */ + private static final double QUOTE_HEIGHT = 2.12; + + /** The number of seconds for which quotes are displayed */ + private static final int QUOTE_PERSISTENCE = 9; + + /** Quote attribution for bob */ + private static final String ATTRIBUTION = C.cGray + "- " + C.cYellow + "Bob Ross"; + + /** Cooldown key for changing paint colors */ + private static final String COLOR_KEY = "Change Paint Color"; + + /** Cooldown key for cleaning and putting paint on the brush */ + private static final String PAINT_KEY = "Beat The Devil Out Of It"; + + /** List of wholesome Bob Ross quotes. */ + private static final String[][] QUOTES = { + {"We don't make mistakes,", "just happy little accidents."}, + {"Anything that you're willing to practice,", "you can do."}, + {"There's nothing wrong with having a tree as a friend."}, + {"Let's get a little crazy here!"}, + {"Express yourself to others through painting."}, + {"All you need to paint is a few tools,", "a little instruction,", "and a vision in your mind."}, + {"I can't think of anything more", "rewarding than being able to express", "yourself to others through painting."}, + {"The secret to doing anything is", "believing that you can do it."}, + {"Anything that you believe you can do strong enough,", "you can do."}, + {"Wash the brush, just beat the devil out of it!"}, + {"Beat the devil out of it!"}, + {"I started painting as a hobby when I was little."}, + {"Anybody can do what I do."}, + {"I believe talent is just a pursued interest."}, + {"Mix up a little more shadow color here,", "then we can put us a little shadow right in there."}, + {"You have unlimited power on this canvas!"}, + {"Believe that you can do it cause you can do it."}, + {"There's nothing in the world", "that breeds success like success."}, + {"Lets build a happy little cloud."}, + {"Lets build some happy little trees."}, + {"Everyday is a good day when you paint."}, + {"The only thing worse than", "yellow snow is green snow."}, + {"Look around.", "Look at what we have.", "Beauty is everywhere—", "you only have to look to see it."}, + {"Just go out and talk to a tree.", "Make friends with it."}, + {"How do you make a round circle with a square knife? That’s your challenge for the day."}, + {"Water's like me. It's laaazy...", "Boy, it always looks for the easiest way to do things"}, + {"Oooh, if you have never been to Alaska,", "go there while it is still wild."}, + {"If I paint something,", "I don't want to have to explain what it is."}, + {"We artists are a different breed of people.", "We're a happy bunch."}, + {"Any way you want it to be, that's just right."}, + {"As my son Steve says, just 'smoosh' it in there."}, + {"Use odorless paint-thinner.", "If it's not odorless, you'll find yourself", "working alone very, very quickly."}, + {"Let's just blend this little rascal here, ha!", "Happy as we can be."}, + {"Clouds are very, very free."}, + {"Maybe in our world there lives a", "happy little tree over there."}, + {"Shwooop! Hehe.", "You have to make those little noises,", "or it just doesn't work."}, + {"No pressure. Just relax and watch it happen."}, + {"Find freedom on this canvas."}, + {"It’s so important to do something every", "day that will make you happy."}, + {"Every day is a good day when you paint."}, + {"Hi, I'm Bob Ross!"}, + {"Everyone needs a friend."}, + {"Don’t forget to tell these special", "people in your life just how special", "they are to you."}, + {"I taught my son to paint mountains like these!"}, + {"You need the dark in order to show the light."}, + {"In nature, dead trees are just", "as normal as live trees."}, + {"This is happy place;", "little squirrels live here and play."}, + {"It’s life.", "It’s interesting.", "It’s fun."}, + {"I really believe that", "if you practice enough you could paint the", "'Mona Lisa' with a two-inch brush."}, + {"Don't be afraid to go out on a limb,", "because that's where the fruit is!"} + }; + + /** Map of items in players' inventories */ + private final Map _inventoryItems = new HashMap<>(); + + /** Blocks that have been painted */ + private final List _paintBlocks = new ArrayList<>(); + + private final HologramManager _holograms; + + public MorphBobRoss(GadgetManager manager, HologramManager holograms) + { + super(manager, "Bob Ross Morph", UtilText.splitLinesToArray(new String[] { + C.cGray + "Become the creator of your own world!", + C.cGray + "Leave a trail of paint behind you as you walk.", + "", + C.cGreen + "Right click " + C.cWhite + "on your " + C.cYellow + "Paintbrush" + C.cWhite + " (stick) to paint", + "", + C.cGreen + "Right click " + C.cWhite + "on your " + C.cYellow + "Paint" + C.cWhite + " (dyes) to stop painting", + "", + C.cGreen + "Left click " + C.cWhite + "on your " + C.cYellow + "Paint " + C.cWhite + "to change paintbrush colors.", + + }, LineFormat.LORE), -14, Material.PAINTING, (byte) 0, YearMonth.of(2017, Month.JUNE)); + + _holograms = holograms; + } + + /** + * Sets the player's skin to Bob Ross, then gives the player a 'paintbrush' item. + */ + @Override + public void enableCustom(Player player, boolean message) + { + applyArmor(player, message); + + GameProfile profile = UtilGameProfile.getGameProfile(player); + profile.getProperties().clear(); + profile.getProperties().put("textures", SkinData.BOB_ROSS.getProperty()); + + DisguisePlayer disguisePlayer = new DisguisePlayer(player, profile); + disguisePlayer.showInTabList(true, 0); + UtilMorph.disguise(player, disguisePlayer, Manager); + + givePaintbrush(player); + } + + /** + * Restores the player's skin and takes their 'paintbrush' item away. + */ + @Override + public void disableCustom(Player player, boolean message) + { + removeArmor(player); + UtilMorph.undisguise(player, Manager.getDisguiseManager()); + + takePaintbrush(player); + } + + /** + * Detect when a player clicks their paint brush item. + */ + @EventHandler + public void handlePlayerInteract(PlayerInteractEvent event) + { + if (!isActive(event.getPlayer())) + { + return; + } + + if (!_inventoryItems.containsKey(event.getPlayer().getUniqueId())) + { + return; + } + + if (!_inventoryItems.get(event.getPlayer().getUniqueId()).equals(event.getPlayer().getItemInHand())) + { + return; + } + + if (UtilEvent.isAction(event, UtilEvent.ActionType.L)) + { + if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, 220, false, false)) + { + changePaintColor(event.getPlayer()); + } + } + else if (UtilEvent.isAction(event, UtilEvent.ActionType.R)) + { + if (Recharge.Instance.use(event.getPlayer(), PAINT_KEY, 1000, false, false)) + { + togglePainting(event.getPlayer()); + } + } + } + + /** + * Randomly display a Bob Ross quote above morphed players' heads. + * Destroy old paint after a certain amount of time has elapsed. + */ + @EventHandler + public void updateEvent(UpdateEvent event) + { + if (event.getType() == UpdateType.FASTER) // do paint removal + { + int limit = 0; + + // destroy up to 20 paint blocks that are older than a set number of minutes + while (!_paintBlocks.isEmpty() + && _paintBlocks.get(0).time < System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(PAINT_MINUTES) + && limit < DESTROY_LIMIT) + { + Block block = _paintBlocks.remove(0).block; + + if (block.getType() == Material.CARPET) + { + block.setType(Material.AIR); + } + + limit++; + } + } + else if (event.getType() == UpdateType.SEC_30) // do random quote displaying + { + for (Player player : getActive()) + { + if (Math.random() >= QUOTE_CHANCE) + { + // select quote + String[] quote = QUOTES[ThreadLocalRandom.current().nextInt(0, QUOTES.length)]; + final Collection holograms = new ArrayList<>(); + + // add attribution + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT, 0), ATTRIBUTION)); + + // display the quote + double offset = 0.3; + for (int i = quote.length - 1; i >= 0; --i) + { + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT + offset, 0), + C.cWhite + quote[i])); + offset += 0.25; + } + + for (Hologram hologram : holograms) + { + hologram.setViewDistance(18); + hologram.setFollowEntity(player); + hologram.start(); + } + + // remove hologram a certain number of seconds later + Bukkit.getServer().getScheduler().runTaskLater(UtilServer.getPlugin(), () -> + holograms.forEach(Hologram::stop), QUOTE_PERSISTENCE * 20); + } + } + } + } + + /** + * When a player moves, paint the ground below them if they have it enabled. + */ + @EventHandler + public void paintGround(PlayerMoveEvent event) + { + Player player = event.getPlayer(); + + if (!isActive(player)) + { + return; + } + + // check if the player has been issued a paintbrush + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.get(player.getUniqueId()); + + if (item.getType() == Material.STICK) + { + return; // player is not painting, do nothing + } + + Block block = player.getLocation().getBlock(); + Material down = block.getRelative(BlockFace.DOWN).getType(); + + boolean carpet = block.getType() == Material.CARPET; + + // check that there is room to paint and that the block below is solid and not more paint. + if ((block.isEmpty() || carpet) && down.isSolid() && down != Material.CARPET) + { + int index; + PaintedBlock blk = new PaintedBlock(block); + + if (carpet) // if block is a carpet + { + // remove old paint if it was painted + if ((index = _paintBlocks.indexOf(blk)) != -1) + { + _paintBlocks.remove(index); + } + else // if it's non-paint carpet + { + return; // don't paint + } + } + + // mark block as painted + _paintBlocks.add(blk); + + // actually paint block + block.setType(Material.CARPET); + block.setData((byte) (15 - item.getData().getData())); + } + } + } + + /** + * Cycle the selected paint color for a player. + */ + private void changePaintColor(Player player) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + byte data = item.getData().getData(); + data++; + if (data > 15) data = 0; + ItemStack newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, getPaintColor(data) + " Paintbrush"); + _inventoryItems.put(player.getUniqueId(), newItem); + player.getInventory().remove(item); + player.getInventory().setItem(PAINT_BRUSH_SLOT, newItem); + player.updateInventory(); + } + + /** + * Toggle whether a player is currently painting or not. + */ + private void togglePainting(Player player) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + + ItemStack newItem; + if (item.getType() == Material.STICK) + { + byte data = ((byte) ThreadLocalRandom.current().nextInt(0, 16)); + newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, getPaintColor(data) + " Paintbrush"); + } + else + { + newItem = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, "Clean Paintbrush"); + } + + _inventoryItems.put(player.getUniqueId(), newItem); + player.getInventory().remove(item); + player.getInventory().setItem(PAINT_BRUSH_SLOT, newItem); + player.updateInventory(); + } + + /** + * Give a paintbrush item to a player. + */ + private void givePaintbrush(Player player) + { + if (!_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, "Clean Paintbrush"); + player.getInventory().setItem(PAINT_BRUSH_SLOT, item); + _inventoryItems.put(player.getUniqueId(), item); + player.updateInventory(); + } + } + + /** + * Take the paintbrush item from the player + */ + private void takePaintbrush(Player player) + { + // check that paintbrush has been issued + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + + // if player has paintbrush, take it + if (player.getInventory().contains(item)) + { + player.getInventory().remove(item); + } + + player.updateInventory(); + } + } + + /** + * Returns a paint color name base mainly on Bob Ross's common color selections, + * and on standard paint color names when the former is not available. + * + * @param color The data value of the dye for which to get a name. + * + * @return A string with a paint name + */ + private String getPaintColor(byte color) + { + switch(color) + { + case 0: + return "Midnight Black"; + case 1: + return "Alizarin Crimson"; + case 2: + return "Sap Green"; + case 3: + return "Van Dyke Brown"; + case 4: + return "Prussian Blue"; + case 5: + return "Studio Purple"; + case 6: + return "Phthalo Green"; + case 7: + return "Dusty Gray"; + case 8: + return "Tundora Gray"; + case 9: + return "Soft Flower Pink"; + case 10: + return "Lima Green"; + case 11: + return "Cadmium Yellow"; + case 12: + return "Danube Blue"; + case 13: + return "Soft Magenta"; + case 14: + return "Yellow Ochre"; + case 15: + return "Titanium White"; + default: + return "Mystery"; + + } + } + + /** + * Data class holding information on blocks which have been painted + */ + private class PaintedBlock + { + /** The time at which the block was painted */ + long time; + + /** The block which was painted */ + Block block; + + /** + * Construct a PaintedBlock + * + * @param block The block which has been painted. + */ + public PaintedBlock(Block block) + { + this.block = block; + this.time = System.currentTimeMillis(); + } + + /** + * Overrides default equals behavior to have comparisons between + * multiple {@link PaintedBlock} objects match comparisons between + * their contained {@link PaintedBlock#block} fields. + */ + @Override + public boolean equals(Object o) + { + if (o instanceof PaintedBlock) + { + return block.equals(((PaintedBlock) o).block); + } + else + { + return super.equals(o); + } + } + } +} From 7baf3bad30e886c30443f68b88d644cd6e462120 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 16:14:48 -0500 Subject: [PATCH 163/170] Clean up Hologram class code --- .../src/mineplex/core/hologram/Hologram.java | 435 +++++++++++++----- 1 file changed, 325 insertions(+), 110 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index f873ea35c..56b4b6cb3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -24,13 +24,13 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilPlayer; +/** + * Floating text object with interaction and entity follow capabilities. + */ public class Hologram { - public enum HologramTarget { - BLACKLIST, WHITELIST; - } - private Packet _destroy1_8; + /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ @@ -38,6 +38,7 @@ public class Hologram { private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; + /** * Keeps track of the holograms movements. This fixes offset that * occasionally happens when moving a hologram around. @@ -60,15 +61,42 @@ public class Hologram { private long _maxLifetime = -1; private long _startTime; - public Hologram(HologramManager hologramManager, Location location, String... text) { + /** + * Construct a standard hologram. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, String... text) + { this(hologramManager, location, false, -1l, text); } - public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) { + /** + * Construct a hologram with a specified bounding box. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param hideBoundingBox Whether to hide the bounding box of the hologram. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) + { this(hologramManager, location, hideBoundingBox, -1l, text); } - public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, long maxLifetime, String... text) { + /** + * Construct a hologram with a limited lifetime. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param hideBoundingBox Whether to hide the bounding box of the hologram. + * @param maxLifetime The max lifetime of the hologram, specified in milliseconds. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, long maxLifetime, String... text) + { _hologramManager = hologramManager; _location = location.clone(); _maxLifetime = maxLifetime; @@ -76,9 +104,16 @@ public class Hologram { setText(text); } - public Hologram setInteraction(HologramInteraction interact) { + /** + * Set the interaction handler for the hologram. + * + * @param interact The handler. + * + * @return the original hologram object. + */ + public Hologram setInteraction(HologramInteraction interact) + { _interaction = interact; - return this; } @@ -89,37 +124,50 @@ public class Hologram { /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ - public Hologram addPlayer(Player player) { + public Hologram addPlayer(Player player) + { return addPlayer(player.getUniqueId()); } /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ - public Hologram addPlayer(UUID player) { + public Hologram addPlayer(UUID player) + { _playersInList.add(player); return this; } /** - * Warning! Bounding box if hidden will hide holograms for 1.8 to 1.8.2 + * Hides the bounding box for the hologram.
+ * + * Warning! Bounding box if hidden will hide holograms for 1.8 to 1.8.2 * - * @return + * @return the original hologram object. */ - public Hologram setHideBoundingBox() { + public Hologram setHideBoundingBox() + { _hideBoundingBox = true; return this; } /** - * Is there a player entry in the hologram for Whitelist and Blacklist + * @return if there is a player entry in the holograms whitelist/blacklist. */ - public boolean containsPlayer(Player player) { + public boolean containsPlayer(Player player) + { return _playersInList.contains(player.getUniqueId()); } - protected Packet getDestroyPacket() { - if (_makeDestroyPackets) { + /** + * Generates a packet to destroy the hologram client-side. + * + * @return the packet. + */ + protected Packet getDestroyPacket() + { + if (_makeDestroyPackets) + { makeDestroyPacket(); _makeDestroyPackets = false; } @@ -127,32 +175,44 @@ public class Hologram { return _destroy1_8; } - public Entity getEntityFollowing() { + /** + * @return the entity that this hologram is currently following. + */ + public Entity getEntityFollowing() + { return _followEntity; } /** - * Get who can see the hologram - * - * @Whitelist = Only people added can see the hologram - * @Blacklist = Anyone but people added can see the hologram + * @return The functionality that is currently being used for the object's internal + * player list. + * {@link HologramTarget#WHITELIST} = Only people added can see the hologram + * {@link HologramTarget#BLACKLIST} = Anyone but people added can see the hologram */ - public HologramTarget getHologramTarget() { + public HologramTarget getHologramTarget() + { return _target; } /** - * Get the hologram location + * @return the current location of the hologram. */ - public Location getLocation() { + public Location getLocation() + { return _location.clone(); } - protected ArrayList getNearbyPlayers() { - ArrayList nearbyPlayers = new ArrayList(); + /** + * @return A list of players that can currently see the hologram. + */ + protected ArrayList getNearbyPlayers() + { + ArrayList nearbyPlayers = new ArrayList<>(); - for (Player player : getLocation().getWorld().getPlayers()) { - if (isVisible(player)) { + for (Player player : getLocation().getWorld().getPlayers()) + { + if (isVisible(player)) + { nearbyPlayers.add(player); } } @@ -160,26 +220,37 @@ public class Hologram { return nearbyPlayers; } - protected ArrayList getPlayersTracking() { + /** + * @return The list of players that are in the holograms whitelist or blacklist. + */ + protected ArrayList getPlayersTracking() + { return _playersTracking; } - protected void checkSpawnPackets() { - if (_makeSpawnPackets) { + /** + * Generates hologram spawn packets if they have not been created already. + */ + protected void checkSpawnPackets() + { + if (_makeSpawnPackets) + { makeSpawnPackets(); _makeSpawnPackets = false; } } /** - * Get the text in the hologram + * @return the current text being displayed by the hologram. */ - public String[] getText() { + public String[] getText() + { // We reverse it again as the hologram would otherwise display the text // from the bottom row to the top row String[] reversed = new String[_hologramText.length]; - for (int i = 0; i < reversed.length; i++) { + for (int i = 0; i < reversed.length; i++) + { reversed[i] = _hologramText[reversed.length - (i + 1)]; } @@ -187,27 +258,45 @@ public class Hologram { } /** - * Get the view distance the hologram is viewable from. Default is 70 + * @return the view distance the hologram is viewable from. Default is 70 */ - public int getViewDistance() { + public int getViewDistance() + { return _viewDistance; } /** - * Is the hologram holograming? + * @return Is the hologram holograming? */ - public boolean isInUse() { + public boolean isInUse() + { return _lastMovement != null; } - public boolean isRemoveOnEntityDeath() { + /** + * @return whether to delete the hologram when the entity it is following dies. + */ + public boolean isRemoveOnEntityDeath() + { return _removeEntityDeath; } - public boolean isVisible(Player player) { - if (getLocation().getWorld() == player.getWorld()) { - if ((getHologramTarget() == HologramTarget.WHITELIST) == containsPlayer(player)) { - if (getLocation().distance(player.getLocation()) < getViewDistance()) { + /** + * Determines whether the hologram is visible to a player based on view distance, whitelist / + * blacklist, and current world. + * + * @param player The player to check. + * + * @return whether the hologram is visible to the player. + */ + public boolean isVisible(Player player) + { + if (getLocation().getWorld() == player.getWorld()) + { + if ((getHologramTarget() == HologramTarget.WHITELIST) == containsPlayer(player)) + { + if (getLocation().distance(player.getLocation()) < getViewDistance()) + { return true; } } @@ -216,34 +305,49 @@ public class Hologram { return false; } - private void makeDestroyPacket() { + /** + * Generates a packet to destroy the hologram client-side. + */ + private void makeDestroyPacket() + { int[] entityIds1_8 = new int[_entityIds.size()]; - for (int i = 0; i < _entityIds.size(); i++) { + for (int i = 0; i < _entityIds.size(); i++) + { entityIds1_8[i] = _entityIds.get(i); } _destroy1_8 = new PacketPlayOutEntityDestroy(entityIds1_8); } - private void makeSpawnPackets() { + /** + * Generates spawn packets for the hologram. + */ + private void makeSpawnPackets() + { _packets1_8 = new Packet[_hologramText.length]; _packets1_9 = new Packet[_hologramText.length]; - if (_entityIds.size() < _hologramText.length) { + if (_entityIds.size() < _hologramText.length) + { _makeDestroyPackets = true; - for (int i = _entityIds.size(); i < _hologramText.length; i++) { + for (int i = _entityIds.size(); i < _hologramText.length; i++) + { _entityIds.add(Integer.valueOf(UtilEnt.getNewEntityId())); } - } else { + } + else + { _makeDestroyPackets = true; - while (_entityIds.size() > _hologramText.length) { + while (_entityIds.size() > _hologramText.length) + { _entityIds.remove(_hologramText.length); } } - for (int textRow = 0; textRow < _hologramText.length; textRow++) { + for (int textRow = 0; textRow < _hologramText.length; textRow++) + { PacketPlayOutSpawnEntityLiving packet1_8 = makeSpawnPacket1_8(textRow, _entityIds.get(textRow), _hologramText[textRow]); PacketPlayOutSpawnEntityLiving packet1_9 = makeSpawnPacket1_9(textRow, _entityIds.get(textRow), _hologramText[textRow]); @@ -253,7 +357,7 @@ public class Hologram { } /** - * Used for sending 1.9 clients holograms with no bounding boxes + * Used for sending 1.9 clients holograms with no bounding boxes. */ private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_9(int textRow, int entityId, String lineOfText) { @@ -269,7 +373,11 @@ public class Hologram { return packet; } - private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_8(int textRow, int entityId, String lineOfText) { + /** + * Used for sending 1.8 clients holograms. + */ + private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_8(int textRow, int entityId, String lineOfText) + { PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving(); DataWatcher watcher = new DataWatcher(null); @@ -290,41 +398,54 @@ public class Hologram { } /** - * Removes the player from the Hologram so they are no longer effected by - * Whitelist or Blacklist + * Removes a player from the Hologram so they are no longer effected by + * whitelist or blacklist. + * + * @param player The player to remove. + * + * @return the original hologram object. */ - public Hologram removePlayer(Player player) { + public Hologram removePlayer(Player player) + { return removePlayer(player.getUniqueId()); } /** * Removes the player from the Hologram so they are no longer effected by - * Whitelist or Blacklist + * whitelist or blacklist + * + * @param player The player to remove. + * + * @return the original hologram object. */ - public Hologram removePlayer(UUID player) { + public Hologram removePlayer(UUID player) + { _playersInList.remove(player); return this; } /** - * If the entity moves, the hologram will update its position to appear - * relative to the movement. - * - * @Please note the hologram updates every tick. + * Sets an entity to which the hologram will remain relative to in position. + * + * @param entityToFollow the entity which to follow. + * + * @return the original hologram object. */ public Hologram setFollowEntity(Entity entityToFollow) { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null - : _location.clone().subtract(entityToFollow.getLocation()).toVector(); + relativeToEntity = entityToFollow == null ? null : _location.clone().subtract(entityToFollow.getLocation()).toVector(); return this; } /** - * Set who can see the hologram - * - * @Whitelist = Only people added can see the hologram - * @Blacklist = Anyone but people added can see the hologram + * Set how the hologram's internal player list is used. + * + * @param newTarget The target which defines how the list is used. + * {@link HologramTarget#WHITELIST} = Only people added can see the hologram + * {@link HologramTarget#BLACKLIST} = Anyone but people added can see the hologram + * + * @retuen the original hologram object. */ public Hologram setHologramTarget(HologramTarget newTarget) { _target = newTarget; @@ -332,44 +453,61 @@ public class Hologram { } /** - * Sets the hologram to appear at this location + * Change the location of the hologram. + * + * @param newLocation the location to which to teleport the hologram. + * + * @return the original hologram object. */ - public Hologram setLocation(Location newLocation) { + public Hologram setLocation(Location newLocation) + { _makeSpawnPackets = true; Location oldLocation = getLocation(); _location = newLocation.clone(); - if (getEntityFollowing() != null) { + if (getEntityFollowing() != null) + { relativeToEntity = _location.clone().subtract(getEntityFollowing().getLocation()).toVector(); } - if (isInUse()) { + + if (isInUse()) + { ArrayList canSee = getNearbyPlayers(); Iterator itel = _playersTracking.iterator(); - while (itel.hasNext()) { + while (itel.hasNext()) + { Player player = itel.next(); - if (!canSee.contains(player)) { + if (!canSee.contains(player)) + { itel.remove(); - if (player.getWorld() == getLocation().getWorld()) { + if (player.getWorld() == getLocation().getWorld()) + { UtilPlayer.sendPacket(player, getDestroyPacket()); } } } + itel = canSee.iterator(); checkSpawnPackets(); - while (itel.hasNext()) { + + while (itel.hasNext()) + { Player player = itel.next(); - if (!_playersTracking.contains(player)) { + if (!_playersTracking.contains(player)) + { _playersTracking.add(player); itel.remove(); UtilPlayer.sendPacket(player, UtilPlayer.is1_9(player) ? _packets1_9 : _packets1_8); } } - if (!canSee.isEmpty()) { + + if (!canSee.isEmpty()) + { _lastMovement.add(new Vector(newLocation.getX() - oldLocation.getX(), newLocation.getY() - oldLocation.getY(), newLocation.getZ() - oldLocation.getZ())); @@ -381,9 +519,12 @@ public class Hologram { int i = 0; - if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { + if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) + { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); - for (Integer entityId : _entityIds) { + + for (Integer entityId : _entityIds) + { PacketPlayOutEntity.PacketPlayOutRelEntityMove relMove = new PacketPlayOutEntity.PacketPlayOutRelEntityMove(); relMove.a = entityId; @@ -394,13 +535,16 @@ public class Hologram { packets1_8[i] = relMove; i++; } - } else { + } + else + { x = (int) Math.floor(32 * newLocation.getX()); z = (int) Math.floor(32 * newLocation.getZ()); _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - for (Integer entityId : _entityIds) { + for (Integer entityId : _entityIds) + { PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); teleportPacket.a = entityId; teleportPacket.b = x; @@ -413,61 +557,93 @@ public class Hologram { } } - for (Player player : canSee) { - for (Packet packet : packets1_8) { + for (Player player : canSee) + { + for (Packet packet : packets1_8) + { UtilPlayer.sendPacket(player, packet); } } } } + return this; } + /** + * @return the time at which the hologram was last started. + */ public long getStartTime() { return _startTime; } + /** + * @return the max time after the hologram was started for which it will live. + */ public long getMaxLifetime() { return _maxLifetime; } - public Hologram setRemoveOnEntityDeath() { + /** + * Set the hologram to stop when the entity it is following dies. + * + * @return the original hologram object. + */ + public Hologram setRemoveOnEntityDeath() + { _removeEntityDeath = true; return this; } - public boolean isEntityId(int entityId) { + /** + * @param entityId an entity id. + * + * @return whether the entity ID is represented by this hologram object. + */ + public boolean isEntityId(int entityId) + { return _entityIds.contains(entityId); } /** * Set the hologram text + * + * @param newLines array of text lines for the hologram to display. + * + * @return the original hologram object. */ - public Hologram setText(String... newLines) { + public Hologram setText(String... newLines) + { String[] newText = new String[newLines.length]; - for (int i = 0; i < newText.length; i++) { + for (int i = 0; i < newText.length; i++) + { newText[i] = newLines[newText.length - (i + 1)]; } if (newText.equals(_hologramText)) + { return this; + } - if (isInUse()) { + if (isInUse()) + { int[] destroy1_8 = new int[0]; - ArrayList packets1_8 = new ArrayList(); + ArrayList packets1_8 = new ArrayList<>(); ArrayList packets1_9 = new ArrayList<>(); - if (_hologramText.length != newText.length) { + if (_hologramText.length != newText.length) + { _makeDestroyPackets = true; } - for (int i = 0; i < Math.max(_hologramText.length, newText.length); i++) { - // If more lines than previously - if (i >= _hologramText.length) { + for (int i = 0; i < Math.max(_hologramText.length, newText.length); i++) + { + if (i >= _hologramText.length) // If more lines than previously + { // Add entity id and send spawn packets // You add a entity id because the new hologram needs int entityId = UtilEnt.getNewEntityId(); @@ -476,14 +652,16 @@ public class Hologram { packets1_8.add(makeSpawnPacket1_8(i, entityId, newText[i])); packets1_9.add(makeSpawnPacket1_9(i, entityId, newText[i])); } - // If less lines than previously - else if (i >= newText.length) { + else if (i >= newText.length) // If less lines than previously + { // Remove entity id and send destroy packets Integer entityId = _entityIds.remove(newText.length); destroy1_8 = Arrays.copyOf(destroy1_8, destroy1_8.length + 1); destroy1_8[destroy1_8.length - 1] = entityId; - } else if (!newText[i].equals(_hologramText[i])) { + } + else if (!newText[i].equals(_hologramText[i])) + { // Send update metadata packets Integer entityId = _entityIds.get(i); @@ -495,10 +673,12 @@ public class Hologram { watcher1_8.a(2, newText[i], EntityArmorStand.META_CUSTOMNAME, newText[i]); watcher1_8.a(3, (byte) 1, EntityArmorStand.META_CUSTOMNAME_VISIBLE, true); } + { watcher1_9.a(0, (byte) 32, EntityArmorStand.META_ENTITYDATA, (byte) 32); watcher1_9.a(2, newText[i], EntityArmorStand.META_CUSTOMNAME, newText[i]); watcher1_9.a(3, (byte) 1, EntityArmorStand.META_CUSTOMNAME_VISIBLE, true); + if (_hideBoundingBox) { watcher1_9.a(10, (byte) 16, EntityArmorStand.META_ARMOR_OPTION, (byte) 16); @@ -510,13 +690,16 @@ public class Hologram { } } - if (destroy1_8.length > 0) { + if (destroy1_8.length > 0) + { packets1_8.add(new PacketPlayOutEntityDestroy(destroy1_8)); packets1_9.add(new PacketPlayOutEntityDestroy(destroy1_8)); } - for (Player player : _playersTracking) { + for (Player player : _playersTracking) + { List packets = UtilPlayer.is1_9(player) ? packets1_9 : packets1_8; + for (Packet packet : packets) { UtilPlayer.sendPacket(player, packet); @@ -532,18 +715,26 @@ public class Hologram { /** * Set the distance the hologram is viewable from. Default is 70 + * + * @param newDistance The distance in blocks. + * + * @return the original hologram object. */ - public Hologram setViewDistance(int newDistance) { + public Hologram setViewDistance(int newDistance) + { _viewDistance = newDistance; return setLocation(getLocation()); } /** - * Start the hologram + * Start the hologram, displaying it to players. + * + * @return the original hologram object. */ - public Hologram start() { - if (!isInUse()) { - + public Hologram start() + { + if (!isInUse()) + { _startTime = System.currentTimeMillis(); _hologramManager.addHologram(this); @@ -553,9 +744,13 @@ public class Hologram { _lastMovement = new Vector(); } + return this; } + /** + * Sends hologram spawn packets to players. + */ private void sendPackets() { checkSpawnPackets(); @@ -566,6 +761,13 @@ public class Hologram { } } + /** + * Generates spawn packets based on minecraft version. + * + * @param player The player for which to generate the packets. + * + * @return the list of packets generated. + */ public Packet[] getSpawnPackets(Player player) { checkSpawnPackets(); @@ -574,13 +776,19 @@ public class Hologram { } /** - * Stop the hologram + * Stop the hologram, effectively destroying it once + * garbage collection has occurred. + * + * @return the original hologram object. */ - public Hologram stop() { - if (isInUse()) { + public Hologram stop() + { + if (isInUse()) + { _hologramManager.removeHologram(this); - for (Player player : _playersTracking) { + for (Player player : _playersTracking) + { UtilPlayer.sendPacket(player, getDestroyPacket()); } @@ -591,4 +799,11 @@ public class Hologram { return this; } + /** + * Enum defining to whom the hologram is displayed. + */ + public enum HologramTarget + { + BLACKLIST, WHITELIST + } } From 98929f043fd93dc59ef23b39c4537f2dec37e972 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 16:27:29 -0500 Subject: [PATCH 164/170] Make brush types varied and colored in player hotbars --- .../gadget/gadgets/morph/MorphBobRoss.java | 112 +++++++++--------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java index 57735951c..0c7a51ee3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -64,15 +64,53 @@ public class MorphBobRoss extends MorphGadget /** The number of seconds for which quotes are displayed */ private static final int QUOTE_PERSISTENCE = 9; - /** Quote attribution for bob */ - private static final String ATTRIBUTION = C.cGray + "- " + C.cYellow + "Bob Ross"; - /** Cooldown key for changing paint colors */ private static final String COLOR_KEY = "Change Paint Color"; /** Cooldown key for cleaning and putting paint on the brush */ private static final String PAINT_KEY = "Beat The Devil Out Of It"; + /** Cooldown key for displaying a Bob Ross quote above head */ + private static final String QUOTE_KEY = "Bob Ross Quote"; + + /** Quote attribution for bob */ + private static final String ATTRIBUTION = C.cGray + "- " + C.cYellow + "Bob Ross"; + + /** Formatted name for the clean brush */ + private static final String BRUSH_NAME = C.cYellow + "Clean Paintbrush"; + + /** Paint colors for displaying in players' hotbars */ + private static final String[] PAINT_COLORS = { + C.cBlackB + "Midnight Black", + C.cRedB + "Alizarin Crimson", + C.cDGreenB + "Sap Green", + C.cGoldB + "Van Dyke Brown", + C.cDBlueB + "Prussian Blue", + C.cDPurpleB + "Studio Purple", + C.cDAquaB + "Phthalo Green", + C.cGrayB + "Dusty Gray", + C.cDGrayB + "Tundora Gray", + C.cPurpleB + "Soft Flower Pink", + C.cGreenB + "Lima Green", + C.cYellowB + "Cadmium Yellow", + C.cBlueB + "Danube Blue", + C.cPurpleB + "Soft Magenta", + C.cGoldB + "Yellow Ochre", + C.cWhiteB + "Titanium White" + }; + + /** Brush types for displaying in players' hotbars */ + private static final String[] PAINT_BRUSHES = { + "Landscape Brush", + "Foliage Brush", + "Background Brush", + "Blender Brush", + "Oval Brush", + "Round Brush", + "Fan Brush", + "Painting Knife" + }; + /** List of wholesome Bob Ross quotes. */ private static final String[][] QUOTES = { {"We don't make mistakes,", "just happy little accidents."}, @@ -133,6 +171,9 @@ public class MorphBobRoss extends MorphGadget /** Blocks that have been painted */ private final List _paintBlocks = new ArrayList<>(); + /** Hologram quotes that are currently above players' heads */ + private final Map> _spokenQuotes = new HashMap<>(); + private final HologramManager _holograms; public MorphBobRoss(GadgetManager manager, HologramManager holograms) @@ -146,7 +187,8 @@ public class MorphBobRoss extends MorphGadget C.cGreen + "Right click " + C.cWhite + "on your " + C.cYellow + "Paint" + C.cWhite + " (dyes) to stop painting", "", C.cGreen + "Left click " + C.cWhite + "on your " + C.cYellow + "Paint " + C.cWhite + "to change paintbrush colors.", - + "", + C.cWhite + "Hold " + C.cGreen + " crouch " + C.cWhite + "to say a Bob Ross quote." }, LineFormat.LORE), -14, Material.PAINTING, (byte) 0, YearMonth.of(2017, Month.JUNE)); _holograms = holograms; @@ -349,7 +391,10 @@ public class MorphBobRoss extends MorphGadget byte data = item.getData().getData(); data++; if (data > 15) data = 0; - ItemStack newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, getPaintColor(data) + " Paintbrush"); + + ItemStack newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, + PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); + _inventoryItems.put(player.getUniqueId(), newItem); player.getInventory().remove(item); player.getInventory().setItem(PAINT_BRUSH_SLOT, newItem); @@ -367,11 +412,12 @@ public class MorphBobRoss extends MorphGadget if (item.getType() == Material.STICK) { byte data = ((byte) ThreadLocalRandom.current().nextInt(0, 16)); - newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, getPaintColor(data) + " Paintbrush"); + newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, + PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); } else { - newItem = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, "Clean Paintbrush"); + newItem = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, BRUSH_NAME); } _inventoryItems.put(player.getUniqueId(), newItem); @@ -387,7 +433,7 @@ public class MorphBobRoss extends MorphGadget { if (!_inventoryItems.containsKey(player.getUniqueId())) { - ItemStack item = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, "Clean Paintbrush"); + ItemStack item = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, BRUSH_NAME); player.getInventory().setItem(PAINT_BRUSH_SLOT, item); _inventoryItems.put(player.getUniqueId(), item); player.updateInventory(); @@ -414,56 +460,6 @@ public class MorphBobRoss extends MorphGadget } } - /** - * Returns a paint color name base mainly on Bob Ross's common color selections, - * and on standard paint color names when the former is not available. - * - * @param color The data value of the dye for which to get a name. - * - * @return A string with a paint name - */ - private String getPaintColor(byte color) - { - switch(color) - { - case 0: - return "Midnight Black"; - case 1: - return "Alizarin Crimson"; - case 2: - return "Sap Green"; - case 3: - return "Van Dyke Brown"; - case 4: - return "Prussian Blue"; - case 5: - return "Studio Purple"; - case 6: - return "Phthalo Green"; - case 7: - return "Dusty Gray"; - case 8: - return "Tundora Gray"; - case 9: - return "Soft Flower Pink"; - case 10: - return "Lima Green"; - case 11: - return "Cadmium Yellow"; - case 12: - return "Danube Blue"; - case 13: - return "Soft Magenta"; - case 14: - return "Yellow Ochre"; - case 15: - return "Titanium White"; - default: - return "Mystery"; - - } - } - /** * Data class holding information on blocks which have been painted */ From a61c4cd816c6c1678fa52155fd5b80c684ae6dfb Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 17:29:48 -0500 Subject: [PATCH 165/170] Fix holograms not following players in 1.9+ --- .../src/mineplex/core/hologram/Hologram.java | 77 ++++++++++++------- .../core/hologram/HologramManager.java | 1 + 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index 56b4b6cb3..880190c79 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -34,7 +34,7 @@ public class Hologram { /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ - private ArrayList _entityIds = new ArrayList(); + private ArrayList _entityIds = new ArrayList<>(); private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; @@ -50,7 +50,7 @@ public class Hologram { private Packet[] _packets1_8; private Packet[] _packets1_9; private HashSet _playersInList = new HashSet<>(); - private ArrayList _playersTracking = new ArrayList(); + private ArrayList _playersTracking = new ArrayList<>(); private boolean _removeEntityDeath; private HologramTarget _target = HologramTarget.BLACKLIST; private int _viewDistance = 70; @@ -70,7 +70,7 @@ public class Hologram { */ public Hologram(HologramManager hologramManager, Location location, String... text) { - this(hologramManager, location, false, -1l, text); + this(hologramManager, location, false, -1L, text); } /** @@ -83,7 +83,7 @@ public class Hologram { */ public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) { - this(hologramManager, location, hideBoundingBox, -1l, text); + this(hologramManager, location, hideBoundingBox, -1L, text); } /** @@ -431,9 +431,14 @@ public class Hologram { * * @return the original hologram object. */ - public Hologram setFollowEntity(Entity entityToFollow) { + public Hologram setFollowEntity(Entity entityToFollow) + { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null : _location.clone().subtract(entityToFollow.getLocation()).toVector(); + + if (entityToFollow != null) + { + relativeToEntity = _location.clone().subtract(entityToFollow.getLocation()).toVector(); + } return this; } @@ -447,7 +452,8 @@ public class Hologram { * * @retuen the original hologram object. */ - public Hologram setHologramTarget(HologramTarget newTarget) { + public Hologram setHologramTarget(HologramTarget newTarget) + { _target = newTarget; return this; } @@ -516,9 +522,32 @@ public class Hologram { int z = (int) Math.floor(32 * _lastMovement.getZ()); Packet[] packets1_8 = new Packet[_hologramText.length]; + Packet[] packets1_9 = new Packet[_hologramText.length]; int i = 0; + // Generate packets for 1.9 clients + x = (int) Math.floor(32 * newLocation.getX()); + z = (int) Math.floor(32 * newLocation.getZ()); + + _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); + + for (Integer entityId : _entityIds) + { + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); + teleportPacket.a = entityId; + teleportPacket.b = x; + teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); + teleportPacket.d = z; + + packets1_9[i] = teleportPacket; + + i++; + } + + i = 0; + + // Generate move packets for 1.8 clients if the move is small enough. if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); @@ -536,32 +565,26 @@ public class Hologram { i++; } } - else + else // Use teleport packets { - x = (int) Math.floor(32 * newLocation.getX()); - z = (int) Math.floor(32 * newLocation.getZ()); - - _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - - for (Integer entityId : _entityIds) - { - PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); - teleportPacket.a = entityId; - teleportPacket.b = x; - teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); - teleportPacket.d = z; - - packets1_8[i] = teleportPacket; - - i++; - } + packets1_8 = packets1_9; } for (Player player : canSee) { - for (Packet packet : packets1_8) + if (UtilPlayer.is1_9(player)) { - UtilPlayer.sendPacket(player, packet); + for (Packet packet : packets1_9) + { + UtilPlayer.sendPacket(player, packet); + } + } + else + { + for (Packet packet : packets1_8) + { + UtilPlayer.sendPacket(player, packet); + } } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index a68ce5944..88f6547cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -81,6 +81,7 @@ public class HologramManager extends MiniPlugin implements IPacketHandler hologram.stop(); continue; } + if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) { // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. From 6b2a99a8810cb19ae6f584ecbfbe3d3f90f5fca4 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 17:30:56 -0500 Subject: [PATCH 166/170] Make quotes be activated with a shift click --- .../gadget/gadgets/morph/MorphBobRoss.java | 83 ++++++++++--------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java index 0c7a51ee3..bbc296896 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -55,24 +55,33 @@ public class MorphBobRoss extends MorphGadget /** The # of minutes for which paint blocks exist */ private static final int PAINT_MINUTES = 1; - /** Likelihood that a quote will be shown above a player every certain number of seconds */ - private static final double QUOTE_CHANCE = 0.03; - /** Height above a player's location at which quotes are to be displayed */ - private static final double QUOTE_HEIGHT = 2.12; + private static final double QUOTE_HEIGHT = 2.25; /** The number of seconds for which quotes are displayed */ - private static final int QUOTE_PERSISTENCE = 9; + private static final int QUOTE_PERSISTENCE = 10; /** Cooldown key for changing paint colors */ private static final String COLOR_KEY = "Change Paint Color"; + /** Cooldown time for changing paint colors (milliseconds) */ + private static final long COLOR_COOLDOWN = 220; + /** Cooldown key for cleaning and putting paint on the brush */ private static final String PAINT_KEY = "Beat The Devil Out Of It"; + /** Cooldown time for cleaning and putting paint on the brush (milliseconds) */ + private static final long PAINT_COOLDOWN = 700; + /** Cooldown key for displaying a Bob Ross quote above head */ private static final String QUOTE_KEY = "Bob Ross Quote"; + /** Cooldown time for displaying a Bob Ross quote (milliseconds) */ + private static final long QUOTE_COOLDOWN = 10100; + + /** Distance (in blocks) from which the quotes can be seen */ + private static final int VIEW_DISTANCE = 14; + /** Quote attribution for bob */ private static final String ATTRIBUTION = C.cGray + "- " + C.cYellow + "Bob Ross"; @@ -171,9 +180,6 @@ public class MorphBobRoss extends MorphGadget /** Blocks that have been painted */ private final List _paintBlocks = new ArrayList<>(); - /** Hologram quotes that are currently above players' heads */ - private final Map> _spokenQuotes = new HashMap<>(); - private final HologramManager _holograms; public MorphBobRoss(GadgetManager manager, HologramManager holograms) @@ -188,7 +194,7 @@ public class MorphBobRoss extends MorphGadget "", C.cGreen + "Left click " + C.cWhite + "on your " + C.cYellow + "Paint " + C.cWhite + "to change paintbrush colors.", "", - C.cWhite + "Hold " + C.cGreen + " crouch " + C.cWhite + "to say a Bob Ross quote." + C.cGreen + "Crouch " + C.cWhite + "to say a Bob Ross quote." }, LineFormat.LORE), -14, Material.PAINTING, (byte) 0, YearMonth.of(2017, Month.JUNE)); _holograms = holograms; @@ -248,14 +254,14 @@ public class MorphBobRoss extends MorphGadget if (UtilEvent.isAction(event, UtilEvent.ActionType.L)) { - if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, 220, false, false)) + if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, COLOR_COOLDOWN, false, false)) { changePaintColor(event.getPlayer()); } } else if (UtilEvent.isAction(event, UtilEvent.ActionType.R)) { - if (Recharge.Instance.use(event.getPlayer(), PAINT_KEY, 1000, false, false)) + if (Recharge.Instance.use(event.getPlayer(), PAINT_KEY, PAINT_COOLDOWN, false, false)) { togglePainting(event.getPlayer()); } @@ -263,7 +269,7 @@ public class MorphBobRoss extends MorphGadget } /** - * Randomly display a Bob Ross quote above morphed players' heads. + * Display a Bob Ross quote above players' heads when they sneak. * Destroy old paint after a certain amount of time has elapsed. */ @EventHandler @@ -288,38 +294,41 @@ public class MorphBobRoss extends MorphGadget limit++; } } - else if (event.getType() == UpdateType.SEC_30) // do random quote displaying + else if (event.getType() == UpdateType.TICK) // do random quote displaying { for (Player player : getActive()) { - if (Math.random() >= QUOTE_CHANCE) + if (player.isSneaking()) { - // select quote - String[] quote = QUOTES[ThreadLocalRandom.current().nextInt(0, QUOTES.length)]; - final Collection holograms = new ArrayList<>(); - - // add attribution - holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT, 0), ATTRIBUTION)); - - // display the quote - double offset = 0.3; - for (int i = quote.length - 1; i >= 0; --i) + if (Recharge.Instance.use(player, QUOTE_KEY, QUOTE_COOLDOWN, false, false)) { - holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT + offset, 0), - C.cWhite + quote[i])); - offset += 0.25; - } + // select quote + String[] quote = QUOTES[ThreadLocalRandom.current().nextInt(0, QUOTES.length)]; + final Collection holograms = new ArrayList<>(); - for (Hologram hologram : holograms) - { - hologram.setViewDistance(18); - hologram.setFollowEntity(player); - hologram.start(); - } + // add attribution + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT, 0), ATTRIBUTION)); - // remove hologram a certain number of seconds later - Bukkit.getServer().getScheduler().runTaskLater(UtilServer.getPlugin(), () -> - holograms.forEach(Hologram::stop), QUOTE_PERSISTENCE * 20); + // display the quote + double offset = 0.3; + for (int i = quote.length - 1; i >= 0; --i) + { + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT + offset, 0), + C.cWhite + quote[i])); + offset += 0.25; + } + + for (Hologram hologram : holograms) + { + hologram.setViewDistance(VIEW_DISTANCE); + hologram.setFollowEntity(player); + hologram.start(); + } + + // remove hologram a certain number of seconds later + Bukkit.getServer().getScheduler().runTaskLater(UtilServer.getPlugin(), () -> + holograms.forEach(Hologram::stop), QUOTE_PERSISTENCE * 20); + } } } } From 9c48919e4263939714929302d8b49a50b6272306 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 17:58:53 -0500 Subject: [PATCH 167/170] Reduce paint time down to 30 seconds --- .../core/gadget/gadgets/morph/MorphBobRoss.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java index bbc296896..8a2a18b4d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -53,7 +53,7 @@ public class MorphBobRoss extends MorphGadget private static final int DESTROY_LIMIT = 20; /** The # of minutes for which paint blocks exist */ - private static final int PAINT_MINUTES = 1; + private static final int PAINT_SECONDS = 30; /** Height above a player's location at which quotes are to be displayed */ private static final double QUOTE_HEIGHT = 2.25; @@ -278,20 +278,26 @@ public class MorphBobRoss extends MorphGadget if (event.getType() == UpdateType.FASTER) // do paint removal { int limit = 0; + int offset = 0; // destroy up to 20 paint blocks that are older than a set number of minutes while (!_paintBlocks.isEmpty() - && _paintBlocks.get(0).time < System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(PAINT_MINUTES) + && offset < _paintBlocks.size() + && _paintBlocks.get(offset).time < System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(PAINT_SECONDS) && limit < DESTROY_LIMIT) { - Block block = _paintBlocks.remove(0).block; + Block block = _paintBlocks.get(0).block; if (block.getType() == Material.CARPET) { + _paintBlocks.remove(0); block.setType(Material.AIR); + limit++; + } + else + { + offset++; } - - limit++; } } else if (event.getType() == UpdateType.TICK) // do random quote displaying From cf8109b3bd17bf2afaef6ad7840977c7d965dfec Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 20:00:00 -0500 Subject: [PATCH 168/170] Add method for detecting bottom slabs to UtilBlock --- .../mineplex/core/common/util/UtilBlock.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index 91c93c620..acfa65274 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java @@ -378,7 +378,45 @@ public class UtilBlock { return fullSolid.contains(block); } - + + /** + * Determines whether a block is a bottom slab. + * + * @param block The block object. + * + * @return true if block is a bottom slab. + */ + public static boolean bottomSlab(Block block) + { + return bottomSlab(block.getType().getId(), block.getData()); + } + + /** + * Determines whether a block is a bottom slab. + * + * @param block The block id + * @param data The block data + * + * @return true if block is a bottom slab. + */ + public static boolean bottomSlab(int block, byte data) + { + switch (block) + { + case 44: + if (data >= 0 && data <= 7) return true; + break; + case 182: + if (data == 0) return true; + break; + case 126: + if (data >= 0 && data <= 5) return true; + break; + } + + return false; + } + public static boolean usable(Block block) { if (block == null) return false; From a87685eae0ed497719f3ee7e5b66a536a0a0e974 Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 20:00:28 -0500 Subject: [PATCH 169/170] Change color selector and put colors in order --- .../gadget/gadgets/morph/MorphBobRoss.java | 174 ++++++++++++++---- 1 file changed, 143 insertions(+), 31 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java index 8a2a18b4d..7217d82c6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -13,6 +13,7 @@ import java.util.concurrent.TimeUnit; import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilText; @@ -28,6 +29,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import com.mojang.authlib.GameProfile; @@ -49,12 +51,15 @@ public class MorphBobRoss extends MorphGadget /** The inventory slot in which the paint brush is placed */ private static final int PAINT_BRUSH_SLOT = 2; - /** Max # of blocks that can be destroyed every half second */ - private static final int DESTROY_LIMIT = 20; + /** Max # of blocks that can be destroyed every quarter second, per player */ + private static final int DESTROY_LIMIT = 4; - /** The # of minutes for which paint blocks exist */ + /** The # of seconds for which paint blocks exist */ private static final int PAINT_SECONDS = 30; + /** The # of minutes after which the code will stop trying to remove paint */ + private static final int PAINT_EXPIRE = 10; + /** Height above a player's location at which quotes are to be displayed */ private static final double QUOTE_HEIGHT = 2.25; @@ -67,12 +72,6 @@ public class MorphBobRoss extends MorphGadget /** Cooldown time for changing paint colors (milliseconds) */ private static final long COLOR_COOLDOWN = 220; - /** Cooldown key for cleaning and putting paint on the brush */ - private static final String PAINT_KEY = "Beat The Devil Out Of It"; - - /** Cooldown time for cleaning and putting paint on the brush (milliseconds) */ - private static final long PAINT_COOLDOWN = 700; - /** Cooldown key for displaying a Bob Ross quote above head */ private static final String QUOTE_KEY = "Bob Ross Quote"; @@ -88,6 +87,26 @@ public class MorphBobRoss extends MorphGadget /** Formatted name for the clean brush */ private static final String BRUSH_NAME = C.cYellow + "Clean Paintbrush"; + /** Determines the order in which colors are selected */ + private static final byte[] COLOR_ORDER = { + (byte) 1, + (byte) 14, + (byte) 11, + (byte) 10, + (byte) 2, + (byte) 6, + (byte) 12, + (byte) 4, + (byte) 5, + (byte) 13, + (byte) 9, + (byte) 15, + (byte) 7, + (byte) 8, + (byte) 0, + (byte) 3 + }; + /** Paint colors for displaying in players' hotbars */ private static final String[] PAINT_COLORS = { C.cBlackB + "Midnight Black", @@ -146,7 +165,7 @@ public class MorphBobRoss extends MorphGadget {"The only thing worse than", "yellow snow is green snow."}, {"Look around.", "Look at what we have.", "Beauty is everywhere—", "you only have to look to see it."}, {"Just go out and talk to a tree.", "Make friends with it."}, - {"How do you make a round circle with a square knife? That’s your challenge for the day."}, + {"How do you make a round circle with a square knife?", "That’s your challenge for the day."}, {"Water's like me. It's laaazy...", "Boy, it always looks for the easiest way to do things"}, {"Oooh, if you have never been to Alaska,", "go there while it is still wild."}, {"If I paint something,", "I don't want to have to explain what it is."}, @@ -177,6 +196,8 @@ public class MorphBobRoss extends MorphGadget /** Map of items in players' inventories */ private final Map _inventoryItems = new HashMap<>(); + private final Map _paintColors = new HashMap<>(); + /** Blocks that have been painted */ private final List _paintBlocks = new ArrayList<>(); @@ -188,11 +209,11 @@ public class MorphBobRoss extends MorphGadget C.cGray + "Become the creator of your own world!", C.cGray + "Leave a trail of paint behind you as you walk.", "", - C.cGreen + "Right click " + C.cWhite + "on your " + C.cYellow + "Paintbrush" + C.cWhite + " (stick) to paint", + C.cGreen + "Hold " + C.cWhite + "your " + C.cYellow + "paintbrush" + C.cWhite + " (stick) to paint.", "", - C.cGreen + "Right click " + C.cWhite + "on your " + C.cYellow + "Paint" + C.cWhite + " (dyes) to stop painting", - "", - C.cGreen + "Left click " + C.cWhite + "on your " + C.cYellow + "Paint " + C.cWhite + "to change paintbrush colors.", + C.cGreen + "Left" + C.cWhite + " and " + C.cGreen + "right click" + C.cWhite + " on your", + C.cYellow + "paintbrush" + C.cWhite + " and " + C.cYellow + "paints" + C.cWhite + " (dyes)", + C.cWhite + "to change paint colors.", "", C.cGreen + "Crouch " + C.cWhite + "to say a Bob Ross quote." }, LineFormat.LORE), -14, Material.PAINTING, (byte) 0, YearMonth.of(2017, Month.JUNE)); @@ -256,14 +277,14 @@ public class MorphBobRoss extends MorphGadget { if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, COLOR_COOLDOWN, false, false)) { - changePaintColor(event.getPlayer()); + changePaintColor(event.getPlayer(), true); } } else if (UtilEvent.isAction(event, UtilEvent.ActionType.R)) { - if (Recharge.Instance.use(event.getPlayer(), PAINT_KEY, PAINT_COOLDOWN, false, false)) + if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, COLOR_COOLDOWN, false, false)) { - togglePainting(event.getPlayer()); + changePaintColor(event.getPlayer(), false); } } } @@ -280,27 +301,35 @@ public class MorphBobRoss extends MorphGadget int limit = 0; int offset = 0; - // destroy up to 20 paint blocks that are older than a set number of minutes + // destroy paint blocks that are too old while (!_paintBlocks.isEmpty() && offset < _paintBlocks.size() && _paintBlocks.get(offset).time < System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(PAINT_SECONDS) - && limit < DESTROY_LIMIT) + && limit < DESTROY_LIMIT * getActive().size()) { - Block block = _paintBlocks.get(0).block; + Block block = _paintBlocks.get(offset).block; if (block.getType() == Material.CARPET) { - _paintBlocks.remove(0); + _paintBlocks.remove(offset); block.setType(Material.AIR); limit++; } else { - offset++; + // stop trying to remove paint after a certain amount of time + if (_paintBlocks.get(offset).time > System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(PAINT_EXPIRE)) + { + _paintBlocks.remove(offset); + } + else + { + offset++; + } } } } - else if (event.getType() == UpdateType.TICK) // do random quote displaying + else if (event.getType() == UpdateType.TICK) // do quote displaying { for (Player player : getActive()) { @@ -338,6 +367,25 @@ public class MorphBobRoss extends MorphGadget } } } + else if (event.getType() == UpdateType.FASTEST) + { + for (Player player : getActive()) + { + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.get(player.getUniqueId()); + + if (item.getType() == Material.STICK && player.getItemInHand().equals(item)) + { + togglePainting(player); + } + else if (!player.getItemInHand().equals(item) && item.getType() != Material.STICK) + { + togglePainting(player); + } + } + } + } } /** @@ -364,12 +412,12 @@ public class MorphBobRoss extends MorphGadget } Block block = player.getLocation().getBlock(); - Material down = block.getRelative(BlockFace.DOWN).getType(); + Block down = block.getRelative(BlockFace.DOWN); boolean carpet = block.getType() == Material.CARPET; // check that there is room to paint and that the block below is solid and not more paint. - if ((block.isEmpty() || carpet) && down.isSolid() && down != Material.CARPET) + if ((block.isEmpty() || carpet) && UtilBlock.fullSolid(down) && !UtilBlock.bottomSlab(down)) { int index; PaintedBlock blk = new PaintedBlock(block); @@ -398,14 +446,28 @@ public class MorphBobRoss extends MorphGadget } /** - * Cycle the selected paint color for a player. + * Clean hash maps on player disconnect. */ - private void changePaintColor(Player player) + @EventHandler + public void onPlayerDisconnect(PlayerQuitEvent event) + { + if (isActive(event.getPlayer())) + { + UUID uuid = event.getPlayer().getUniqueId(); + _inventoryItems.remove(uuid); + _paintColors.remove(uuid); + } + } + + /** + * Cycle the selected paint color for a player. + * + * @param reverse Whether to cycle backwards through colors. + */ + private void changePaintColor(Player player, boolean reverse) { ItemStack item = _inventoryItems.remove(player.getUniqueId()); - byte data = item.getData().getData(); - data++; - if (data > 15) data = 0; + byte data = selectPaintColor(player, reverse); ItemStack newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); @@ -426,12 +488,17 @@ public class MorphBobRoss extends MorphGadget ItemStack newItem; if (item.getType() == Material.STICK) { - byte data = ((byte) ThreadLocalRandom.current().nextInt(0, 16)); + byte data = selectPaintColor(player, false); newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); } else { + if (_paintColors.containsKey(player.getUniqueId())) + { + _paintColors.remove(player.getUniqueId()); + } + newItem = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, BRUSH_NAME); } @@ -441,6 +508,51 @@ public class MorphBobRoss extends MorphGadget player.updateInventory(); } + /** + * Changes the paint color currently assigned to a player. + * If one is not assigned, a new one will be given. + * + * @param player The player to whom to assign the paint color. + * @param reverse Whether to reverse through paint colors when choosing a new one. + * + * @return the dye data value for the newly selected color. + */ + private byte selectPaintColor(Player player, boolean reverse) + { + UUID uuid = player.getUniqueId(); + + int value; + + if (!_paintColors.containsKey(uuid)) + { + value = ThreadLocalRandom.current().nextInt(0, 16); + _paintColors.put(uuid, value); + } + else + { + value = _paintColors.get(uuid); + + if (reverse) + { + if (--value < 0) + { + value = 15; + } + } + else + { + if (++value > 15) + { + value = 0; + } + } + + _paintColors.put(uuid, value); + } + + return COLOR_ORDER[value]; + } + /** * Give a paintbrush item to a player. */ From 6e2d39035de488a805db08a547d25ea96be18567 Mon Sep 17 00:00:00 2001 From: cnr Date: Tue, 30 May 2017 22:50:41 -0500 Subject: [PATCH 170/170] Add Bob Ross morph to PPC for June --- .../src/mineplex/core/powerplayclub/PowerPlayClubRewards.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java index 1857154fc..02388b67c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java @@ -38,6 +38,7 @@ public class PowerPlayClubRewards .put(YearMonth.of(2017, Month.MARCH), new UnknownSalesPackageItem("Gold Pot Morph")) .put(YearMonth.of(2017, Month.APRIL), new UnknownSalesPackageItem("Bumblebee's Wings")) .put(YearMonth.of(2017, Month.MAY), new UnknownSalesPackageItem("King")) + .put(YearMonth.of(2017, Month.JUNE), new UnknownSalesPackageItem("Bob Ross Morph")) .build(); public interface PowerPlayClubItem